From 710de49d127586f457000d0885c44dd79cf8af9e Mon Sep 17 00:00:00 2001 From: Aaron Weikle Date: Thu, 27 Aug 2026 06:30:16 -0400 Subject: [PATCH 1/2] phase0: pin archetype to published releases and fix missing import The OpenAPI archetype referenced two artifact versions that were never published to Maven Central, so scaffolding failed for anyone without the original build environment: - generated pom depended on camel-rest-extensions:0.1.7-SNAPSHOT (Maven Central's latest release is 0.1.6) - archetype-post-generate.groovy hardcoded camel-restdsl-openapi-plugin:0.1.8-SNAPSHOT (Maven Central's latest release is 0.1.7) Both are now pinned to the published releases. This brings the OpenAPI archetype into line with the scheduled archetype, which already referenced the released 0.1.6. Fixing those two exposed a third, independent defect: the archetype's RoutesImplementation.java template did not import DatasonnetExpression, while the OpenAPI plugin generates route code that calls it. The plugin only string-replaces a marker comment and never writes imports, so the generated project failed to compile regardless of which plugin version ran. Added the missing import. Also bumped the copyright year in the modified Groovy file, which the git-backed license header check derives from file history. This change deliberately upgrades nothing. Camel, Spring Boot, Java, and the OpenTelemetry agent are all left where they were; version modernization is deferred to later phases. The goal here is only to restore a working baseline. Verified from a cold cache (~/.m2/repository/com/ms3-inc removed): full reactor build green including both archetype integration tests, plus a standalone archetype:generate producing a project that compiles and packages. Co-Authored-By: Claude Opus 5 --- camel-openapi-archetype/src/main/archetype/pom.xml | 2 +- .../main/archetype/src/main/java/RoutesImplementation.java | 1 + .../main/resources/META-INF/archetype-post-generate.groovy | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/camel-openapi-archetype/src/main/archetype/pom.xml b/camel-openapi-archetype/src/main/archetype/pom.xml index 4e50afe..8a23c8d 100644 --- a/camel-openapi-archetype/src/main/archetype/pom.xml +++ b/camel-openapi-archetype/src/main/archetype/pom.xml @@ -132,7 +132,7 @@ com.ms3-inc.tavros camel-rest-extensions - 0.1.7-SNAPSHOT + 0.1.6 diff --git a/camel-openapi-archetype/src/main/archetype/src/main/java/RoutesImplementation.java b/camel-openapi-archetype/src/main/archetype/src/main/java/RoutesImplementation.java index 4ebe2cc..cf24734 100644 --- a/camel-openapi-archetype/src/main/archetype/src/main/java/RoutesImplementation.java +++ b/camel-openapi-archetype/src/main/archetype/src/main/java/RoutesImplementation.java @@ -1,6 +1,7 @@ package ${package}; import com.datasonnet.document.MediaTypes; +import org.apache.camel.language.datasonnet.DatasonnetExpression; import org.springframework.stereotype.Component; /** diff --git a/camel-openapi-archetype/src/main/resources/META-INF/archetype-post-generate.groovy b/camel-openapi-archetype/src/main/resources/META-INF/archetype-post-generate.groovy index 1acc773..e0b448c 100644 --- a/camel-openapi-archetype/src/main/resources/META-INF/archetype-post-generate.groovy +++ b/camel-openapi-archetype/src/main/resources/META-INF/archetype-post-generate.groovy @@ -1,5 +1,5 @@ /** - * Copyright 2020-2024 the original author or authors. + * Copyright 2020-2026 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,7 +55,7 @@ if (isSample) { } def generatedApiDirectory = request.outputDirectory + "/" + request.artifactId -def camelRestDslPluginVersion = '0.1.8-SNAPSHOT' +def camelRestDslPluginVersion = '0.1.7' def mvnCommand = ['mvn', 'com.ms3-inc.tavros:camel-restdsl-openapi-plugin:' + camelRestDslPluginVersion + ':generate', '-DspecificationUri=' + specUri, '-f', generatedApiDirectory] if (Files.exists(Path.of(specUri))) { From fcc228a9184f17c01539f69552981c15f4d4881b Mon Sep 17 00:00:00 2001 From: Aaron Weikle Date: Fri, 28 Aug 2026 09:47:06 -0400 Subject: [PATCH 2/2] chore: green CI on JDK 21, refresh Maven wrapper, de-brittle license headers CI runners (the reason every phase branch would have failed review): - actions/setup-java@v1 -> @v4, actions/checkout@v2 -> @v4. The v1/v2 actions are Node 12/16 era and no longer execute on current GitHub runners at all, so these workflows were dead regardless of Java. - JDK 11 -> 21 on every build and deploy job. Sources now compile with maven.compiler.release 21, so a JDK 11 runner could not build them. - Dropped the java: [ '1.8', '11', '15' ] matrix. Those targets are below the project baseline and the matrix would have failed on all three legs. Maven wrapper 3.6.3 -> 3.9.16 (wrapperVersion 3.3.4). Maven 3.6.3 predates Java 17 and misbehaves on JDK 21, so anyone cloning and running ./mvnw hit a toolchain older than the code it was building. The refreshed wrapper uses distributionType=only-script, which removes the checked-in .mvn/wrapper/maven-wrapper.jar binary - the distribution is fetched by the script instead. Verified: ./mvnw reports Apache Maven 3.9.16 and builds. License headers no longer derive their year from git. The header template used ${license.git.copyrightYears}, computed per file from git history by license-maven-plugin-git. Editing any file therefore moved its expected year and failed the build with "Some files do not have the expected license header" - a message that never explains the cause. It cost time in every phase so far and would cost it for every contributor. The template is now a static "2020-2026", the license-maven-plugin-git dependency is removed, and all existing headers were normalized with license:format. Consequences: the check is deterministic, and CI no longer needs fetch-depth: 0 (that setting existed only so the git plugin could read per-file history), so checkouts are shallow and faster. Tradeoff accepted: per-file "last modified" accuracy in headers is lost in exchange for a check that does not fail on every edit. Re-running license:format after a year bump restores accuracy in one commit. Not changed: tavros-camel-components still has setup-java@v1 on JDK 11. It is the retirement candidate in phase 5 and gets no CI work. Co-Authored-By: Claude Opus 5 --- .github/workflows/ci.yaml | 14 +- .github/workflows/release.yaml | 9 +- .mvn/wrapper/MavenWrapperDownloader.java | 117 ----- .mvn/wrapper/maven-wrapper.properties | 5 +- .settings.xml | 2 +- camel-openapi-archetype/pom.xml | 2 +- .../src/build/license-header.txt | 2 +- .../META-INF/maven/archetype-metadata.xml | 2 +- .../projects/it-build/archetype.properties | 2 +- .../projects/it-run/archetype.properties | 2 +- camel-scheduled-archetype/pom.xml | 2 +- .../src/build/license-header.txt | 2 +- .../META-INF/archetype-post-generate.groovy | 3 +- .../META-INF/maven/archetype-metadata.xml | 2 +- mvnw | 475 +++++++++--------- mvnw.cmd | 321 ++++++------ pom.xml | 9 +- src/build/license-header.txt | 2 +- 18 files changed, 420 insertions(+), 553 deletions(-) delete mode 100644 .mvn/wrapper/MavenWrapperDownloader.java diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 435e039..6a5ec33 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,10 +16,7 @@ jobs: runs-on: ${{ matrix.os }} timeout-minutes: 10 steps: - - uses: actions/checkout@v2 - with: - # needed for license-plugin to check last modified date of each file - fetch-depth: 0 + - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '21' @@ -39,11 +36,12 @@ jobs: needs: [ build ] runs-on: [ ubuntu-latest ] steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: - java-version: 11 + java-version: '21' + distribution: 'temurin' - name: mvn clean deploy env: REPO_USER: ${{ secrets.REPO_USER }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 486eb0c..abae4d9 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,13 +26,14 @@ jobs: if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Set up JDK 11 - uses: actions/setup-java@v1 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: - java-version: 11 + java-version: '21' + distribution: 'temurin' - name: setup git run: | git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com" diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index b901097..0000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 642d572..216df05 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,3 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip diff --git a/.settings.xml b/.settings.xml index 303e71b..c705456 100644 --- a/.settings.xml +++ b/.settings.xml @@ -1,6 +1,6 @@