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>
