This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch j21 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 627725f8f64ec1fe8e437cc22dbc0184c21f7be3 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Jul 23 21:00:19 2025 +0200 CAMEL-22266: camel-jbang: use java 21 as default for run/export commands. --- .../ROOT/pages/camel-4x-upgrade-guide-4_14.adoc | 3 ++ .../camel/dsl/jbang/core/commands/Export.java | 3 +- .../dsl/jbang/core/commands/ExportBaseCommand.java | 4 +-- .../apache/camel/dsl/jbang/core/commands/Run.java | 2 +- .../main/resources/quarkus-docker/Dockerfile.jvm | 7 +++-- .../resources/quarkus-docker/Dockerfile.legacy-jar | 9 +++--- .../resources/quarkus-docker/Dockerfile.native | 10 +++---- .../quarkus-docker/Dockerfile.native-micro | 10 +++---- .../{Dockerfile.tmpl => Dockerfile17.tmpl} | 0 .../{Dockerfile.tmpl => Dockerfile21.tmpl} | 2 +- .../dsl/jbang/core/commands/ExportMainJibTest.java | 34 ++++++++++++++++++++-- .../jbang/core/commands/ExportMainJkubeTest.java | 4 +-- .../resources/pom-xml-files/springboot-pom.xml | 4 +-- .../core/commands/kubernetes/KubernetesRun.java | 4 +-- .../commands/kubernetes/KubernetesExportTest.java | 27 +++++++++++++++++ 15 files changed, 91 insertions(+), 32 deletions(-) diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc index 8ccc0635239..320b8b945e8 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc @@ -21,6 +21,9 @@ of an issue, and felt it's better to fix this before for this LTS release. === camel-jbang +The `camel-jbang` has upgraded to Java 21 as the default java-version when running and exporting. +To keep using java 17, you can use `--java-version=17` as parameter. + The `camel export` will not include `camel-observabilities-services` out of the box. To include this, then use `--observe` to enable this during export. diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java index e5fc01ccbaa..01259fd5844 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java @@ -327,7 +327,8 @@ public class Export extends ExportBaseCommand { Path docker = Path.of(buildDir).resolve("src/main/docker"); Files.createDirectories(docker); String[] ids = gav.split(":"); - InputStream is = ExportCamelMain.class.getClassLoader().getResourceAsStream("templates/Dockerfile.tmpl"); + InputStream is + = ExportCamelMain.class.getClassLoader().getResourceAsStream("templates/Dockerfile" + javaVersion + ".tmpl"); String context = IOHelper.loadText(is); IOHelper.close(is); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java index 989d4d85dbb..3b34417f19b 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java @@ -155,8 +155,8 @@ public abstract class ExportBaseCommand extends CamelCommand { defaultValue = "CamelApplication") protected String mainClassname = "CamelApplication"; - @CommandLine.Option(names = { "--java-version" }, description = "Java version", defaultValue = "17") - protected String javaVersion = "17"; + @CommandLine.Option(names = { "--java-version" }, description = "Java version", defaultValue = "21") + protected String javaVersion = "21"; @CommandLine.Option(names = { "--camel-version" }, description = "To export using a different Camel version than the default version.") diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java index fbdd40050c0..328d16bf4d8 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java @@ -1540,7 +1540,7 @@ public class Run extends CamelCommand { String content = IOHelper.loadText(is); IOHelper.close(is); - content = content.replaceFirst("\\{\\{ \\.JavaVersion }}", "17"); + content = content.replaceFirst("\\{\\{ \\.JavaVersion }}", "21"); if (repositories != null) { content = content.replaceFirst("\\{\\{ \\.MavenRepositories }}", "//REPOS " + repositories); } else { diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.jvm b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.jvm index 3981afa460e..81d3e69ab9e 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.jvm +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.jvm @@ -43,7 +43,8 @@ # This scripts computes the command line to execute your Java application, and # includes memory/GC tuning. # You can configure the behavior using the following environment properties: -# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override +# the default JVM options, use `JAVA_OPTS_APPEND` to append options # - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options # in JAVA_OPTS (example: "-Dsome.property=foo") # - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is @@ -94,7 +95,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi8/openjdk-17:1.21 +FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 ENV LANGUAGE='en_US:en' @@ -107,7 +108,7 @@ COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ EXPOSE 8080 USER 185 -ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.legacy-jar b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.legacy-jar index 83e831068ad..d1468d0801b 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.legacy-jar +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.legacy-jar @@ -24,7 +24,7 @@ # # Before building the container image run: # -# ./mvnw package -Dquarkus.package.type=legacy-jar +# ./mvnw package -Dquarkus.package.jar.type=legacy-jar # # Then, build the image with: # @@ -47,7 +47,8 @@ # This scripts computes the command line to execute your Java application, and # includes memory/GC tuning. # You can configure the behavior using the following environment properties: -# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") - Be aware that this will override +# the default JVM options, use `JAVA_OPTS_APPEND` to append options # - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options # in JAVA_OPTS (example: "-Dsome.property=foo") # - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is @@ -98,7 +99,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi8/openjdk-17:1.16 +FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 ENV LANGUAGE='en_US:en' @@ -108,7 +109,7 @@ COPY target/*-runner.jar /deployments/quarkus-run.jar EXPOSE 8080 USER 185 -ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native index b71efa9abb7..56e20b3fe9f 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native @@ -30,17 +30,15 @@ # # docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus # +# The ` registry.access.redhat.com/ubi9/ubi-minimal:9.5` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/ubi8/ubi-minimal:8.10`. ### - -# Use an UBI image -FROM registry.access.redhat.com/ubi8/ubi-minimal:8.10 -# Use a micro image -# FROM quay.io/quarkus/quarkus-micro-image:2.0 +FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5 WORKDIR /work/ RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work -COPY --chown=1001:root target/*-runner /work/application +COPY --chown=1001:root --chmod=0755 target/*-runner /work/application EXPOSE 8080 USER 1001 diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native-micro b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native-micro index 6b0e613988e..4c743103f07 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native-micro +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/quarkus-docker/Dockerfile.native-micro @@ -15,10 +15,6 @@ # limitations under the License. # -# -# WARNING: this image is deprecated and won't be used in future versions: use Dockerfile.native instead -# - #### # This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. # It uses a micro base image, tuned for Quarkus native executables. @@ -37,13 +33,15 @@ # # docker run -i --rm -p 8080:8080 quarkus/code-with-quarkus # +# The `quay.io/quarkus/ubi9-quarkus-micro-image:2.0` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/quarkus/quarkus-micro-image:2.0`. ### -FROM quay.io/quarkus/quarkus-micro-image:2.0 +FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0 WORKDIR /work/ RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work -COPY --chown=1001:root target/*-runner /work/application +COPY --chown=1001:root --chmod=0755 target/*-runner /work/application EXPOSE 8080 USER 1001 diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile17.tmpl similarity index 100% copy from dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile.tmpl copy to dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile17.tmpl diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile21.tmpl similarity index 99% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile.tmpl rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile21.tmpl index 2edafcb82ed..3d09e017807 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile.tmpl +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/Dockerfile21.tmpl @@ -94,7 +94,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi8/openjdk-17:1.21 +FROM registry.access.redhat.com/ubi9/openjdk-21:1.21 COPY --chown=185 target/{{ .AppJar }} /deployments/ diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java index 2b56135282e..28f7c48ea32 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java +++ b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java @@ -64,14 +64,14 @@ class ExportMainJibTest { @ParameterizedTest @MethodSource("runtimeProvider") - public void shouldGenerateProjectWithJib(RuntimeType rt) throws Exception { + public void shouldGenerateJava17(RuntimeType rt) throws Exception { // prepare as we need application.properties that contains jib settings Files.copy(new File("src/test/resources/application-jib.properties").toPath(), profile.toPath(), StandardCopyOption.REPLACE_EXISTING); Export command = new Export(new CamelJBangMain()); CommandLine.populateCommand(command, "--gav=examples:route:1.0.0", "--dir=" + workingDir, - "--runtime=%s".formatted(rt.runtime()), "target/test-classes/route.yaml"); + "--runtime=%s".formatted(rt.runtime()), "--java-version=17", "target/test-classes/route.yaml"); int exit = command.doCall(); Assertions.assertEquals(0, exit); @@ -92,6 +92,36 @@ class ExportMainJibTest { command.printConfigurationValues("export command"); } + @ParameterizedTest + @MethodSource("runtimeProvider") + public void shouldGenerateProjectWithJib(RuntimeType rt) throws Exception { + // prepare as we need application.properties that contains jib settings + Files.copy(new File("src/test/resources/application-jib.properties").toPath(), profile.toPath(), + StandardCopyOption.REPLACE_EXISTING); + + Export command = new Export(new CamelJBangMain()); + CommandLine.populateCommand(command, "--gav=examples:route:1.0.0", "--dir=" + workingDir, + "--runtime=%s".formatted(rt.runtime()), "target/test-classes/route.yaml"); + int exit = command.doCall(); + + Assertions.assertEquals(0, exit); + Model model = readMavenModel(); + Assertions.assertEquals("examples", model.getGroupId()); + Assertions.assertEquals("route", model.getArtifactId()); + Assertions.assertEquals("1.0.0", model.getVersion()); + Assertions.assertEquals("21", model.getProperties().getProperty("java.version")); + Assertions.assertEquals("abc", model.getProperties().getProperty("jib.label")); + Assertions.assertEquals("eclipse-temurin:21-jre", model.getProperties().getProperty("jib.from.image")); + + // should contain jib plugin + Assertions.assertEquals(4, model.getBuild().getPlugins().size()); + Plugin p = model.getBuild().getPlugins().get(3); + Assertions.assertEquals("com.google.cloud.tools", p.getGroupId()); + Assertions.assertEquals("jib-maven-plugin", p.getArtifactId()); + + command.printConfigurationValues("export command"); + } + private Model readMavenModel() throws Exception { File f = workingDir.toPath().resolve("pom.xml").toFile(); Assertions.assertTrue(f.isFile(), "Not a pom.xml file: " + f); diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java index 74c4bb20a56..87a933bb5b2 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java +++ b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java @@ -79,9 +79,9 @@ class ExportMainJkubeTest { Assertions.assertEquals("examples", model.getGroupId()); Assertions.assertEquals("route", model.getArtifactId()); Assertions.assertEquals("1.0.0", model.getVersion()); - Assertions.assertEquals("17", model.getProperties().getProperty("java.version")); + Assertions.assertEquals("21", model.getProperties().getProperty("java.version")); Assertions.assertEquals("abc", model.getProperties().getProperty("jib.label")); - Assertions.assertEquals("eclipse-temurin:17-jre", model.getProperties().getProperty("jib.from.image")); + Assertions.assertEquals("eclipse-temurin:21-jre", model.getProperties().getProperty("jib.from.image")); // should contain jib and jkube plugin Assertions.assertEquals(5, model.getBuild().getPlugins().size()); diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/resources/pom-xml-files/springboot-pom.xml b/dsl/camel-jbang/camel-jbang-core/src/test/resources/pom-xml-files/springboot-pom.xml index d83d53fcdb9..c7cce8a10cc 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/test/resources/pom-xml-files/springboot-pom.xml +++ b/dsl/camel-jbang/camel-jbang-core/src/test/resources/pom-xml-files/springboot-pom.xml @@ -24,7 +24,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.4.5</version> + <version>3.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> @@ -33,7 +33,7 @@ <version>1.0-SNAPSHOT</version> <properties> - <java.version>17</java.version> + <java.version>21</java.version> <project.build.outputTimestamp>2025-06-12T11:19:02Z</project.build.outputTimestamp> </properties> diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java index 1919b24def8..dd726e11269 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java @@ -220,8 +220,8 @@ public class KubernetesRun extends KubernetesBaseCommand { description = "Whether downloading JARs from ASF Maven Snapshot repository is enabled") boolean mavenApacheSnapshotEnabled = true; - @CommandLine.Option(names = { "--java-version" }, description = "Java version", defaultValue = "17") - String javaVersion = "17"; + @CommandLine.Option(names = { "--java-version" }, description = "Java version", defaultValue = "21") + String javaVersion = "21"; @CommandLine.Option(names = { "--camel-version" }, description = "To export using a different Camel version than the default version.") diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java index 6b4cb7da3b9..134616c2eaa 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java @@ -62,6 +62,33 @@ class KubernetesExportTest extends KubernetesExportBaseTest { Assertions.assertEquals("route", model.getArtifactId()); Assertions.assertEquals("1.0.0", model.getVersion()); + Properties props = model.getProperties(); + Assertions.assertEquals("examples/route:1.0.0", props.get("jkube.image.name")); + Assertions.assertEquals("examples/route:1.0.0", props.get("jkube.container-image.name")); + Assertions.assertEquals("eclipse-temurin:21", props.get("jkube.container-image.from")); + Assertions.assertEquals("jib", props.get("jkube.build.strategy")); + Assertions.assertNull(props.get("jkube.docker.push.registry")); + Assertions.assertNull(props.get("jkube.container-image.registry")); + Assertions.assertNull(props.get("jkube.container-image.platforms")); + + if (RuntimeType.quarkus == RuntimeType.fromValue(rt.runtime())) { + Assertions.assertEquals("/observe/health", props.get("quarkus.smallrye-health.root-path")); + } + } + + @ParameterizedTest + @MethodSource("runtimeProvider") + public void shouldGenerateJava17Project(RuntimeType rt) throws Exception { + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, + "--gav=examples:route:1.0.0", "--runtime=" + rt.runtime(), "--java-version=17"); + int exit = command.doCall(); + Assertions.assertEquals(0, exit); + + Model model = readMavenModel(); + Assertions.assertEquals("examples", model.getGroupId()); + Assertions.assertEquals("route", model.getArtifactId()); + Assertions.assertEquals("1.0.0", model.getVersion()); + Properties props = model.getProperties(); Assertions.assertEquals("examples/route:1.0.0", props.get("jkube.image.name")); Assertions.assertEquals("examples/route:1.0.0", props.get("jkube.container-image.name"));