From 87f2d532e6998afd4e7f8aa3c792e1dba1c0fc0b Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Tue, 10 Mar 2026 20:19:44 +0100 Subject: [PATCH 01/10] Migrate to maven-shade-plugin for the CLI --- cli/pom.xml | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index ae984c44..1f441da8 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -37,27 +37,41 @@ org.apache.maven.plugins - maven-assembly-plugin + maven-shade-plugin + 3.6.2 - - + false + ${project.build.directory}/roseau-${project.version}.jar + + + io.github.alien.roseau.cli.RoseauCLI - true - - - true - - - - jar-with-dependencies - + + ${project.name} + ${project.version} + true + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + - make-assembly + shade-distribution package - single + shade From 906640f9d5640db53fe4d0f3e3462ccdd573d9db Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Tue, 10 Mar 2026 20:50:01 +0100 Subject: [PATCH 02/10] Automatically set roseau version for CLI --version --- cli/pom.xml | 10 +++++++ .../io/github/alien/roseau/cli/RoseauCLI.java | 26 +++++++++++++++++-- cli/src/main/version/roseau-version.txt | 1 + .../alien/roseau/cli/RoseauCLITest.java | 8 ++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 cli/src/main/version/roseau-version.txt diff --git a/cli/pom.xml b/cli/pom.xml index 1f441da8..5788e197 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -15,6 +15,16 @@ jar + + + src/main/resources + false + + + src/main/version + true + + org.apache.maven.plugins diff --git a/cli/src/main/java/io/github/alien/roseau/cli/RoseauCLI.java b/cli/src/main/java/io/github/alien/roseau/cli/RoseauCLI.java index 027c6f39..f367336f 100644 --- a/cli/src/main/java/io/github/alien/roseau/cli/RoseauCLI.java +++ b/cli/src/main/java/io/github/alien/roseau/cli/RoseauCLI.java @@ -18,6 +18,8 @@ import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; @@ -351,10 +353,30 @@ static void main(String[] args) { } static final class VersionProvider implements CommandLine.IVersionProvider { + private static final String VERSION_RESOURCE = "/roseau-version.txt"; + @Override public String[] getVersion() { - String impl = Optional.ofNullable(Roseau.class.getPackage().getImplementationVersion()).orElse("0.6.0-SNAPSHOT"); - return new String[]{"Roseau " + impl}; + return new String[]{"Roseau " + resolveVersion()}; + } + + static String resolveVersion() { + return Optional.ofNullable(RoseauCLI.class.getPackage().getImplementationVersion()) + .or(VersionProvider::readVersionResource) + .orElse("unknown"); + } + + private static Optional readVersionResource() { + try (InputStream in = RoseauCLI.class.getResourceAsStream(VERSION_RESOURCE)) { + if (in == null) { + return Optional.empty(); + } + + String version = new String(in.readAllBytes(), StandardCharsets.UTF_8).trim(); + return version.isEmpty() ? Optional.empty() : Optional.of(version); + } catch (IOException e) { + return Optional.empty(); + } } } } diff --git a/cli/src/main/version/roseau-version.txt b/cli/src/main/version/roseau-version.txt new file mode 100644 index 00000000..ad96e7cf --- /dev/null +++ b/cli/src/main/version/roseau-version.txt @@ -0,0 +1 @@ +${project.version} diff --git a/cli/src/test/java/io/github/alien/roseau/cli/RoseauCLITest.java b/cli/src/test/java/io/github/alien/roseau/cli/RoseauCLITest.java index b33f8589..cd0fc08b 100644 --- a/cli/src/test/java/io/github/alien/roseau/cli/RoseauCLITest.java +++ b/cli/src/test/java/io/github/alien/roseau/cli/RoseauCLITest.java @@ -36,6 +36,14 @@ void no_mode() { assertThat(exitCode).isEqualTo(ExitCode.ERROR.code()); } + @Test + void version_uses_build_version() { + var exitCode = cmd.execute("--version"); + + assertThat(out.toString()).contains("Roseau 0.6.0-SNAPSHOT"); + assertThat(exitCode).isEqualTo(ExitCode.SUCCESS.code()); + } + // --- Diffs --- // @Test void simple_source_diff() { From a0a4e4a2a62b43198ba4e7ac51d2de76fefb1cd4 Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Tue, 10 Mar 2026 20:58:04 +0100 Subject: [PATCH 03/10] Build sources and javadoc for published artifacts and disable central-publishing-maven-plugin --- cli/pom.xml | 4 +++ combinatorial/pom.xml | 6 ++++- core/pom.xml | 4 +++ maven-plugin/pom.xml | 8 ++++++ pom.xml | 60 ++++++++++--------------------------------- 5 files changed, 34 insertions(+), 48 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 5788e197..72b40ed3 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -34,6 +34,10 @@ org.apache.maven.plugins maven-javadoc-plugin + + org.apache.maven.plugins + maven-source-plugin + org.apache.maven.plugins maven-jar-plugin diff --git a/combinatorial/pom.xml b/combinatorial/pom.xml index aac1085f..5b6131f5 100644 --- a/combinatorial/pom.xml +++ b/combinatorial/pom.xml @@ -13,6 +13,10 @@ roseau-combinatorial Combinatorial Benchmark + + true + + @@ -91,4 +95,4 @@ 4.7.7 - \ No newline at end of file + diff --git a/core/pom.xml b/core/pom.xml index b9059a6c..47aca55c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -31,6 +31,10 @@ org.apache.maven.plugins maven-javadoc-plugin + + org.apache.maven.plugins + maven-source-plugin + diff --git a/maven-plugin/pom.xml b/maven-plugin/pom.xml index 87481b93..113329a2 100644 --- a/maven-plugin/pom.xml +++ b/maven-plugin/pom.xml @@ -23,6 +23,14 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-source-plugin + org.apache.maven.plugins maven-plugin-plugin diff --git a/pom.xml b/pom.xml index 2afedc95..3ed78bd3 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,19 @@ + + org.apache.maven.plugins + maven-source-plugin + 3.4.0 + + + attach-sources + + jar-no-fork + + + + org.apache.maven.plugins maven-jar-plugin @@ -75,53 +88,6 @@ - - - publish-sonatype - - - - org.sonatype.central - central-publishing-maven-plugin - 0.10.0 - true - - central - roseau-combinatorial - - - - org.apache.maven.plugins - maven-source-plugin - 3.4.0 - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 3.2.8 - - - sign-artifacts - verify - - sign - - - - - - - - - From cef79ad4bf4a08e79667fa6bb55d76a4bcba8f42 Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Tue, 10 Mar 2026 21:48:51 +0100 Subject: [PATCH 04/10] Basic JReleaser configuration --- jreleaser.yml | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 jreleaser.yml diff --git a/jreleaser.yml b/jreleaser.yml new file mode 100644 index 00000000..ba1d82b0 --- /dev/null +++ b/jreleaser.yml @@ -0,0 +1,91 @@ +project: + name: roseau + description: Fast and accurate API breaking change analysis of Java libraries + longDescription: | + Roseau detects binary and source breaking changes between two versions of a + Java library. It can compare JAR files or source trees and publish reports + suitable for local use, CI, and release automation. + authors: + - Thomas Degueule + - Jean-Remy Falleri + - Corentin Latappy + license: MIT + inceptionYear: 2023 + stereotype: CLI + snapshot: + label: early-access + fullChangelog: true + links: + homepage: https://github.com/alien-tools/roseau + documentation: https://alien-tools.github.io/roseau/ + bugTracker: https://github.com/alien-tools/roseau/issues + languages: + java: + groupId: io.github.alien-tools + artifactId: roseau-cli + version: 25 + mainClass: io.github.alien.roseau.cli.RoseauCLI + multiProject: true + +release: + github: + owner: alien-tools + name: roseau + overwrite: true + +checksum: + algorithms: + - SHA-256 + +signing: + active: ALWAYS + pgp: + active: ALWAYS + armored: true + +deploy: + maven: + mavenCentral: + release-deploy: + active: RELEASE + url: https://central.sonatype.com/api/v1/publisher + namespace: '{{Env.JRELEASER_MAVENCENTRAL_NAMESPACE}}' + stagingRepositories: + - target/staging-deploy + nexus2: + snapshot-deploy: + active: SNAPSHOT + snapshotUrl: https://central.sonatype.com/repository/maven-snapshots/ + username: '{{Env.JRELEASER_MAVENCENTRAL_USERNAME}}' + password: '{{Env.JRELEASER_MAVENCENTRAL_TOKEN}}' + applyMavenCentralRules: true + snapshotSupported: true + stagingRepositories: + - target/staging-deploy + +distributions: + roseau: + type: SINGLE_JAR + stereotype: CLI + artifacts: + - path: cli/target/roseau-{{projectVersion}}.jar + +assemble: + jlink: + roseau-standalone: + active: ALWAYS + exported: true + stereotype: CLI + executable: roseau + imageName: roseau-{{projectVersion}} + mainJar: + path: cli/target/roseau-{{projectVersion}}.jar + targetJdks: + - path: '{{Env.ROSEAU_JLINK_LINUX_X86_64_JDK}}' + platform: linux-x86_64 + - path: '{{Env.ROSEAU_JLINK_OSX_X86_64_JDK}}' + platform: osx-x86_64 + - path: '{{Env.ROSEAU_JLINK_OSX_AARCH64_JDK}}' + platform: osx-aarch_64 + - path: '{{Env.ROSEAU_JLINK_WINDOWS_X86_64_JDK}}' + platform: windows-x86_64 From 5990f4b7ed68702fe73f12c4e19164541ae68203 Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Tue, 10 Mar 2026 22:14:32 +0100 Subject: [PATCH 05/10] Add jlink support for the CLI and bind it with jreleaser --- cli/pom.xml | 18 ++++++++++++++++ jreleaser.yml | 9 +++++++- .../roseau-standalone/jlink/LICENSE | 21 +++++++++++++++++++ .../roseau-standalone/jlink/README.md.tpl | 16 ++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/jreleaser/assemblers/roseau-standalone/jlink/LICENSE create mode 100644 src/jreleaser/assemblers/roseau-standalone/jlink/README.md.tpl diff --git a/cli/pom.xml b/cli/pom.xml index 72b40ed3..3a05f8b6 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -49,6 +49,24 @@ + + org.apache.maven.plugins + maven-dependency-plugin + 3.8.1 + + + copy-jlink-dependencies + package + + copy-dependencies + + + runtime + ${project.build.directory}/jlink-jars + + + + org.apache.maven.plugins maven-shade-plugin diff --git a/jreleaser.yml b/jreleaser.yml index ba1d82b0..541383ea 100644 --- a/jreleaser.yml +++ b/jreleaser.yml @@ -78,8 +78,15 @@ assemble: stereotype: CLI executable: roseau imageName: roseau-{{projectVersion}} + jdeps: + multiRelease: "25" + ignoreMissingDeps: true + targets: + - cli/target/roseau-cli-{{projectVersion}}.jar mainJar: - path: cli/target/roseau-{{projectVersion}}.jar + path: cli/target/roseau-cli-{{projectVersion}}.jar + jars: + - pattern: cli/target/jlink-jars/*.jar targetJdks: - path: '{{Env.ROSEAU_JLINK_LINUX_X86_64_JDK}}' platform: linux-x86_64 diff --git a/src/jreleaser/assemblers/roseau-standalone/jlink/LICENSE b/src/jreleaser/assemblers/roseau-standalone/jlink/LICENSE new file mode 100644 index 00000000..2f14d305 --- /dev/null +++ b/src/jreleaser/assemblers/roseau-standalone/jlink/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Roseau + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/jreleaser/assemblers/roseau-standalone/jlink/README.md.tpl b/src/jreleaser/assemblers/roseau-standalone/jlink/README.md.tpl new file mode 100644 index 00000000..3f499cf9 --- /dev/null +++ b/src/jreleaser/assemblers/roseau-standalone/jlink/README.md.tpl @@ -0,0 +1,16 @@ +# Roseau {{projectVersion}} + +This archive contains the standalone Roseau CLI together with a bundled Java runtime. +No separate Java installation is required. + +## Usage + +- macOS and Linux: `bin/{{distributionExecutable}} --help` +- Windows: `bin\{{distributionExecutable}}.bat --help` + +## Examples + +- Show the CLI version: `bin/{{distributionExecutable}} --version` +- Compare two libraries: `bin/{{distributionExecutable}} --diff --v1 old.jar --v2 new.jar` + +Use the shaded JAR release instead if you need a JVM-based fallback for an unsupported platform. From a0b54f0a9f455c3759f8cddaf2e09a22bd5030c4 Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Tue, 10 Mar 2026 23:00:32 +0100 Subject: [PATCH 06/10] Migrate build-main.yml workflow --- .github/workflows/build-main.yml | 147 ++++++++++++++++++++++++++----- jreleaser.yml | 13 +-- 2 files changed, 130 insertions(+), 30 deletions(-) diff --git a/.github/workflows/build-main.yml b/.github/workflows/build-main.yml index 4eb7061a..e6d4cc46 100644 --- a/.github/workflows/build-main.yml +++ b/.github/workflows/build-main.yml @@ -1,11 +1,9 @@ -name: Maven Build & Test (main) +name: Publish snapshots from main on: push: branches: - main - schedule: - - cron: '0 0 * * *' workflow_dispatch: concurrency: @@ -13,29 +11,26 @@ concurrency: cancel-in-progress: true jobs: - build: + stage: + name: Build, test, and stage Maven artifacts + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest permissions: contents: read checks: write - timeout-minutes: 30 + timeout-minutes: 45 steps: - uses: actions/checkout@v6 + with: + fetch-depth: 0 - name: Set up JDK 25 uses: actions/setup-java@v5 with: java-version: '25' distribution: 'temurin' cache: 'maven' - server-id: central - server-username: MAVEN_USERNAME - server-password: MAVEN_CENTRAL_TOKEN - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - gpg-passphrase: MAVEN_GPG_PASSPHRASE - - name: Build with Maven - run: ./mvnw --batch-mode -DskipTests package - name: Run tests - id: tests + id: verify continue-on-error: true run: ./mvnw --batch-mode verify - name: Build tests report @@ -43,16 +38,126 @@ jobs: if: always() with: name: Maven Tests - path: '**/target/surefire-reports/*.xml' + path: | + **/target/surefire-reports/*.xml + **/target/failsafe-reports/*.xml reporter: java-junit fail-on-error: true - name: Fail if tests failed - if: steps.tests.outcome == 'failure' + if: steps.verify.outcome == 'failure' run: exit 1 - - name: Publish SNAPSHOT - if: ${{ success() && github.event_name == 'push' }} - run: ./mvnw --batch-mode -DskipTests -Ppublish-sonatype deploy + - name: Stage Maven artifacts + run: ./mvnw --batch-mode -DskipTests deploy -DaltDeploymentRepository=local::default::file:target/staging-deploy + - name: Archive Maven staging repository + run: tar -C target -czf target/maven-staging.tar.gz staging-deploy + - name: Upload Maven staging repository + uses: actions/upload-artifact@v4 + with: + name: maven-staging + path: target/maven-staging.tar.gz + if-no-files-found: error + - name: Upload shaded CLI JAR + uses: actions/upload-artifact@v4 + with: + name: single-jar + path: cli/target/roseau-*.jar + if-no-files-found: error + + assemble-jlink: + name: Assemble jlink ${{ matrix.platform }} + needs: stage + if: github.ref == 'refs/heads/main' + runs-on: ${{ matrix.runner }} + permissions: + contents: read + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-latest + platform: linux-x86_64 + - runner: macos-15-intel + platform: osx-x86_64 + - runner: macos-latest + platform: osx-aarch_64 + - runner: windows-latest + platform: windows-x86_64 + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: 'maven' + - name: Build CLI artifacts + shell: bash + run: ./mvnw --batch-mode -pl cli -am -DskipTests clean package + - name: Assemble jlink archive + shell: bash + run: ROSEAU_JLINK_JDK="$JAVA_HOME" ROSEAU_JLINK_PLATFORM="${{ matrix.platform }}" ./mvnw --batch-mode -N org.jreleaser:jreleaser-maven-plugin:1.22.0:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true -Djreleaser.yolo=true + env: + JRELEASER_GITHUB_TOKEN: dummy + JRELEASER_GPG_SECRET_KEY: dummy + JRELEASER_GPG_PASSPHRASE: dummy + JRELEASER_MAVENCENTRAL_USERNAME: dummy + JRELEASER_MAVENCENTRAL_TOKEN: dummy + JRELEASER_MAVENCENTRAL_NAMESPACE: io.github.alien-tools + - name: Upload jlink archive + uses: actions/upload-artifact@v4 + with: + name: jlink-${{ matrix.platform }} + path: target/jreleaser/assemble/roseau-standalone/jlink/*.zip + if-no-files-found: error + + publish: + name: Publish Maven snapshots and rolling prerelease + needs: + - stage + - assemble-jlink + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + permissions: + contents: write + timeout-minutes: 30 + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: 'maven' + - name: Download Maven staging repository + uses: actions/download-artifact@v5 + with: + name: maven-staging + path: target + - name: Restore Maven staging repository + run: tar -C target -xzf target/maven-staging.tar.gz + - name: Download shaded CLI JAR + uses: actions/download-artifact@v5 + with: + name: single-jar + path: cli/target + - name: Download jlink archives + uses: actions/download-artifact@v5 + with: + pattern: jlink-* + merge-multiple: true + path: target/jreleaser/assemble/roseau-standalone/jlink + - name: Publish snapshots with JReleaser + run: ROSEAU_JLINK_JDK="$JAVA_HOME" ROSEAU_JLINK_PLATFORM=linux-x86_64 ./mvnw --batch-mode -N org.jreleaser:jreleaser-maven-plugin:1.22.0:release -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true -Djreleaser.yolo=true env: - MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }} - MAVEN_CENTRAL_TOKEN: ${{ secrets.NEXUS_PASSWORD }} - MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.NEXUS_USERNAME }} + JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.NEXUS_PASSWORD }} + JRELEASER_MAVENCENTRAL_NAMESPACE: io.github.alien-tools diff --git a/jreleaser.yml b/jreleaser.yml index 541383ea..c4ccfed1 100644 --- a/jreleaser.yml +++ b/jreleaser.yml @@ -42,6 +42,7 @@ signing: pgp: active: ALWAYS armored: true + verify: true deploy: maven: @@ -87,12 +88,6 @@ assemble: path: cli/target/roseau-cli-{{projectVersion}}.jar jars: - pattern: cli/target/jlink-jars/*.jar - targetJdks: - - path: '{{Env.ROSEAU_JLINK_LINUX_X86_64_JDK}}' - platform: linux-x86_64 - - path: '{{Env.ROSEAU_JLINK_OSX_X86_64_JDK}}' - platform: osx-x86_64 - - path: '{{Env.ROSEAU_JLINK_OSX_AARCH64_JDK}}' - platform: osx-aarch_64 - - path: '{{Env.ROSEAU_JLINK_WINDOWS_X86_64_JDK}}' - platform: windows-x86_64 + jdk: + path: '{{Env.ROSEAU_JLINK_JDK}}' + platform: '{{Env.ROSEAU_JLINK_PLATFORM}}' From 27514255442db49a924c8e55bf7cba1c006b90ff Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Wed, 11 Mar 2026 00:09:16 +0100 Subject: [PATCH 07/10] Finalize jreleaser configuration for build-main.yml --- .github/workflows/build-main.yml | 22 ++++++---------------- jreleaser.yml | 7 +++---- pom.xml | 6 ++++++ 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-main.yml b/.github/workflows/build-main.yml index e6d4cc46..2bcd85b3 100644 --- a/.github/workflows/build-main.yml +++ b/.github/workflows/build-main.yml @@ -29,9 +29,7 @@ jobs: java-version: '25' distribution: 'temurin' cache: 'maven' - - name: Run tests - id: verify - continue-on-error: true + - name: Verify build run: ./mvnw --batch-mode verify - name: Build tests report uses: dorny/test-reporter@v2 @@ -43,11 +41,8 @@ jobs: **/target/failsafe-reports/*.xml reporter: java-junit fail-on-error: true - - name: Fail if tests failed - if: steps.verify.outcome == 'failure' - run: exit 1 - name: Stage Maven artifacts - run: ./mvnw --batch-mode -DskipTests deploy -DaltDeploymentRepository=local::default::file:target/staging-deploy + run: ./mvnw --batch-mode -DskipTests deploy -DaltDeploymentRepository=local::file:target/staging-deploy - name: Archive Maven staging repository run: tar -C target -czf target/maven-staging.tar.gz staging-deploy - name: Upload Maven staging repository @@ -98,14 +93,9 @@ jobs: run: ./mvnw --batch-mode -pl cli -am -DskipTests clean package - name: Assemble jlink archive shell: bash - run: ROSEAU_JLINK_JDK="$JAVA_HOME" ROSEAU_JLINK_PLATFORM="${{ matrix.platform }}" ./mvnw --batch-mode -N org.jreleaser:jreleaser-maven-plugin:1.22.0:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true -Djreleaser.yolo=true + run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" env: - JRELEASER_GITHUB_TOKEN: dummy - JRELEASER_GPG_SECRET_KEY: dummy - JRELEASER_GPG_PASSPHRASE: dummy - JRELEASER_MAVENCENTRAL_USERNAME: dummy - JRELEASER_MAVENCENTRAL_TOKEN: dummy - JRELEASER_MAVENCENTRAL_NAMESPACE: io.github.alien-tools + JRELEASER_GITHUB_TOKEN: ${{ github.token }} - name: Upload jlink archive uses: actions/upload-artifact@v4 with: @@ -152,9 +142,9 @@ jobs: merge-multiple: true path: target/jreleaser/assemble/roseau-standalone/jlink - name: Publish snapshots with JReleaser - run: ROSEAU_JLINK_JDK="$JAVA_HOME" ROSEAU_JLINK_PLATFORM=linux-x86_64 ./mvnw --batch-mode -N org.jreleaser:jreleaser-maven-plugin:1.22.0:release -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true -Djreleaser.yolo=true + run: ./mvnw --batch-mode -N jreleaser:release -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true env: - JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + JRELEASER_GITHUB_TOKEN: ${{ github.token }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_PRIVATE_KEY }} JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} diff --git a/jreleaser.yml b/jreleaser.yml index c4ccfed1..7c55bce5 100644 --- a/jreleaser.yml +++ b/jreleaser.yml @@ -46,6 +46,8 @@ signing: deploy: maven: + pomchecker: + failOnWarning: false mavenCentral: release-deploy: active: RELEASE @@ -80,7 +82,7 @@ assemble: executable: roseau imageName: roseau-{{projectVersion}} jdeps: - multiRelease: "25" + multiRelease: 25 ignoreMissingDeps: true targets: - cli/target/roseau-cli-{{projectVersion}}.jar @@ -88,6 +90,3 @@ assemble: path: cli/target/roseau-cli-{{projectVersion}}.jar jars: - pattern: cli/target/jlink-jars/*.jar - jdk: - path: '{{Env.ROSEAU_JLINK_JDK}}' - platform: '{{Env.ROSEAU_JLINK_PLATFORM}}' diff --git a/pom.xml b/pom.xml index 3ed78bd3..3bb8a8a0 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ 25 + 1.23.0 ${java.version} ${java.version} ${java.version} @@ -30,6 +31,11 @@ + + org.jreleaser + jreleaser-maven-plugin + ${jreleaser.version} + org.apache.maven.plugins maven-compiler-plugin From 66adccdb8cb96e664f16c0d5dc9d027c89d8836b Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Wed, 11 Mar 2026 09:06:33 +0100 Subject: [PATCH 08/10] Use full-release to publish SNAPSHOTs, migrate release.yml workflow to jreleaser --- .github/workflows/build-main.yml | 13 ++- .github/workflows/release.yml | 145 +++++++++++++++++++++++-------- jreleaser.yml | 5 -- 3 files changed, 115 insertions(+), 48 deletions(-) diff --git a/.github/workflows/build-main.yml b/.github/workflows/build-main.yml index 2bcd85b3..5e9b8e7c 100644 --- a/.github/workflows/build-main.yml +++ b/.github/workflows/build-main.yml @@ -55,7 +55,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: single-jar - path: cli/target/roseau-*.jar + path: cli/target/roseau-[0-9]*.jar if-no-files-found: error assemble-jlink: @@ -93,9 +93,7 @@ jobs: run: ./mvnw --batch-mode -pl cli -am -DskipTests clean package - name: Assemble jlink archive shell: bash - run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" - env: - JRELEASER_GITHUB_TOKEN: ${{ github.token }} + run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" - name: Upload jlink archive uses: actions/upload-artifact@v4 with: @@ -142,12 +140,11 @@ jobs: merge-multiple: true path: target/jreleaser/assemble/roseau-standalone/jlink - name: Publish snapshots with JReleaser - run: ./mvnw --batch-mode -N jreleaser:release -Djreleaser.config.file=jreleaser.yml -Djreleaser.git.root.search=true + run: ./mvnw --batch-mode -N jreleaser:full-release env: JRELEASER_GITHUB_TOKEN: ${{ github.token }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_PRIVATE_KEY }} JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.NEXUS_USERNAME }} - JRELEASER_MAVENCENTRAL_TOKEN: ${{ secrets.NEXUS_PASSWORD }} - JRELEASER_MAVENCENTRAL_NAMESPACE: io.github.alien-tools + JRELEASER_NEXUS2_SNAPSHOT_DEPLOY_USERNAME: ${{ secrets.NEXUS_USERNAME }} + JRELEASER_NEXUS2_SNAPSHOT_DEPLOY_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04592ff3..85f65274 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,60 +1,135 @@ -name: Publish release to Sonatype Central +name: Publish release from tag on: - release: - types: [ published ] + push: + tags: + - 'v*' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: - verify: - name: Verify on ${{ matrix.os }} - runs-on: ${{ matrix.os }} + stage: + name: Build, test, and stage Maven artifacts + runs-on: ubuntu-latest + permissions: + contents: read + timeout-minutes: 45 + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: 'maven' + - name: Verify build + run: ./mvnw --batch-mode verify + - name: Stage Maven artifacts + run: ./mvnw --batch-mode -DskipTests deploy -DaltDeploymentRepository=local::file:target/staging-deploy + - name: Archive Maven staging repository + run: tar -C target -czf target/maven-staging.tar.gz staging-deploy + - name: Upload Maven staging repository + uses: actions/upload-artifact@v4 + with: + name: maven-staging + path: target/maven-staging.tar.gz + if-no-files-found: error + - name: Upload shaded CLI JAR + uses: actions/upload-artifact@v4 + with: + name: single-jar + path: cli/target/roseau-[0-9]*.jar + if-no-files-found: error + + assemble-jlink: + name: Assemble jlink ${{ matrix.platform }} + needs: stage + runs-on: ${{ matrix.runner }} + permissions: + contents: read + timeout-minutes: 30 strategy: fail-fast: false matrix: include: - - os: ubuntu-latest - wrapper: ./mvnw - - os: windows-latest - wrapper: .\mvnw.cmd - timeout-minutes: 30 - permissions: - contents: read + - runner: ubuntu-latest + platform: linux-x86_64 + - runner: macos-15-intel + platform: osx-x86_64 + - runner: macos-latest + platform: osx-aarch_64 + - runner: windows-latest + platform: windows-x86_64 steps: - uses: actions/checkout@v6 - - name: Set up Java 25 + with: + fetch-depth: 0 + - name: Set up JDK 25 uses: actions/setup-java@v5 with: java-version: '25' distribution: 'temurin' cache: 'maven' - - name: Verify build - run: ${{ matrix.wrapper }} --batch-mode verify - env: - # Ensure UTF-8 (Windows might not) - MAVEN_OPTS: -Dfile.encoding=UTF-8 + - name: Build CLI artifacts + shell: bash + run: ./mvnw --batch-mode -pl cli -am -DskipTests clean package + - name: Assemble jlink archive + shell: bash + run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" + - name: Upload jlink archive + uses: actions/upload-artifact@v4 + with: + name: jlink-${{ matrix.platform }} + path: target/jreleaser/assemble/roseau-standalone/jlink/*.zip + if-no-files-found: error publish: - name: Publish new version on Sonatype Central + name: Publish release with JReleaser + needs: + - stage + - assemble-jlink runs-on: ubuntu-latest - needs: verify - if: ${{ needs.verify.result == 'success' }} - timeout-minutes: 30 permissions: - contents: read + contents: write + timeout-minutes: 30 steps: - uses: actions/checkout@v6 - - uses: actions/setup-java@v5 + with: + fetch-depth: 0 + - name: Set up JDK 25 + uses: actions/setup-java@v5 with: java-version: '25' distribution: 'temurin' - server-id: central - server-username: MAVEN_USERNAME - server-password: MAVEN_CENTRAL_TOKEN - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - gpg-passphrase: MAVEN_GPG_PASSPHRASE - - name: Publish package - run: ./mvnw --batch-mode -Ppublish-sonatype -DskipTests deploy + cache: 'maven' + - name: Download Maven staging repository + uses: actions/download-artifact@v5 + with: + name: maven-staging + path: target + - name: Restore Maven staging repository + run: tar -C target -xzf target/maven-staging.tar.gz + - name: Download shaded CLI JAR + uses: actions/download-artifact@v5 + with: + name: single-jar + path: cli/target + - name: Download jlink archives + uses: actions/download-artifact@v5 + with: + pattern: jlink-* + merge-multiple: true + path: target/jreleaser/assemble/roseau-standalone/jlink + - name: Publish release with JReleaser + run: ./mvnw --batch-mode -N jreleaser:full-release env: - MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }} - MAVEN_CENTRAL_TOKEN: ${{ secrets.NEXUS_PASSWORD }} - MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + JRELEASER_GITHUB_TOKEN: ${{ github.token }} + JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_USERNAME: ${{ secrets.NEXUS_USERNAME }} + JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} diff --git a/jreleaser.yml b/jreleaser.yml index 7c55bce5..26aad20a 100644 --- a/jreleaser.yml +++ b/jreleaser.yml @@ -46,21 +46,16 @@ signing: deploy: maven: - pomchecker: - failOnWarning: false mavenCentral: release-deploy: active: RELEASE url: https://central.sonatype.com/api/v1/publisher - namespace: '{{Env.JRELEASER_MAVENCENTRAL_NAMESPACE}}' stagingRepositories: - target/staging-deploy nexus2: snapshot-deploy: active: SNAPSHOT snapshotUrl: https://central.sonatype.com/repository/maven-snapshots/ - username: '{{Env.JRELEASER_MAVENCENTRAL_USERNAME}}' - password: '{{Env.JRELEASER_MAVENCENTRAL_TOKEN}}' applyMavenCentralRules: true snapshotSupported: true stagingRepositories: From 6876d1b06d9b51d6b74459ba071f31a74c362329 Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Wed, 11 Mar 2026 09:37:50 +0100 Subject: [PATCH 09/10] Explicitly pass jreleaser.yml to the maven plug-in --- .github/workflows/build-main.yml | 4 ++-- .github/workflows/release.yml | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-main.yml b/.github/workflows/build-main.yml index 5e9b8e7c..b6414e89 100644 --- a/.github/workflows/build-main.yml +++ b/.github/workflows/build-main.yml @@ -93,7 +93,7 @@ jobs: run: ./mvnw --batch-mode -pl cli -am -DskipTests clean package - name: Assemble jlink archive shell: bash - run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" + run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" - name: Upload jlink archive uses: actions/upload-artifact@v4 with: @@ -140,7 +140,7 @@ jobs: merge-multiple: true path: target/jreleaser/assemble/roseau-standalone/jlink - name: Publish snapshots with JReleaser - run: ./mvnw --batch-mode -N jreleaser:full-release + run: ./mvnw --batch-mode -N jreleaser:full-release -Djreleaser.config.file=jreleaser.yml env: JRELEASER_GITHUB_TOKEN: ${{ github.token }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 85f65274..d0ef354c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,7 +79,7 @@ jobs: run: ./mvnw --batch-mode -pl cli -am -DskipTests clean package - name: Assemble jlink archive shell: bash - run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" + run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" - name: Upload jlink archive uses: actions/upload-artifact@v4 with: @@ -125,7 +125,7 @@ jobs: merge-multiple: true path: target/jreleaser/assemble/roseau-standalone/jlink - name: Publish release with JReleaser - run: ./mvnw --batch-mode -N jreleaser:full-release + run: ./mvnw --batch-mode -N jreleaser:full-release -Djreleaser.config.file=jreleaser.yml env: JRELEASER_GITHUB_TOKEN: ${{ github.token }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} @@ -133,3 +133,6 @@ jobs: JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_USERNAME: ${{ secrets.NEXUS_USERNAME }} JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} + JRELEASER_HOMEBREW_GITHUB_TOKEN: ${{ secrets.HOMEBREW_TAP_GITHUB_TOKEN }} + JRELEASER_SDKMAN_CONSUMER_KEY: ${{ secrets.SDKMAN_CONSUMER_KEY }} + JRELEASER_SDKMAN_CONSUMER_TOKEN: ${{ secrets.SDKMAN_CONSUMER_TOKEN }} From 554183efb2837c9aa826745484a30edb1c0361cd Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Wed, 11 Mar 2026 10:49:54 +0100 Subject: [PATCH 10/10] Finalize jreleaser configuration --- .github/workflows/build-main.yml | 6 +++--- .github/workflows/release.yml | 15 ++++++--------- combinatorial/pom.xml | 2 ++ jreleaser.yml | 6 ++++-- pom.xml | 1 + 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build-main.yml b/.github/workflows/build-main.yml index b6414e89..a20e01c0 100644 --- a/.github/workflows/build-main.yml +++ b/.github/workflows/build-main.yml @@ -46,13 +46,13 @@ jobs: - name: Archive Maven staging repository run: tar -C target -czf target/maven-staging.tar.gz staging-deploy - name: Upload Maven staging repository - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: maven-staging path: target/maven-staging.tar.gz if-no-files-found: error - name: Upload shaded CLI JAR - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: single-jar path: cli/target/roseau-[0-9]*.jar @@ -95,7 +95,7 @@ jobs: shell: bash run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" - name: Upload jlink archive - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: jlink-${{ matrix.platform }} path: target/jreleaser/assemble/roseau-standalone/jlink/*.zip diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d0ef354c..8713c62c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,13 +33,13 @@ jobs: - name: Archive Maven staging repository run: tar -C target -czf target/maven-staging.tar.gz staging-deploy - name: Upload Maven staging repository - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: maven-staging path: target/maven-staging.tar.gz if-no-files-found: error - name: Upload shaded CLI JAR - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: single-jar path: cli/target/roseau-[0-9]*.jar @@ -81,7 +81,7 @@ jobs: shell: bash run: ./mvnw --batch-mode -N jreleaser:assemble -Djreleaser.config.file=jreleaser.yml -Djreleaser.assemble.jlink.roseau-standalone.jdk.path="$JAVA_HOME" -Djreleaser.assemble.jlink.roseau-standalone.jdk.platform="${{ matrix.platform }}" - name: Upload jlink archive - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: jlink-${{ matrix.platform }} path: target/jreleaser/assemble/roseau-standalone/jlink/*.zip @@ -107,19 +107,19 @@ jobs: distribution: 'temurin' cache: 'maven' - name: Download Maven staging repository - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v7.0.0 with: name: maven-staging path: target - name: Restore Maven staging repository run: tar -C target -xzf target/maven-staging.tar.gz - name: Download shaded CLI JAR - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v7.0.0 with: name: single-jar path: cli/target - name: Download jlink archives - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v7.0.0 with: pattern: jlink-* merge-multiple: true @@ -133,6 +133,3 @@ jobs: JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_USERNAME: ${{ secrets.NEXUS_USERNAME }} JRELEASER_MAVENCENTRAL_RELEASE_DEPLOY_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} - JRELEASER_HOMEBREW_GITHUB_TOKEN: ${{ secrets.HOMEBREW_TAP_GITHUB_TOKEN }} - JRELEASER_SDKMAN_CONSUMER_KEY: ${{ secrets.SDKMAN_CONSUMER_KEY }} - JRELEASER_SDKMAN_CONSUMER_TOKEN: ${{ secrets.SDKMAN_CONSUMER_TOKEN }} diff --git a/combinatorial/pom.xml b/combinatorial/pom.xml index 5b6131f5..2d2bce17 100644 --- a/combinatorial/pom.xml +++ b/combinatorial/pom.xml @@ -14,6 +14,8 @@ Combinatorial Benchmark + true + true true diff --git a/jreleaser.yml b/jreleaser.yml index 26aad20a..8b7cc654 100644 --- a/jreleaser.yml +++ b/jreleaser.yml @@ -13,8 +13,7 @@ project: inceptionYear: 2023 stereotype: CLI snapshot: - label: early-access - fullChangelog: true + label: v{{projectVersion}} links: homepage: https://github.com/alien-tools/roseau documentation: https://alien-tools.github.io/roseau/ @@ -46,10 +45,13 @@ signing: deploy: maven: + pomchecker: + failOnWarning: false mavenCentral: release-deploy: active: RELEASE url: https://central.sonatype.com/api/v1/publisher + applyMavenCentralRules: true stagingRepositories: - target/staging-deploy nexus2: diff --git a/pom.xml b/pom.xml index 3bb8a8a0..af1c882e 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ org.jreleaser jreleaser-maven-plugin ${jreleaser.version} + false org.apache.maven.plugins