如何在Maven插件的非Mojo类中使用@Parameter注解
Maven插件嵌套Bean中@Parameter注解注入失效问题
我了解@Parameter注解可直接在Mojo类中使用,根据官方文档说明:注入Mojo参数的Bean由基于JSR330的Sisu容器处理,该注解仅在Mojo类自身的字段上生效,嵌套Bean注入需要使用Sisu或JSR330注解。但我尝试了多种方法(如下方MyParam类示例)均无法让嵌套Bean中的字段获得注入值:
问题代码示例
Java代码
/* MyParam */ @ToString @Setter @Getter public class MyParam { // 无效 @Parameter(defaultValue = "${project.build.outputDirectory}") private String outputDir0; // 无效 @Inject @Parameter(defaultValue = "${project.build.outputDirectory}") private String outputDir1; // 无效 @Parameters @Parameter(defaultValue = "${project.build.outputDirectory}") private String outputDir2; } /* mojo */ @Getter @Setter @Mojo(name = "my-mojo", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, threadSafe = true) public class MyMojo extends AbstractMojo { @Parameter(required = true) private MyParam myParam; // 有效 @Parameter(defaultValue = "${project.build.outputDirectory}", required = true) protected String outputDirectory; public void execute() throws MojoExecutionException { getLog().info(String.format("myParam: %s", myParam)); getLog().info(String.format("outputDirectory: %s", outputDirectory)); } }
pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx</groupId> <artifactId>my-mojo-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <packaging>maven-plugin</packaging> <name>my-mojo-maven-plugin</name> <description>my-mojo-maven-plugin</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <javaVersion>8</javaVersion> <maven.compiler.source>${javaVersion}</maven.compiler.source> <maven.compiler.target>${javaVersion}</maven.compiler.target> <maven-plugin.version>3.8.1</maven-plugin.version> <maven-plugin-annotations.version>3.10.2</maven-plugin.version> <lombok.version>1.18.30</lombok.version> <junit.version>4.13.2</junit.version> <slf4j.version>2.0.13</slf4j.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>${maven-plugin.version}</version> </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>${maven-plugin-annotations.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>3.10.2</version> <configuration> <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> </configuration> <executions> <execution> <id>generate-helpgoal</id> <goals> <goal>helpmojo</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
插件使用配置
<plugin> <groupId>com.xmcx</groupId> <artifactId>my-mojo-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <phase>process-resources</phase> <goals> <goal>my-mojo</goal> </goals> <id>my-mojo</id> <configuration> <myParam> </myParam> </configuration> </execution> </executions> </plugin>
解决方法
要让嵌套Bean中的@Parameter注解生效,核心是让Sisu容器能识别并管理嵌套Bean,具体步骤如下:
1. 给嵌套Bean添加JSR330注解
给MyParam类添加@javax.inject.Named注解,让Sisu容器识别并处理该Bean的参数注入:
@ToString @Setter @Getter @Named // 添加JSR330的Named注解 public class MyParam { // 现在可正常注入默认值 @Parameter(defaultValue = "${project.build.outputDirectory}") private String outputDir; }
2. 移除无效的注解组合
不要同时使用@Inject和@Parameter,也无需使用@Parameters注解(该注解用于标记方法参数,而非字段)。
3. 确保依赖完整
如果项目中没有JSR330的依赖,需要添加以下依赖(通常Maven插件API会间接依赖,但显式添加更稳妥):
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> <scope>provided</scope> </dependency>
原理说明
- Mojo类本身由Maven插件容器直接处理,所以类中的@Parameter注解可直接生效。
- 嵌套Bean不属于Mojo类的直接字段,需要由Sisu容器管理,因此必须添加JSR330的注解(如@Named)让Sisu识别该Bean。
- Sisu容器接管嵌套Bean后,会处理其中的@Parameter注解,完成Maven参数(包括表达式默认值)的注入。
内容的提问来源于stack exchange,提问作者xmcx
相关产品推荐
相关产品推荐

