问题描述
今天在写一个maven插件的时候报了错,意思就是插件类参数注释@Parameter
中没有name
这个方法(org.apache.maven.plugins.annotations.Parameter
):
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-plugin-plugin:3.2:
descriptor (default-descriptor) on project swift2thrift-maven-plugin: Error extr
acting plugin descriptor: ‘Method: ‘name’ not found in class: ‘class org.apache.
maven.tools.plugin.annotations.datamodel.ParameterAnnotationContent’’ -> [Help 1]
我在代码中的确使用了name
。下面是我的代码片段
public class Swift2ThriftMojo extends AbstractMojo {
private static final String SPLIT_REGEX = "\\s;,";
/**
* <Swift-class-name...>
*/
@Parameter(name = "classNames",required=true)
private List<String> swiftClasseNames;
//.....
}
原因分析
这怎么可能?!
如果annotation中没有定义name,我这代码编译都通不过呀。所以一定不是代码的问题。
仔细看看报错位置的错误信息(如下截图),发现maven在解析<packaging>maven-plugin</packaging>
时使用的maven-plugin-plugin
版本是3.2
。
而我用的maven-plugin-annotations
版本是3.5
<properties>
<dep.maven-api.version>3.5.0</dep.maven-api.version>
</properties>
<!-- maven -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>${dep.maven-api.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>${dep.maven-api.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${dep.maven-api.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
</dependency>
到这里问题就清楚了:
maven默认使用的maven-plugin-plugin
插件版本过低,无法识别高版本annotation新增加的name
方法。
解决方案
方案1
去掉代码中的name
定义,把上面的maven插件开发依赖的相关库版本降到3.2.5/3.2。
方案2
指定使用maven-plugin-plugin
版本为与maven插件开发依赖的相关库版本匹配的版本,比如3.5
在pom.xml加入如下代码
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5</version>
</plugin>
</plugins>
</pluginManagement>