如何在Maven中重命名目标?

时间:2010-04-29 10:04:26

标签: maven maven-2 maven-plugin

在Maven文档Introduction to the Build Lifecycle中,描述了display:time的目标,即输出当前时间。该插件如下:

...
<plugin>
  <groupId>com.mycompany.example</groupId>
  <artifactId>maven-touch-plugin</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>process-test-resources</phase>
      <goals>
        <goal>timestamp</goal>
      </goals>
    </execution>
  </executions>
</plugin>
...

我有几个与此插件有关的问题:

  1. 如何更改目标名称,例如foo:bar? (为什么displaytime都没有出现在XML片段的任何地方?从片段中看,它如何定义它定义的目标?)

  2. 如何手动运行此目标? (对于类似的结构,相当于mvn display:time有时会起作用,但这并不一致。)

  3. 如何查看此目标是否存在? (即列出可用目标; this question表明这是不可能的。)

4 个答案:

答案 0 :(得分:11)

  

如何更改目标名称,例如foo:bar? (为什么displaytime都不出现在XML片段的任何地方?从片段中看,它如何定义它定义的目标?)

准确地说,在foo:bar中,foo是“插件目标前缀”,bar是“目标”。虽然后者源于命名约定(或者可以是configured 1 ),但前者来自BarMojo的注释,即实现插件逻辑的类。像这样:

/**
 * Do the wonderful bar.
 * @goal bar
 * @requiresProject false
 */
public class BarMojo extends AbstractMojo
{
    ...
}

更改目标需要修改插件的mojo注释并重建它。

关于您链接到的文档,目标time与将timestamp目标绑定到process-test-resources阶段的XML片段之间明显不匹配。这必定是一个错字。

  

如何手动运行此目标? (对于类似的结构,相当于mvn display:time有时会起作用,但这不能一致地工作。)

您可以这样称呼它:

mvn com.mycompany.example:maven-touch-plugin:1.0:timestamp

您可以通过将com.mycompany.example添加到settings.xml中的Plugin Groups来缩短此命令,org.apache.maven.plugins默认声明org.codehaus.mojo,以防您怀疑它是如何为这些插件工作的)

<settings>
  ...
  <pluginGroups>
    <pluginGroup>com.mycompany.example</pluginGroup>
  </pluginGroups>
</settings>

然后,因为插件名称与${prefix}-maven-pluginmaven-${prefix}-plugin模式匹配,您可以执行:

mvn touch:timestamp 

建议遵循惯例,但正如我所说,前缀也可以是configured

  

如何查看此目标是否存在?

检查插件文档(从插件源派生)或插件源。


1 请注意,Maven Book提到的页面底部也有一个拼写错误。使用自定义前缀执行插件的方式应为 mvn blah:echo (请参阅MVNREF-145)。

答案 1 :(得分:2)

我认为文档可能有拼写错误。插件目标由plugin-name:goal-name指定。该XML会将目标touch:timestamp绑定到process-test-resources阶段。该片段与display:time没有任何关系。

  1. 据我所知,重建maven目标是不可能的。 (看起来它会让事情变得更加混乱。)插件源代码定义了目标,而不是pom。 &lt;执行&gt; pom中的标签只允许您将插件目标绑定到阶段,或者如果目标已经有默认阶段则重新绑定目标。

  2. 您应该可以使用prefix:goalName投放目标。通常,前缀只是artifactId中“maven-”和“-plugin”之间的任何内容。例如touch:timestamp。这在一些情况下很复杂,因为插件作者可以指定与插件名称不同的“goalPrefix”,但我从未遇到过这方面的问题。

  3. 找出插件定义的目标的最佳方法,以及默认情况下绑定的阶段是阅读插件文档。

答案 2 :(得分:0)

到你的第一个。目标的名称由插件定义(有一个注释)。如果有源代码,你可以改变它。 看一下XML,你不知道插件只定义了XML中给出的那些目标。最好的位置是查看插件的文档。 第二个:你必须检查文档。通常pluginname:goal ...可能你需要指定插件的完整路径(groupId)。 第三种:通常应该能够使用帮助插件来查看docs

答案 3 :(得分:0)

如何更改目标名称,例如foo:bar? (为什么XML片段中的任何地方都没有显示也没有时间?如何通过查看片段来定义它定义的目标?)

要将前缀名称更改为“foo”,您需要配置maven插件“plugin”。

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
        <goalPrefix>foo</goalPrefix>
    </configuration>
    </plugin>

要更改目标名称,您需要在插件java源代码中编辑javadoc

/**
 * Prints a timestamp to console
 *
 * @goal bar
 */
public class TimestampMojo extends AbstractMojo {
  // ...
}

将插件前缀添加到settings.xml文件

<pluginGroups>
  <pluginGroup>com.mycompany.example</pluginGroup>
</pluginGroups>

如何手动运行此目标?

mvn com.mycompany.example:foo:bar

或使用插件前缀设置(上图)

mvn foo:bar

我怎样才能看出这个目标是否存在? (即列出可用目标)

将以下内容添加到maven插件插件元素中,您可以使用foo:help打印出目标列表。

<plugin>
...
<executions>
<execution>
<id>generated-helpmojo</id>
<goals>
<goal>helpmojo</goal>
</goals>
</execution>
</executions>
</plugin>