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

kwin pushed a commit to branch 
feature/add-java-prerequisites-to-plugin-descriptor
in repository https://gitbox.apache.org/repos/asf/maven.git

commit a477d9dca8591e21797c76c59eb679d9578fcdce
Author: Konrad Windszus <[email protected]>
AuthorDate: Thu Oct 13 17:40:56 2022 +0200

    Allow a Maven plugin to require a Java version
---
 .../maven/plugin/DefaultPluginDescriptorCache.java     |  1 +
 .../org/apache/maven/plugin/MavenPluginManager.java    |  8 ++++++++
 .../plugin/internal/DefaultMavenPluginManager.java     | 18 ++++++++++++++++++
 .../version/internal/DefaultPluginVersionResolver.java |  1 +
 .../profile/activation/JdkVersionProfileActivator.java | 14 +++++++++-----
 .../maven/plugin/descriptor/PluginDescriptor.java      | 12 ++++++++++++
 .../plugin/descriptor/PluginDescriptorBuilder.java     |  7 +++++++
 maven-plugin-api/src/main/mdo/plugin.mdo               |  6 ++++++
 8 files changed, 62 insertions(+), 5 deletions(-)

diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
index 69297ea28..557026362 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
@@ -94,6 +94,7 @@ public class DefaultPluginDescriptorCache
             clone.setName( original.getName() );
             clone.setDescription( original.getDescription() );
             clone.setRequiredMavenVersion( original.getRequiredMavenVersion() 
);
+            clone.setRequiredJavaVersion( original.getRequiredJavaVersion() );
 
             clone.setPluginArtifact( ArtifactUtils.copyArtifactSafe( 
original.getPluginArtifact() ) );
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java 
b/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
index 5616ad249..88f34d63c 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
@@ -77,6 +77,14 @@ public interface MavenPluginManager
     void checkRequiredMavenVersion( PluginDescriptor pluginDescriptor )
         throws PluginIncompatibleException;
 
+    /**
+     * Verifies the specified plugin is compatible with the current Java 
runtime.
+     *
+     * @param pluginDescriptor The descriptor of the plugin to check, must not 
be {@code null}.
+     */
+    void checkRequiredJavaVersion( PluginDescriptor pluginDescriptor )
+        throws PluginIncompatibleException;
+
     /**
      * Sets up the class realm for the specified plugin. Both the class realm 
and the plugin artifacts that constitute
      * it will be stored in the plugin descriptor.
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index de249c727..e568ece37 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -27,6 +27,7 @@ import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.scope.internal.MojoExecutionScopeModule;
 import org.apache.maven.internal.impl.DefaultSession;
 import org.apache.maven.model.Plugin;
+import org.apache.maven.model.profile.activation.JdkVersionProfileActivator;
 import org.apache.maven.plugin.ContextEnabled;
 import org.apache.maven.plugin.DebugConfigurationListener;
 import org.apache.maven.plugin.ExtensionRealmCache;
@@ -325,6 +326,23 @@ public class DefaultMavenPluginManager
         }
     }
 
+    @Override
+    public void checkRequiredJavaVersion( PluginDescriptor pluginDescriptor )
+        throws PluginIncompatibleException
+    {
+        String requiredJavaVersion = pluginDescriptor.getRequiredJavaVersion();
+        if ( StringUtils.isNotBlank( requiredJavaVersion ) )
+        {
+            if ( JdkVersionProfileActivator.isJavaVersionCompatible( 
requiredJavaVersion, 
+                                                                     
System.getProperty( "java.version" ) ) )
+            {
+                throw new PluginIncompatibleException( 
pluginDescriptor.getPlugin(),
+                                                       "The plugin " + 
pluginDescriptor.getId()
+                                                           + " requires Java 
version " + requiredJavaVersion );
+            }
+        }
+    }
+    
     public synchronized void setupPluginRealm( PluginDescriptor 
pluginDescriptor, MavenSession session,
                                                ClassLoader parent, 
List<String> imports, DependencyFilter filter )
         throws PluginResolutionException, PluginContainerException
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
index 294750f9c..4e71978dc 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
@@ -294,6 +294,7 @@ public class DefaultPluginVersionResolver
         try
         {
             pluginManager.checkRequiredMavenVersion( pluginDescriptor );
+            pluginManager.checkRequiredJavaVersion( pluginDescriptor );
         }
         catch ( Exception e )
         {
diff --git 
a/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java
 
b/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java
index b21fd81f3..07e3e4009 100644
--- 
a/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java
+++ 
b/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java
@@ -72,18 +72,22 @@ public class JdkVersionProfileActivator
                     .setLocation( activation.getLocation( "jdk" ) ) );
             return false;
         }
+        return isJavaVersionCompatible( jdk, version );
+    }
 
-        if ( jdk.startsWith( "!" ) )
+    public static boolean isJavaVersionCompatible( String requiredJdkRange, 
String currentJavaVersion )
+    {
+        if ( requiredJdkRange.startsWith( "!" ) )
         {
-            return !version.startsWith( jdk.substring( 1 ) );
+            return !currentJavaVersion.startsWith( requiredJdkRange.substring( 
1 ) );
         }
-        else if ( isRange( jdk ) )
+        else if ( isRange( requiredJdkRange ) )
         {
-            return isInRange( version, getRange( jdk ) );
+            return isInRange( currentJavaVersion, getRange( requiredJdkRange ) 
);
         }
         else
         {
-            return version.startsWith( jdk );
+            return currentJavaVersion.startsWith( requiredJdkRange );
         }
     }
 
diff --git 
a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
 
b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
index 2d4e1efe4..8c799419c 100644
--- 
a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
+++ 
b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
@@ -80,6 +80,8 @@ public class PluginDescriptor
 
     private String requiredMavenVersion;
 
+    private String requiredJavaVersion;
+
     private Plugin plugin;
 
     private Artifact pluginArtifact;
@@ -351,6 +353,16 @@ public class PluginDescriptor
         return requiredMavenVersion;
     }
 
+    public void setRequiredJavaVersion( String requiredJavaVersion )
+    {
+        this.requiredJavaVersion = requiredJavaVersion;
+    }
+
+    public String getRequiredJavaVersion()
+    {
+        return requiredJavaVersion;
+    }
+
     public void setPlugin( Plugin plugin )
     {
         this.plugin = plugin;
diff --git 
a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
 
b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
index a60985f1a..3cbf64df1 100644
--- 
a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
+++ 
b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.maven.internal.xml.XmlPlexusConfiguration;
 import org.apache.maven.internal.xml.Xpp3DomBuilder;
@@ -65,6 +66,7 @@ public class PluginDescriptorBuilder
 
         pluginDescriptor.setIsolatedRealm( extractIsolatedRealm( c ) );
         pluginDescriptor.setInheritedByDefault( extractInheritedByDefault( c ) 
);
+        pluginDescriptor.setRequiredJavaVersion( extractRequiredJavaVersion( c 
).orElse( null ) );
 
         pluginDescriptor.addMojos( extractMojos( c, pluginDescriptor ) );
 
@@ -140,6 +142,11 @@ public class PluginDescriptorBuilder
         return false;
     }
 
+    private Optional<String> extractRequiredJavaVersion( PlexusConfiguration c 
)
+    {
+        return Optional.ofNullable( c.getChild( "requiredJavaVersion" ) ).map( 
PlexusConfiguration::getValue );
+    }
+
     private List<ComponentDependency> extractComponentDependencies( 
PlexusConfiguration c )
     {
 
diff --git a/maven-plugin-api/src/main/mdo/plugin.mdo 
b/maven-plugin-api/src/main/mdo/plugin.mdo
index 5156b0f7e..66b65da58 100644
--- a/maven-plugin-api/src/main/mdo/plugin.mdo
+++ b/maven-plugin-api/src/main/mdo/plugin.mdo
@@ -91,6 +91,12 @@ under the License.
           <type>boolean</type>
           <defaultValue>true</defaultValue>
         </field>
+        <field>
+          <name>requiredJavaVersion</name>
+          <version>1.1.0</version>
+          <description>A version range which specifies the supported Java 
versions.</description>
+          <type>String</type>
+        </field>
         <field xdoc.separator="blank">
           <name>mojos</name>
           <version>1.0.0</version>

Reply via email to