3

在网上的很多地方,我看到它讨论过要使 maven 构建可重现,明确指定所有使用的插件的版本号很重要,这样更新的插件就不会破坏构建。推荐的方法似乎是使用强制插件。以下是我在网上找到的复制和粘贴设置。

<execution>
    <id>enforce-plugin-versions</id>
    <goals>
        <goal>enforce</goal>
    </goals>
    <configuration>
        <rules>
            <requirePluginVersions>
                <message>Best Practice is to always define plugin versions!</message>
                <banLatest>true</banLatest>
                <banRelease>true</banRelease>
                <banSnapshots>true</banSnapshots>
                <phases>clean,deploy,site</phases>
                <additionalPlugins>
                    <additionalPlugin>org.apache.maven.plugins:maven-eclipse-plugin</additionalPlugin>
                    <additionalPlugin>org.apache.maven.plugins:maven-reactor-plugin</additionalPlugin>
                </additionalPlugins>
                <unCheckedPluginList>org.apache.maven.plugins:maven-enforcer-plugin,org.apache.maven.plugins:maven-idea-plugin</unCheckedPluginList>
            </requirePluginVersions>
        </rules>
    </configuration>
</execution>

当我运行 pom 时,我从强制插件插件中收到以下错误。

[INFO] --- maven-enforcer-plugin:1.1.1:enforce (enforce-plugin-versions) @ seedling ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequirePluginVersions failed with message:
Some plugins are missing valid versions:(LATEST RELEASE SNAPSHOT are not allowed )
org.apache.maven.plugins:maven-clean-plugin.    The version currently in use is 2.4.1
org.apache.maven.plugins:maven-deploy-plugin.   The version currently in use is 2.7
org.apache.maven.plugins:maven-install-plugin.  The version currently in use is 2.3.1
org.apache.maven.plugins:maven-site-plugin.     The version currently in use is 3.0
org.apache.maven.plugins:maven-reactor-plugin.  The version currently in use is 1.0
org.apache.maven.plugins:maven-eclipse-plugin.  The version currently in use is 2.9
Best Practice is to always define plugin versions!

在我看来,一些插件,如 maven-clean-plugin、maven-install-plugin、maven-reactor-plugin 是 maven 的核心核心部分,我应该将这些“核心”插件的版本绑定到我正在使用的 Maven 版本。

我的问题:

  1. 插件版本是否与 Maven 本身在同一发布周期?
  2. 是否有一组核心 Maven 插件组成一个 Maven 版本?如果是,如何获取 Maven 版本的此类插件列表?
  3. 当我看到诸如 3.0.4 之类的 maven 版本时,该版本是否包含一些核心插件,或者它是否总是会获得最新的插件,例如在 maven 3.0.4 发布之后发布的 reactor?
  4. 有没有办法说 maven 使用在 3.0.4 发布时发布的插件?
  5. 如何表示不同插件版本之间的兼容性,是否有一些插件普遍遵循的约定,例如所有次要 2.x 都相互兼容但 3.x 与 2.x 不兼容?
  6. 指定插件版本号的做法真的是最好的害虫做法还是只是矫枉过正?
4

2 回答 2

3

Maven将一些插件绑定到它的生命周期阶段,例如maven-compiler-plugin到compile阶段,maven-install-plugin到install阶段等等。这些是您所说的“maven 的核心中心部分”的插件。但是,这些插件有一个单独的发布周期。例如,看一下绑定到 mavendeploy生命周期阶段的 maven-deploy-plugin。最新版本(2.7)是在 2011 年 10 月,而最新的 Maven 版本(3.0.4)是在 2012 年 1 月。另一个例子是 maven-compiler-plugin,它的最新版本是 2012 年 6 月,距离 Maven 发布半年3.0.4。

特别要回答您的问题:

  1. 不,他们不是。每个插件都有自己的发布周期。请参阅上面的示例。
  2. 有各种插件绑定到 Maven 的特定于包的生命周期阶段。您可以将这些视为“核心 maven 插件”。查看maven book以获取完整列表。
  3. 如果您没有在 POM 文件中指定插件版本,maven 将使用每个使用的插件的最新版本。
  4. 不需要。如果您有此要求,您可以在http://search.maven.org上找到插件的发布日期,并将它们与最新版本的 Maven 进行比较。但这不是必需的,如果您在 POM 文件中指定每个使用的插件的版本,并且 maven 会为您生成正确的工件。
  5. There are no compatibility problems (at least no problems that I know of) between different maven plugins. For different version of the same plugin, you have to try it and see if your specific project works with a new version of a plugin.
  6. If you want reproducible builds, it's a must.
于 2012-11-01T21:31:03.720 回答
2

这里是问题列表的答案:

  1. 没有。Maven 本身有一个小内核,但内核中没有插件。如果需要,将在运行期间下载所有插件。在 Maven 2 中,maven 的某些部分随 Maven 本身(站点生成的一部分)一起发布,而这些部分已随 Maven 3 进行了更改。
  2. 没有一个 Maven 版本包含一个超级 pom,其中包含一些插件版本等的定义,但只能通过超级 pom。
  3. 不,您不能仅通过版本来定​​义发布时间。
  4. 不同的插件由不同的社区/人维护,他们对版本及其与 maven 版本的关系有不同的看法。通常,适当插件的站点会记录下来(例如 maven-site-plugin)。
  5. 是的,它适用于不同的 Maven 版本,没有任何问题。
于 2012-11-01T21:29:08.387 回答