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 612406d5b96ff..7093f96e92fb5 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 @@ -17,7 +17,9 @@ package org.apache.camel.dsl.jbang.core.commands; import java.io.File; +import java.text.SimpleDateFormat; import java.util.Comparator; +import java.util.Date; import java.util.Properties; import org.apache.camel.RuntimeCamelException; @@ -232,4 +234,10 @@ int rankGroupId(MavenGav o1) { }; } + protected String getBuildMavenProjectDate() { + // 2024-09-23T10:00:00Z + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + return sdf.format(new Date()); + } + } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java index 3f3f73382207d..a795f968e5f23 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java @@ -187,6 +187,7 @@ private void createMavenPom(File settings, File profile, File pom, Set d } else { context = context.replaceAll("\\{\\{ \\.MainClassname }}", mainClassname); } + context = context.replaceFirst("\\{\\{ \\.ProjectBuildOutputTimestamp }}", this.getBuildMavenProjectDate()); Properties prop = new CamelCaseOrderedProperties(); RuntimeUtil.loadProperties(prop, settings); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java index 19a01ce43b465..ebef8da4b2f78 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java @@ -378,6 +378,7 @@ private void createMavenPom(File settings, File pom, Set deps) throws Ex context = context.replaceAll("\\{\\{ \\.QuarkusVersion }}", quarkusVersion); context = context.replaceFirst("\\{\\{ \\.JavaVersion }}", javaVersion); context = context.replaceFirst("\\{\\{ \\.CamelVersion }}", camelVersion); + context = context.replaceFirst("\\{\\{ \\.ProjectBuildOutputTimestamp }}", this.getBuildMavenProjectDate()); context = replaceBuildProperties(context); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java index 9a2225f5109e2..60b342c73ef74 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java @@ -189,6 +189,7 @@ private void createMavenPom(File settings, File profile, File pom, Set d } else { context = context.replaceAll("\\{\\{ \\.CamelSpringBootVersion }}", camelVersion); } + context = context.replaceFirst("\\{\\{ \\.ProjectBuildOutputTimestamp }}", this.getBuildMavenProjectDate()); context = replaceBuildProperties(context); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.tmpl index b454ee451ec1e..ae20854367258 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.tmpl +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-pom.tmpl @@ -9,6 +9,7 @@ {{ .JavaVersion }} + {{ .ProjectBuildOutputTimestamp }} {{ .BuildProperties }} {{ .CamelKubernetesProperties }} diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.tmpl index f2dacd4763458..f3b247740ed31 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.tmpl +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-pom.tmpl @@ -9,6 +9,7 @@ {{ .Version }} + {{ .ProjectBuildOutputTimestamp }} 3.13.0 false {{ .JavaVersion }} diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.tmpl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.tmpl index aeed0211066b2..eaf831937238b 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.tmpl +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-pom.tmpl @@ -16,6 +16,7 @@ {{ .JavaVersion }} + {{ .ProjectBuildOutputTimestamp }} {{ .BuildProperties }} diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java index e0b5d672b7c20..5f5305974b071 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java +++ b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java @@ -166,4 +166,17 @@ private boolean containsDependency(List deps, String group, String a private String toGAV(Dependency d) { return d.getGroupId() + ":" + d.getArtifactId() + ":" + d.getVersion(); } + + @ParameterizedTest + @MethodSource("runtimeProvider") + public void shouldGenerateReproducibleBuild(RuntimeType rt) throws Exception { + Export command = createCommand(rt, new String[] { "classpath:route.yaml" }, + "--gav=examples:route:1.0.0", "--dir=" + workingDir, "--quiet"); + int exit = command.doCall(); + + Assertions.assertEquals(0, exit); + Model model = readMavenModel(); + Assertions.assertNotNull(model.getProperties().get("project.build.outputTimestamp")); + } + }