我刚刚注意到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如何确定采取哪个版本?
自动插件版本解析
当一个插件在POM或命令行中没有给出明确的版本时,Maven 2.x会选择可用的最新版本,而最新版本可以是发布版本或快照版本。为了稳定起见,Maven 3.x更倾向于使用最新的发布版本,而不是最新的快照版本。
考虑到自动插件版本解析对不可复制的构建造成的威胁,就POM中的插件声明而言,这一功能将被取消。Maven 3.x的用户会发现,当检测到缺失的插件版本时,它会输出一个警告,以鼓励将插件版本添加到POM或其父POM中。Enforcer规则requirePluginVersions可以用来额外检查POM中是否有丢失的插件版本。
如果你检查到 maven-metadata.xml
文件,你会看到类似这样的内容。
<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 "或类似的东西。 你应该总是指定插件的版本,这样你的构建才是可重复的。 否则你可能最终会发现一些非常难以发现的bug。
maven有几个步骤来解决插件版本问题。它的记录如下 Resolving Plugin Versions
的部分http:/maven.apache.orgguidesintroductionintroduction-to-plugin-registry.html。
自本帖发表7年以来,文件似乎已经被转移。它可以在 Maven 3.x 兼容性说明 正如@ceilfors在回答中提到的。