Skip to content

Commit 8946b16

Browse files
committed
feat(generator): add explicit base-image JDK selection via jkube.java.version (3916)
Replace auto-detection of Java version (maven.compiler.* properties) with an explicit jkube.java.version shared property for selecting JDK base images. Users can set jkube.java.version to 11, 17, 21, or 25 to pin a specific JDK base image (jkube-java-11/-17/-21/-25). Works identically for Maven (-Djkube.java.version=17) and Gradle (-Pjkube.java.version=17). - Unset: default jkube-java (latest JDK) - from > jkube.java.version > default; warning when both are set - Unsupported value fails fast with supported versions list - ThorntailV2Generator stays pinned to JDK_11 - Supported versions derived from JDK enum (single source of truth)
1 parent eefbff8 commit 8946b16

8 files changed

Lines changed: 408 additions & 6 deletions

File tree

jkube-kit/doc/src/main/asciidoc/inc/_faq.adoc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,32 @@ The above will generate an environment variable `$FOO` of value `bar`
2222

2323
For a full list of the environments used in java base images, https://github.com/eclipse-jkube/jkube-images#available-images[see this list]
2424

25+
=== How do I select a specific Java version for my base image?
26+
27+
By default, JKube uses the `jkube-java` base image which tracks the latest Java version.
28+
To pin a specific Java version, set the `jkube.java.version` property.
29+
Supported values: `11`, `17`, `21`, `25`.
30+
31+
ifeval::["{plugin-type}" == "maven"]
32+
[source,xml,indent=0,subs="verbatim,quotes,attributes"]
33+
----
34+
<properties>
35+
<jkube.java.version>21</jkube.java.version>
36+
</properties>
37+
----
38+
endif::[]
39+
40+
ifeval::["{plugin-type}" == "gradle"]
41+
[source,properties,indent=0,subs="verbatim,quotes,attributes"]
42+
----
43+
jkube.java.version=21
44+
----
45+
endif::[]
46+
47+
This property works identically for Maven and Gradle, and across all Java-based generators.
48+
If both `from` and `jkube.java.version` are set, `from` takes precedence.
49+
See <<generator-java-exec-java-version>> for more details.
50+
2551
=== How do I define a system property?
2652

2753
The simplest way is to add system properties to the `JAVA_OPTIONS` environment variable.

jkube-kit/doc/src/main/asciidoc/inc/generator/_java_exec.adoc

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,34 @@ It will use the following base image by default, but as explained <<generator-op
2121
|===
2222
| | Docker Build | S2I Build | ImageStream
2323

24-
| *Community*
24+
| *Default (latest)*
2525
| `quay.io/jkube/jkube-java`
2626
| `quay.io/jkube/jkube-java`
2727
| `jkube-java`
2828

29+
| *Java 25*
30+
| `quay.io/jkube/jkube-java-25`
31+
| `quay.io/jkube/jkube-java-25`
32+
| `jkube-java-25`
33+
34+
| *Java 21*
35+
| `quay.io/jkube/jkube-java-21`
36+
| `quay.io/jkube/jkube-java-21`
37+
| `jkube-java-21`
38+
39+
| *Java 17*
40+
| `quay.io/jkube/jkube-java-17`
41+
| `quay.io/jkube/jkube-java-17`
42+
| `jkube-java-17`
43+
44+
| *Java 11*
45+
| `quay.io/jkube/jkube-java-11`
46+
| `quay.io/jkube/jkube-java-11`
47+
| `jkube-java-11`
48+
2949
|===
3050

31-
These images always refer to the latest tag.
51+
By default, the latest image is used. To select a specific Java version, see <<generator-java-exec-java-version>> below.
3252

3353
When a `fromMode` of `istag` is used to specify an `ImageStreamTag` and when no `from` is given, then as default the
3454
`ImageStreamTag` `jkube-java` in the namespace `openshift` is chosen.
@@ -87,5 +107,47 @@ If no such class is found or if more than one is
87107

88108
The exposed ports are typically later on use by <<enrichers, Enrichers>> to create default Kubernetes or OpenShift services.
89109

110+
[[generator-java-exec-java-version]]
111+
==== Selecting a specific Java version
112+
113+
By default, JKube uses the `jkube-java` base image which always tracks the latest supported Java version.
114+
To pin a specific Java version for your base image, set the `jkube.java.version` property to one of the supported values: `11`, `17`, `21`, `25`.
115+
116+
ifeval::["{plugin-type}" == "maven"]
117+
[source,xml,indent=0,subs="verbatim,quotes,attributes"]
118+
----
119+
<properties>
120+
<jkube.java.version>21</jkube.java.version>
121+
</properties>
122+
----
123+
124+
Or via the command line:
125+
126+
----
127+
mvn package k8s:build -Djkube.java.version=21
128+
----
129+
endif::[]
130+
131+
ifeval::["{plugin-type}" == "gradle"]
132+
In `gradle.properties`:
133+
134+
[source,properties,indent=0,subs="verbatim,quotes,attributes"]
135+
----
136+
jkube.java.version=21
137+
----
138+
139+
Or via the command line:
140+
141+
----
142+
gradle k8sBuild -Pjkube.java.version=21
143+
----
144+
endif::[]
145+
146+
This property works across all Java-based generators (java-exec, Spring Boot, Quarkus, Micronaut, Helidon, Vert.x, WildFly JAR, Open Liberty).
147+
148+
.Precedence
149+
If both `from` and `jkube.java.version` are configured, `from` takes precedence and a warning is emitted.
150+
Setting an unsupported value will cause the build to fail with a message listing the supported versions.
151+
90152
You can add additional files to the target image within `baseDir` by placing files into `src/main/jkube-includes`.
91153
These will be added with mode `0644`, while everything in `src/main/jkube-includes/bin` will be added with `0755`.

jkube-kit/generator/api/src/main/resources-filtered/META-INF/jkube/default-images.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,12 @@ java.upstream.istag=${image.java.upstream.istag}
2121
java11.upstream.docker=${image.java11.upstream.docker}
2222
java11.upstream.s2i=${image.java11.upstream.s2i}
2323
java11.upstream.istag=${image.java11.upstream.istag}
24+
java17.upstream.docker=${image.java17.upstream.docker}
25+
java17.upstream.s2i=${image.java17.upstream.s2i}
26+
java17.upstream.istag=${image.java17.upstream.istag}
27+
java21.upstream.docker=${image.java21.upstream.docker}
28+
java21.upstream.s2i=${image.java21.upstream.s2i}
29+
java21.upstream.istag=${image.java21.upstream.istag}
30+
java25.upstream.docker=${image.java25.upstream.docker}
31+
java25.upstream.s2i=${image.java25.upstream.s2i}
32+
java25.upstream.istag=${image.java25.upstream.istag}

jkube-kit/generator/java-exec/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@
4343
<artifactId>junit-jupiter-engine</artifactId>
4444
<scope>test</scope>
4545
</dependency>
46+
<dependency>
47+
<groupId>org.junit.jupiter</groupId>
48+
<artifactId>junit-jupiter-params</artifactId>
49+
<scope>test</scope>
50+
</dependency>
4651
<dependency>
4752
<groupId>org.assertj</groupId>
4853
<artifactId>assertj-core</artifactId>

jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515

1616
import java.io.File;
1717
import java.util.ArrayList;
18+
import java.util.Arrays;
1819
import java.util.HashMap;
1920
import java.util.List;
2021
import java.util.Map;
22+
import java.util.stream.Collectors;
2123

2224
import lombok.AccessLevel;
2325
import lombok.AllArgsConstructor;
@@ -45,16 +47,37 @@
4547
public class JavaExecGenerator extends BaseGenerator {
4648

4749
protected enum JDK {
48-
DEFAULT("java"),
49-
JDK_11("java11");
50+
DEFAULT("java", null),
51+
JDK_11("java11", "11"),
52+
JDK_17("java17", "17"),
53+
JDK_21("java21", "21"),
54+
JDK_25("java25", "25");
5055

5156
final String imagePrefix;
57+
final String version;
5258

53-
JDK(String imagePrefix) {
59+
JDK(String imagePrefix, String version) {
5460
this.imagePrefix = imagePrefix;
61+
this.version = version;
62+
}
63+
64+
static JDK fromVersion(String version) {
65+
return Arrays.stream(values())
66+
.filter(jdk -> jdk.version != null && jdk.version.equals(version))
67+
.findFirst()
68+
.orElseThrow(() -> new IllegalArgumentException(String.format(
69+
"Unsupported jkube.java.version '%s'. Supported versions are: %s",
70+
version,
71+
Arrays.stream(values())
72+
.filter(jdk -> jdk.version != null)
73+
.map(jdk -> jdk.version)
74+
.collect(Collectors.joining(", "))
75+
)));
5576
}
5677
}
5778

79+
static final String PROPERTY_JKUBE_JAVA_VERSION = "jkube.java.version";
80+
5881
private static final String WEB_PORT_DEFAULT = "8080";
5982
public static final String JOLOKIA_PORT_DEFAULT = "8778";
6083
public static final String PROMETHEUS_PORT_DEFAULT = "9779";
@@ -76,7 +99,7 @@ public JavaExecGenerator(GeneratorContext context) {
7699
}
77100

78101
protected JavaExecGenerator(GeneratorContext context, String name) {
79-
this(context, name, JDK.DEFAULT);
102+
this(context, name, resolveJdk(context.getProject()));
80103
}
81104
protected JavaExecGenerator(GeneratorContext context, String name, JDK jdk) {
82105
super(context, name, new FromSelector.Default(context, jdk.imagePrefix));
@@ -85,6 +108,30 @@ protected JavaExecGenerator(GeneratorContext context, String name, JDK jdk) {
85108
getProject().getOutputDirectory(), context.getLogger());
86109
}
87110

111+
static JDK resolveJdk(JavaProject project) {
112+
final String version = Configs.getFromSystemPropertyWithPropertiesAsFallback(
113+
project.getProperties(), PROPERTY_JKUBE_JAVA_VERSION);
114+
if (version == null || version.trim().isEmpty()) {
115+
return JDK.DEFAULT;
116+
}
117+
return JDK.fromVersion(version);
118+
}
119+
120+
@Override
121+
protected void addFrom(BuildConfiguration.BuildConfigurationBuilder builder) {
122+
final String explicitFrom = super.getFromAsConfigured();
123+
if (explicitFrom != null) {
124+
final String javaVersion = Configs.getFromSystemPropertyWithPropertiesAsFallback(
125+
getProject().getProperties(), PROPERTY_JKUBE_JAVA_VERSION);
126+
if (javaVersion != null) {
127+
log.warn("Both 'from' (%s) and 'jkube.java.version' (%s) are set. " +
128+
"'from' takes precedence; 'jkube.java.version' will be ignored.",
129+
explicitFrom, javaVersion);
130+
}
131+
}
132+
super.addFrom(builder);
133+
}
134+
88135
@AllArgsConstructor
89136
public enum Config implements Configs.Config {
90137
// Webport to expose. Set to 0 if no port should be exposed

0 commit comments

Comments
 (0)