如何在Maven中重命名目标?

问题描述 投票:9回答:4

在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表示这是不可能的。)
maven maven-2 maven-plugin
4个回答
11
投票

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

确切地说,在foo:bar中,foo是“插件目标前缀”,bar是“目标”。虽然后者源于命名约定(或者可以是configured1),但前者来自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添加到Plugin Groups中的settings.xml来缩短此命令(org.apache.maven.pluginsorg.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)。


2
投票

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

  1. 据我所知,重新命名maven目标是不可能的。 (看起来它会让事情变得更加混乱。)插件源代码定义了目标,而不是pom。 pom中的<executions>标签仅允许您将插件目标绑定到阶段,或者如果目标已经具有默认阶段则重新绑定目标。
  2. 你应该能够用prefix:goalName来实现目标。通常,前缀只是artifactId中“maven-”和“-plugin”之间的任何内容。例如touch:timestamp。这在一些情况下很复杂,因为插件作者可以指定与插件名称不同的“goalPrefix”,但我从未遇到过这方面的问题。
  3. 找出插件定义的目标的最佳方法,以及它们默认绑定的阶段是阅读插件文档。

0
投票

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


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>
© www.soinside.com 2019 - 2024. All rights reserved.