在插件中确定Maven执行阶段

16

我有一个插件,可以转换编译后的类。这个转换需要同时针对模块的类和测试类进行。因此,我将该插件绑定到process-classes和process-test-classes阶段。我的问题是,我需要确定插件当前执行的是哪个阶段,因为我不能重复转换同一组类。

因此,在插件内部,我需要知道是否正在执行process-classes阶段-这种情况下,我会转换模块的类。或者如果我正在执行process-test-classes阶段-在这种情况下,我不会转换模块的类,只会转换模块的测试类。

当然,我可以为此创建两个插件,但这种解决方案深深地触犯了我的感性,并且可能违反了几个州的法律。

看起来像是我可以从我的模块中获得一些信息来告诉我当前阶段是什么。 我只是无论如何都找不出那个信息所在的位置。

谢谢...


@Pascal Thivent 针对僵尸进程和僵尸计算机 :) - Colin Hebert
@Colin 是的,我明白了,但我没有看到与问题有任何关系。 - Pascal Thivent
我想添加标签“zombies-ate-my-brain”,但我没有任何声望,所以我选择了“zombies”。 - Hellblazer
3个回答

9

因此,在插件内部,我需要知道我是否正在执行 process-classes(...)还是正在执行 process-test-classes。

据我所知,这并不是真正可能的

当然,我可以为此创建两个插件,但这种解决方案深深地冒犯了我的感官,并且在几个州可能违法。

我认为,让两个 Mojos 共享代码但绑定到不同的阶段没有任何问题。就像 Maven 编译器插件(及其compiler:compilecompiler:testCompile目标)一样。


嗯,J博士的回答非常明确。我必须说那似乎相当奇怪,但无论如何...感谢您的快速回答。 - Hellblazer
我也发现AspectJ编译器的Maven插件可以实现我所需的功能,因此我打算看看他们是如何处理的。 - Hellblazer
所以,AspectJ编译器使用的模式对我很有效。为了后代,我只需在我的插件中创建两个Mojo,一个用于process-classes,另一个用于process-test-classes。这个解决方案不需要另一个插件(这是我最担心的)。 - Hellblazer
1
是的,在我实现的几乎所有 Maven 插件中,都有一个 AbstractXyzMojo、一个 CompileXyzMojo 和一个 TestCompileXyzMojo。我想这是 Maven 插件开发的标准(+1)。 - Sean Patrick Floyd
@seanizer 是的,完全正确,我也是这样。 - Pascal Thivent
显示剩余2条评论

2

您无法获取阶段,但可以获取作为单独执行ID的内容。在插件中:

/** 
 * @parameter expression="${mojoExecution}" 
 */
private org.apache.maven.plugin.MojoExecution execution;

...

public void execute() throws MojoExecutionException
{
    ...
    System.out.println( "executionId is: " + execution.getExecutionId() );
}

我不确定这是否适用于Maven 3。


谢谢。我刚刚使用了AspectJ使用的模式,它完美地运行了。当Maven想要使用特定的模式时,不想违背潮流。 - Hellblazer

2

Java插件代码片段:

import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugins.annotations.Component;

...

@Component
private MojoExecution execution;
...
execution.getLifecyclePhase()

使用Maven依赖项(您的版本可能会有所不同):
<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-plugin-api</artifactId>
  <version>3.3.1</version>
</dependency>
<dependency>
  <groupId>org.apache.maven.plugin-tools</groupId>
  <artifactId>maven-plugin-annotations</artifactId>
  <version>3.4</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-core</artifactId>
  <version>3.3.1</version>
</dependency>

这仅在mojo作为生命周期的一部分被调用时有效,例如mvn plugin-name:mojo-name。如果直接调用mojo(不作为生命周期的一部分),则 execution.getLifecyclePhase() 将返回 null - scrutari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接