我刚刚注意到插件的版本在maven中是可选的。我仍然可以构建我的模块而不指定它。让我们以maven-bundle-plugin为例。
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
....
</plugin>
我编写了一个简单的pom.xml而没有父亲来试试这个,所以不涉及pluginManagement。我还检查了maven-model-builder中的超级超级pom-4.0.0.xml,以确认maven-bundle-plugin不存在。此插件版本未在任何地方指定。
maven如何确定要采用的版本?
答案 0 :(得分:14)
来自Maven 3.x Compatibility Notes:
自动插件版本解析
在没有POM中给出的显式版本的情况下调用插件时 或者在命令行中,Maven 2.x用于选择最新版本 最新版本可以是发布版本还是版本 快照。 为了稳定,Maven 3.x更喜欢最新的 发布最新快照版本的版本。
鉴于威胁 自动插件版本强加的不可重现的构建 分辨率,此功能计划删除至插件 POM中的声明令人担忧。 Maven 3.x的用户会找到它 检测到缺少插件版本时输出警告 鼓励添加插件版本到POM或其中一个 父母POM。可以使用Enforcer规则requirePluginVersions 另外检查POM中是否缺少插件版本。
答案 1 :(得分:3)
如果您检查远程存储库中的maven-metadata.xml
文件(例如Nexus)以及插件工件,您会看到如下内容:
<metadata>
<groupId>com.company.maven.plugins</groupId>
<artifactId>some-maven-plugin</artifactId>
<versioning>
<latest>0.3.6</latest>
<release>0.3.6</release>
<versions>
<version>0.1</version>
<version>0.2</version>
<version>0.3.0</version>
<version>0.3.1</version>
<version>0.3.2</version>
<version>0.3.4</version>
<version>0.3.5</version>
<version>0.3.6</version>
</versions>
<lastUpdated>20140414212942</lastUpdated>
</versioning>
</metadata>
我认为如果未指定版本,Maven可能会使用<latest>
值来决定下载哪个插件。
Maven 3.0.x对缺少的插件版本发出警告,并说“Maven的未来版本可能会拒绝构建像这样的格式错误的POM”或类似的东西。您应该始终指定插件版本,以便您的构建可重现。否则你最终会遇到一些很难发现的错误。
答案 2 :(得分:0)
maven遵循以下几个步骤来解决插件版本。它记录在Resolving Plugin Versions
部分中
http://maven.apache.org/guides/introduction/introduction-to-plugin-registry.html