【问题标题】:Determining Maven execution phase within a plugin在插件中确定 Maven 执行阶段
【发布时间】:2011-04-14 09:06:31
【问题描述】:

我有一个插件可以转换已编译的类。模块的类和模块的测试类都需要进行这种转换。因此,我将插件绑定到 process-classes 和 process-test-classes 阶段。我遇到的问题是我需要确定插件当前在哪个阶段执行,因为我没有(实际上不能)将同一组类转换两次。

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

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

似乎我可以从我的模块中获得的东西应该能够告诉我当前阶段是什么。我这辈子都无法弄清楚那是什么东西。

谢谢...

【问题讨论】:

  • @Pascal Thivent 用于僵尸进程和僵尸计算机 :)
  • @Colin 是的,我明白了,但我看不出与这个问题有任何关系。
  • 我想添加标签zombies-ate-my-brain但我没有任何代表,所以我选择了zombies

标签: maven-2 maven-plugin


【解决方案1】:

因此,在插件中,我需要知道我是在执行流程类 (...) 还是在执行流程测试类

AFAIK,这是not really possible

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

我认为让两个 Mojo 共享代码但绑定到不同的阶段没有任何问题。类似于 Maven 编译器插件(以及它的 compiler:compilecompiler:testCompile 目标)。

【讨论】:

  • 嗯,J 博士的回答非常明确。我必须说这看起来很奇怪,但是什么evs...感谢您的快速回答。
  • 我还发现 AspectJ 编译器 Maven 插件与我需要做的事情相同,所以我将看看他们是如何处理这个问题的。
  • 所以,AspectJ 编译器使用的模式适合我。对于后代,我只是在我的插件中创建了两个 Mojo,一个用于流程类,一个用于流程测试类。这个解决方案不需要另一个插件(这是我主要担心的)。
  • 你不能从 MavenExecutionRequest 中获取吗?当然我问的是如何得到那个对象。
  • 是的,在我实现的几乎所有 Maven 插件中,都有一个 AbstractXyzMojo、一个 CompileXyzMojo 和一个 TestCompileXyzMojo。我猜这是 Maven 插件开发的标准 (+1)
【解决方案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 想要使用特定的模式时,不想违背常规。
【解决方案3】:

Java插件代码sn-ps:

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(不是作为生命周期的一部分)时,execution.getLifecyclePhase() 将返回 null,例如mvn plugin-name:mojo-name.
猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多