在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>
...
我有几个与此插件有关的问题:
如何更改目标名称,例如foo:bar
? (为什么display
和time
都没有出现在XML片段的任何地方?从片段中看,它如何定义它定义的目标?)
如何手动运行此目标? (对于类似的结构,相当于mvn display:time
有时会起作用,但这并不一致。)
如何查看此目标是否存在? (即列出可用目标; this question表明这是不可能的。)
答案 0 :(得分:11)
如何更改目标名称,例如
foo:bar
? (为什么display
和time
都不出现在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-plugin
或maven-${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
没有任何关系。
据我所知,重建maven目标是不可能的。 (看起来它会让事情变得更加混乱。)插件源代码定义了目标,而不是pom。 &lt;执行&gt; pom中的标签只允许您将插件目标绑定到阶段,或者如果目标已经有默认阶段则重新绑定目标。
您应该可以使用prefix:goalName
投放目标。通常,前缀只是artifactId中“maven-”和“-plugin”之间的任何内容。例如touch:timestamp
。这在一些情况下很复杂,因为插件作者可以指定与插件名称不同的“goalPrefix”,但我从未遇到过这方面的问题。
找出插件定义的目标的最佳方法,以及默认情况下绑定的阶段是阅读插件文档。
答案 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>