Jac*_*k E 13 java maven maven-metadata
我正在使用Maven进行一些测试,并意识到我可以执行findbugs
Findbugs插件的目标,而无需将插件添加到POM文件中.另一方面,当我需要运行run
Jetty插件的目标时,我被迫将插件添加到POM文件或构建失败.
当我运行第一个命令时,构建成功,而POM文件没有任何更改:
mvn findbugs:findbugs
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building module-mytest 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- findbugs-maven-plugin:3.0.4:findbugs (default-cli) @ module-mytest ---
[INFO] Fork Value is true
[java] Warnings generated: 6
[INFO] Done FindBugs Analysis....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 24.165s
[INFO] Finished at: Sun Oct 23 18:40:26 WEST 2016
[INFO] Final Memory: 21M/111M
[INFO] -----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
但是当我运行第二个时,我得到了这个:
mvn jetty:run
[INFO] Scanning for projects...
Downloading: http://repo.maven.apache.org/maven2/org/codehaus/mojo/maven-metadata.xml
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml (13 KB at 30.0 KB/sec)
Downloaded: http://repo.maven.apache.org/maven2/org/codehaus/mojo/maven-metadata.xml (20 KB at 41.0 KB/sec)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.129s
[INFO] Finished at: Sun Oct 23 18:43:27 WEST 2016
[INFO] Final Memory: 12M/104M
[INFO] ------------------------------------------------------------------------
[ERROR] No plugin found for prefix 'jetty' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/home/hp-pc/.m2/repository), central (http://repo.maven.apache.org/maven2)] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException
Run Code Online (Sandbox Code Playgroud)
因此,为了传递构建,我需要将以下内容添加到pom文件中:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.11.v20150529</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)
Tun*_*aki 40
您刚刚遇到了Maven 的插件前缀解析.这是一个允许用户通过使用其前缀来调用特定Maven插件的目标的功能.在命令行上直接调用目标时,可以使用功能齐全的形式:
mvn my.plugin.groupId:foo-maven-plugin:1.0.0:bar
Run Code Online (Sandbox Code Playgroud)
这将调用bar
具有坐标my.plugin.groupId:foo-maven-plugin:1.0.0
(以形式groupId:artifactId:version
)的Foo Maven插件的目标.它运作良好,但有点冗长.如果不指定所有这些坐标,以更简单的方式调用此目标会很好.Maven通过为插件分配前缀来实现这一点,因此您可以引用此前缀而不是整个坐标,其中:
mvn foo:bar
^^^ ^^^
| |
prefix |
|
goal
Run Code Online (Sandbox Code Playgroud)
您可以为每个Maven插件定义前缀.这对应于用于标识它的简单名称:
要使用的传统工件ID格式是:
maven-${prefix}-plugin
- 对于由Apache Maven团队自己维护的官方插件(您不得对插件使用此命名模式,请参阅此说明以获取更多信息)${prefix}-maven-plugin
- 来自其他来源的插件如果您的插件的artifactId符合此模式,Maven将自动将您的插件映射到存储库中插件的groupId路径中存储的元数据中的正确前缀.
换句话说,如果您的插件的工件ID被命名foo-maven-plugin
,Maven将自动为其分配前缀foo
.如果您不想进行此默认分配,您仍可以借助maven-plugin-plugin
其goalPrefix
参数配置自己的分配.
在命令中
mvn foo:bar
Run Code Online (Sandbox Code Playgroud)
Maven必须有办法推断出foo
实际意味着什么my.plugin.groupId:foo-maven-plugin
.在该settings.xml
文件中,您可以添加以下形式的插件组:
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
Run Code Online (Sandbox Code Playgroud)
这样做,告诉Maven当你在命令中使用前缀时应该考虑哪个组ID.默认情况下,除了设置中指定的组之外,Maven还会搜索组ID org.apache.maven.plugins
和org.codehaus.mojo
.它会在您在设置中配置的默认值之后搜索这些默认值.因此,通过上面的配置和命令mvn foo:bar
,Maven将寻找具有foo
组ID内部前缀的插件org.mortbay.jetty
,org.apache.maven.plugins
和org.codehaus.mojo
.
第二步是如何实际执行搜索.Maven将从maven-metadata.xml
这些组ID的每个远程存储库下载元数据文件(或者将它们查看到已经下载的本地存储库中).如果我们举例说明我们唯一的远程存储库是Maven Central,Maven将首先下载http://repo1.maven.org/maven2/org/mortbay/jetty/maven-metadata.xml
,如果我们有一些映射,请查看此文件foo
.请注意组ID是如何转换为远程存储库中的目录结构的.此元数据文件的结构是:
<metadata>
<plugins>
<plugin>
<name>Some Awesome Maven Plugin</name>
<prefix>somePrefix</prefix>
<artifactId>some-maven-plugin</artifactId>
</plugin>
</plugins>
</metadata>
Run Code Online (Sandbox Code Playgroud)
如果该<plugin>
部分中没有一个包含<prefix>
等于我们指定的部分(foo
),则Maven将继续使用下一个组ID,命中http://repo1.maven.org/maven2/org/codehaus/mojo/maven-metadata.xml
.同样,如果没有找到,Maven将最终命中http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-metadata.xml
(注意命令中的Downloading:
日志mvn jetty:run
,准确地获取最后两个文件).如果仍然找不到任何东西,Maven就不能再为你做什么,而且会出错:
[ERROR]在当前项目和插件组[org.mortbay.jetty,org.apache.maven.plugins,org.codehaus.mojo]中找不到前缀'foo'的插件,可从存储库[local(.. ./.m2/repository),central(http://repo.maven.apache.org/maven2)] - > [帮助1]
这是你在这里的错误.但是,如果在此搜索期间进行了一次匹配,则Maven可以推断出<artifactId>
要使用的匹配.
它现在意味着它具有组ID和工件ID.最后一块拼图是版本
除非在POM中明确配置,否则Maven将采用最新的一个(参见下一节).通过获取另一个仍被调用的元数据文件来检索所有可能的版本maven-metadata.xml
,但这次与存储库中的工件id文件夹一起生存(与上面的文件夹文件文件夹相反,它与组ID一起).以Maven Clean插件为例(其组ID和工件id将通过上述机制和命令找到mvn clean:clean
),maven-metadata.xml
看起来像:
<metadata>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<versioning>
<latest>3.0.0</latest>
<release>3.0.0</release>
<versions>
<version>2.0-beta-1</version>
<version>2.0-rc1</version>
<version>2.0</version>
<version>2.1</version>
<!-- more versions -->
<version>3.0.0</version>
</versions>
<lastUpdated>20151022205339</lastUpdated>
</versioning>
</metadata>
Run Code Online (Sandbox Code Playgroud)
Maven 将选择版本作为<release>
版本,代表插件的最新版本.如果该标记不存在,它将选择<latest>
代表插件,发行版或快照的最新版本的标记.可能会发生两个标签都不存在,在这种情况下,Maven 将选择<version>
元素列表的第一个版本或缺少版本的第一个快照.
如果仍然失败,Maven就不能再为你做什么,版本无法推断出来并且错误.但这不太可能发生.我们现在收集了组ID,工件ID和版本; 是时候最终调用bar
插件的目标了.
如上所述,Maven查看活动远程存储库中的某些预定义组ID以查找具有给定前缀的匹配项.用命令
mvn findbugs:findbugs
Run Code Online (Sandbox Code Playgroud)
Maven用findbugs
前缀开始搜索.由于我们的配置<pluginGroup>
在我们的设置中没有任何设置,因此Maven会查找前缀匹配org.codehaus.mojo
和org.apache.maven.plugins
组ID.
它确实找到了一个:Findbugs Maven插件以org.codehaus.mojo
组ID发布; 事实上,你可以在maven-metadata.xml
:
<plugin>
<name>FindBugs Maven Plugin</name>
<prefix>findbugs</prefix>
<artifactId>findbugs-maven-plugin</artifactId>
</plugin>
Run Code Online (Sandbox Code Playgroud)
您还可以在刚刚推断出的maven-metadata.xml
文件中找到将要使用的版本findbugs-maven-plugin
(在撰写本文时为3.0.4;并注意它与mvn findbugs:findbugs
您的问题日志中的版本完全匹配).所以解决方案成功了,然后Maven可以继续调用findbugs
这个插件的目标.
第二个例子是命令
mvn jetty:run
Run Code Online (Sandbox Code Playgroud)
和以前一样,相同分辨率的步骤发生,但是,在这种情况下,你会发现,前缀<jetty>
没有出现在任何maven-metadata.xml
的组ID org.codehaus.mojo
和org.apache.maven.plugins
.因此解析失败,Maven返回您所拥有的错误.
但是我们已经看到了如何让它发挥作用!我们可以<pluginGroup>
在设置中添加内容,以便在解析期间也可以搜索此组ID.该码头Maven插件是组ID下发布org.eclipse.jetty
的,如果我们窥视到相应maven-metadata.xml
的Maven的中央,你会发现<prefix>jetty</prefix>
在那里.因此修复很简单:只需定义此新组ID即可在设置中进行搜索:
<pluginGroups>
<pluginGroup>org.eclipse.jetty</pluginGroup>
</pluginGroups>
Run Code Online (Sandbox Code Playgroud)
现在,Maven还将调查此组ID,并将jetty
前缀与org.eclipse.jetty:jetty-maven-plugin
成功匹配.
当然,如果您在POM中明确定义插件,则可以侧面跟踪所有此分辨率,这是您找到的另一个解决方案:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.11.v20150529</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)
并使用
mvn jetty:run
Run Code Online (Sandbox Code Playgroud)
如果您直接在POM中配置插件,前缀解析仍然会发生,但它有点掩盖:Maven将从配置的远程存储库下载插件,并将下载并安装所有元数据文件,包括maven-metadata.xml
包含映射前缀jetty
.因此,自动下载后,搜索总会成功.
另请注意,由于插件是在POM中定义的,<pluginGroup>
因此设置中不需要任何插件:组ID是在POM中编写的.此外,它确保将使用版本9.2.11.v20150529,而不是最新版本.
归档时间: |
|
查看次数: |
31023 次 |
最近记录: |