如何从Maven中的另一个插件继承Mojo

时间:2016-07-05 10:45:50

标签: java maven maven-plugin

我尝试从Maven继承默认的CompilerMojo并以newcompile目标执行此新Mojo。

我的设置:

{ - 1}} new-compiler-plugin

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>test.plugins</groupId> <artifactId>new-compiler-plugin</artifactId> <version>1.0-SNAPSHOT</version> <packaging>maven-plugin</packaging> <dependencies> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>3.0.5</version> </dependency> </dependencies> </project>

NewCompilerMojo.java

所以我创建了第二个Maven项目来测试import org.apache.maven.plugin.compiler.CompilerMojo; /** * Goal which touches a timestamp file. * * @goal newcompile * * @phase compile */ public class NewCompilerMojo extends CompilerMojo { } 。它的pom.xml看起来像这样:

new-compiler-plugin

现在我使用<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>test.plugins</groupId> <artifactId>test-new-compiler-plugin</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>test.plugins</groupId> <artifactId>new-compiler-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <goal>newcompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>

运行mvn clean package -e
test-new-compiler-plugin

显然,Maven没有从Maven初始化原始Caused by: java.lang.NullPointerException at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:481) at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 中的@Component@Parameter变量。

有人知道如何解决这个问题,或者是否可以从另一个插件的Mojo继承这种方式?

我添加了完整的POM,并且我正在使用这个确切的代码获取NullPointer(使用Maven 3.0.5)。 整个想法是覆盖execute方法以启动记录器并通过调用super execute方法记录编译目标期间的所有输出(尤其是警告)。之后在站点阶段生成报告。

1 个答案:

答案 0 :(得分:3)

问题是您在Javadoc中使用@goal@phase标记而不是using annotations声明了您的MOJO。 maven-compiler-plugin正在使用注释来配置自身,因此您还需要使用它们:

  

使用注释,您的Mojo超类不再需要在同一个项目中。如果超类也使用注释,它现在可以来自反应堆项目或外部依赖项。

将以下依赖项添加到Maven插件的POM中:

<dependency>
    <groupId>org.apache.maven.plugin-tools</groupId>
    <artifactId>maven-plugin-annotations</artifactId>
    <version>3.4</version>
    <scope>provided</scope>
</dependency>

并使用

进行配置
import org.apache.maven.plugin.compiler.CompilerMojo;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.ResolutionScope;

@Mojo(name = "newcompile", defaultPhase = LifecyclePhase.COMPILE, requiresDependencyResolution = ResolutionScope.COMPILE)
public class NewCompilerMojo extends CompilerMojo {

}

重新安装Maven插件并在示例项目中对其进行测试,日志显示它已被正确调用:

[INFO] --- new-compiler-plugin:1.0-SNAPSHOT:newcompile (default) @ test ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 3 source files to ...\target\classes