You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sj...@apache.org on 2026/04/20 18:55:00 UTC

(maven) branch maven-3.10.x updated: Promote java version in JavaToolchain

This is an automated email from the ASF dual-hosted git repository.

slawekjaranowski pushed a commit to branch maven-3.10.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-3.10.x by this push:
     new ee1fcb7833 Promote java version in JavaToolchain
ee1fcb7833 is described below

commit ee1fcb7833242db274cd558ee38c4dc7948f89fc
Author: Slawomir Jaranowski <s....@gmail.com>
AuthorDate: Mon Apr 20 19:28:46 2026 +0200

    Promote java version in JavaToolchain
    
    Many plugins using toolchains has requirements to detect java version selected by toolchains in runtime.
    
    Expose java version in JavaToolchain can simplify plugins code.
---
 .../apache/maven/toolchain/java/JavaToolchain.java | 15 ++++
 .../maven/toolchain/java/JavaToolchainFactory.java | 13 ++-
 .../maven/toolchain/java/JavaToolchainImpl.java    | 12 +++
 .../toolchain/java/JavaToolchainFactoryTest.java   | 92 ++++++++++++++++++++++
 4 files changed, 131 insertions(+), 1 deletion(-)

diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java b/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java
index 23fa8c7e81..4bf8375942 100644
--- a/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java
+++ b/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java
@@ -18,6 +18,7 @@
  */
 package org.apache.maven.toolchain.java;
 
+import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.toolchain.Toolchain;
 
 /**
@@ -61,4 +62,18 @@ public interface JavaToolchain extends Toolchain {
     //     * @return List
     //     */
     //    List getJavadocDirectories();
+
+    /**
+     * Returns the home directory of the JDK.
+     *
+     * @since 3.10.0
+     */
+    String getJavaHome();
+
+    /**
+     * Returns the version of the JDK.
+     *
+     * @since 3.10.0
+     */
+    ArtifactVersion getJavaVersion();
 }
diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java b/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java
index 292461818d..aed98d97b0 100644
--- a/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java
@@ -23,9 +23,12 @@
 import javax.inject.Singleton;
 
 import java.io.File;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.toolchain.MisconfiguredToolchainException;
 import org.apache.maven.toolchain.RequirementMatcher;
 import org.apache.maven.toolchain.RequirementMatcherFactory;
@@ -84,7 +87,7 @@ public ToolchainPrivate createToolchain(ToolchainModel model) throws Misconfigur
 
         // populate the configuration section
         Xpp3Dom dom = (Xpp3Dom) model.getConfiguration();
-        Xpp3Dom javahome = dom.getChild(JavaToolchainImpl.KEY_JAVAHOME);
+        Xpp3Dom javahome = dom != null ? dom.getChild(JavaToolchainImpl.KEY_JAVAHOME) : null;
         if (javahome == null) {
             throw new MisconfiguredToolchainException(
                     "Java toolchain without the " + JavaToolchainImpl.KEY_JAVAHOME + " configuration element.");
@@ -97,6 +100,14 @@ public ToolchainPrivate createToolchain(ToolchainModel model) throws Misconfigur
                     "Non-existing JDK home configuration at " + normal.getAbsolutePath());
         }
 
+        ArtifactVersion javaVersion = model.getProvides().entrySet().stream()
+                .filter(entry -> "version".equals(entry.getKey()))
+                .map(Map.Entry::getValue)
+                .map(v -> new DefaultArtifactVersion((String) v))
+                .findAny()
+                .orElse(null);
+
+        jtc.setJavaVersion(javaVersion);
         return jtc;
     }
 
diff --git a/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java b/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java
index e5c2e434d8..35d0edd79f 100644
--- a/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java
+++ b/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java
@@ -20,6 +20,7 @@
 
 import java.io.File;
 
+import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.toolchain.DefaultToolchain;
 import org.apache.maven.toolchain.model.ToolchainModel;
 import org.codehaus.plexus.logging.Logger;
@@ -35,6 +36,8 @@
 public class JavaToolchainImpl extends DefaultToolchain implements JavaToolchain {
     private String javaHome;
 
+    private ArtifactVersion javaVersion;
+
     public static final String KEY_JAVAHOME = "jdkHome"; // NOI18N
 
     JavaToolchainImpl(ToolchainModel model, Logger logger) {
@@ -49,6 +52,15 @@ public void setJavaHome(String javaHome) {
         this.javaHome = javaHome;
     }
 
+    @Override
+    public ArtifactVersion getJavaVersion() {
+        return javaVersion;
+    }
+
+    public void setJavaVersion(ArtifactVersion javaVersion) {
+        this.javaVersion = javaVersion;
+    }
+
     public String toString() {
         return "JDK[" + getJavaHome() + "]";
     }
diff --git a/maven-core/src/test/java/org/apache/maven/toolchain/java/JavaToolchainFactoryTest.java b/maven-core/src/test/java/org/apache/maven/toolchain/java/JavaToolchainFactoryTest.java
new file mode 100644
index 0000000000..dda69fdd56
--- /dev/null
+++ b/maven-core/src/test/java/org/apache/maven/toolchain/java/JavaToolchainFactoryTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.maven.toolchain.java;
+
+import org.apache.maven.toolchain.MisconfiguredToolchainException;
+import org.apache.maven.toolchain.model.ToolchainModel;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class JavaToolchainFactoryTest {
+    private JavaToolchainFactory factory;
+
+    @BeforeEach
+    void setup() {
+        factory = new JavaToolchainFactory();
+    }
+
+    @Test
+    void defaultToolchainShouldReturnEmpty() {
+        assertNull(factory.createDefaultToolchain());
+    }
+
+    @Test
+    void missingJdkHomeShouldThrowException() {
+        ToolchainModel toolchainModel = new ToolchainModel();
+        MisconfiguredToolchainException exception = Assertions.assertThrows(
+                MisconfiguredToolchainException.class, () -> factory.createToolchain(toolchainModel));
+        assertEquals("Java toolchain without the jdkHome configuration element.", exception.getMessage());
+    }
+
+    @Test
+    void nonExistingJdkHomeShouldThrowException() {
+        ToolchainModel toolchainModel = new ToolchainModel();
+        Xpp3Dom jdkHome = new Xpp3Dom("jdkHome");
+        jdkHome.setValue("/not-exist/jdk/home");
+        Xpp3Dom configuration = new Xpp3Dom("configuration");
+        configuration.addChild(jdkHome);
+        toolchainModel.setConfiguration(configuration);
+
+        MisconfiguredToolchainException exception = Assertions.assertThrows(
+                MisconfiguredToolchainException.class, () -> factory.createToolchain(toolchainModel));
+        assertTrue(
+                exception.getMessage().contains("Non-existing JDK home configuration at"),
+                "Not expected exception message: '" + exception.getMessage());
+        assertTrue(
+                exception.getMessage().contains("not-exist"),
+                "Not expected exception message: '" + exception.getMessage() + "', should contain: 'not-exist'");
+    }
+
+    @Test
+    void properToolchainShouldReturnJavaToolchain() throws Exception {
+        String javaHome = System.getProperty("java.home");
+        String javaVersion = System.getProperty("java.version");
+
+        ToolchainModel toolchainModel = new ToolchainModel();
+        Xpp3Dom jdkHome = new Xpp3Dom("jdkHome");
+        jdkHome.setValue(javaHome);
+        Xpp3Dom configuration = new Xpp3Dom("configuration");
+        configuration.addChild(jdkHome);
+        toolchainModel.setConfiguration(configuration);
+
+        toolchainModel.addProvide("version", javaVersion);
+
+        JavaToolchain toolchain = (JavaToolchain) factory.createToolchain(toolchainModel);
+        assertNotNull(toolchain);
+        assertEquals(javaHome, toolchain.getJavaHome());
+        assertEquals(javaVersion, toolchain.getJavaVersion().toString());
+    }
+}