I’m creating a Maven plugin using
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> </plugin>
I’d like to upgrade the required JDK version of my plugin and its dependencies to 16, but there seems to be a problem:
Caused by: java.lang.UnsupportedOperationException: Record requires ASM8 at org.objectweb.asm.ClassVisitor.visitRecordComponent (ClassVisitor.java:305) at org.objectweb.asm.ClassReader.readRecordComponent (ClassReader.java:930) at org.objectweb.asm.ClassReader.accept (ClassReader.java:708) at org.objectweb.asm.ClassReader.accept (ClassReader.java:401) at org.apache.maven.tools.plugin.extractor.annotations.scanner.DefaultMojoAnnotationsScanner.analyzeClassStream (DefaultMojoAnnotationsScanner.java:208) at org.apache.maven.tools.plugin.extractor.annotations.scanner.DefaultMojoAnnotationsScanner.scanArchive (DefaultMojoAnnotationsScanner.java:142) at org.apache.maven.tools.plugin.extractor.annotations.scanner.DefaultMojoAnnotationsScanner.scan (DefaultMojoAnnotationsScanner.java:111) at org.apache.maven.tools.plugin.extractor.annotations.scanner.DefaultMojoAnnotationsScanner.scan (DefaultMojoAnnotationsScanner.java:78) at org.apache.maven.tools.plugin.extractor.annotations.JavaAnnotationsMojoDescriptorExtractor.scanAnnotations (JavaAnnotationsMojoDescriptorExtractor.java:124) at org.apache.maven.tools.plugin.extractor.annotations.JavaAnnotationsMojoDescriptorExtractor.execute (JavaAnnotationsMojoDescriptorExtractor.java:103) at org.apache.maven.tools.plugin.scanner.DefaultMojoScanner.populatePluginDescriptor (DefaultMojoScanner.java:96) at org.apache.maven.plugin.plugin.AbstractGeneratorMojo.execute (AbstractGeneratorMojo.java:260) at org.apache.maven.plugin.plugin.HelpGeneratorMojo.execute (HelpGeneratorMojo.java:92) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289) at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
In org.apache.maven.plugin-tools:maven-plugin-tools-annotations:3.6.0
, the following constructor can be seen (which is invoked in DefaultMojoAnnotationsScanner.analyzeClassStream()
from the stack trace):
public MojoClassVisitor( Logger logger ) { super( Opcodes.ASM7 ); this.logger = logger; }
It hard wires the ASM API version to ASM7, when ASM requires version 8 to process record types. Before a new version of these Maven plugins are released, is there any way I can upgrade the ASM dependency of the above class without forking and patching all possible Maven plugins? Using the usual <excludes>
and <dependency>
tags on the plugin doesn’t work here, because even if I upgrade the depency itself, the MojoClassVisitor
still hard-codes the API version to ASM7.
I’ve also created https://issues.apache.org/jira/browse/MPLUGIN-371 to track this
Advertisement
Answer
It seems to be a recognised issue that has been fixed for the next version 3.6.1: https://issues.apache.org/jira/browse/MPLUGIN-369
A workaround is to add:
<repositories> <repository> <id>apache-snapshot-repository</id> <name>Apache Snapshot Repository</name> <url>https://repository.apache.org/snapshots/</url> </repository> </repositories>
And then add this dependency to the maven-plugin-plugin
:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <dependencies> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-tools-annotations</artifactId> <version>3.6.1-SNAPSHOT</version> </dependency> </dependencies> </plugin>