【问题标题】:Maven plugin version in pom (seemingly) ignoredpom中的Maven插件版本(似乎)被忽略了
【发布时间】:2017-11-06 20:14:15
【问题描述】:

我注意到 Maven 输出报告的插件版本号与我在 pom 文件中指定的不同。

例如,在我的 pom 中,我指定了 3.1 的编译器插件版本

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.1</version>
</plugin>

但是当 Maven 运行(打包、安装...随便)时,它会输出它使用 2.3.2 版本的编译器插件

[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile)

是否有一些全局 maven 设置文件胜过本地 pom 文件配置?

【问题讨论】:

    标签: maven-3


    【解决方案1】:

    更新

    Plugin management 是一种共享插件默认配置(来自父项目或同一项目)的机制,它会被您的 effective pom build plugins 部分中的值覆盖,因此这不是解决方案。

    可能是您的 pom 中有一个配置文件被激活并覆盖了插件版本值(请参阅下面的调试,阅读您的有效 pom)。注释掉(&lt;!----&gt;)你的 pom 中的配置文件节点,如果是,则重新运行构建。

    如果是这个原因,您可以deactivate the profile in your pom 或从命令行运行时附加-P !&lt;PROFILE_NAME&gt;-P \!&lt;PROFILE_NAME&gt; for linux。

    更具体地说,如果您的 pom 看起来像这样:

    <project>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>someGroupId</groupId>
                        <artifactId>someArtifactId</artifactId>
                        <version>versionFromPluginManagement</version>
                ...
            </pluginManagement>
            <plugins>
                <plugin>
                    <groupId>someGroupId</groupId>
                    <artifactId>someArtifactId</artifactId>
                    <version>versionFromPlugins</version>
                  ...
        </build>
        <profiles>
            <profile>
                <activation>
                    <activeByDefault>BOOLEAN_STRING</activeByDefault>
                </activation>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>someGroupId</groupId>
                            <artifactId>someArtifactId</artifactId>
                            <version>versionFromProfile</version>
            ...
      </project>
    

    工件someGroupId:someArtifactIdpluginManagementpluginsprofiles 部分中定义。 版本解析如下:

    • 如果versionFromPlugins 没有定义并且BOOLEAN_STRING是false,那么结果版本是versionFromPluginManagement
    • 如果versionFromPlugins 定义并且BOOLEAN_STRING是false,那么结果版本是versionFromPlugins
    • 如果 BOOLEAN_STRING 是 true,那么结果版本是 versionFromProfile

    如果不是这样,请运行:

    mvn help:effective-pom > pom.log
    mvn help:effective-settings > settings.log
    mvn -version > environment.log
    

    并在此处发布内容。

    原答案

    是否有一些全局 maven 设置文件胜过本地 pom 文件配置?

    Yes, there is。实际上至少有两个:maven 安装文件夹中的全局一个,本地存储文件夹旁边的每个用户。

    当您对您的项目运行 maven 时,它会使用您的 pom 文件插入这两个文件,并计算生成项目时将应用的结果。

    调试

    • mvn -X clean compile &gt; build.log - 运行带有-X(调试)命令行标志的详细输出的maven。由于有很多输出,建议将其(&gt;)通过管道传输到文件中。这在使用带有错误文档的插件时特别有用,因为您可以在执行之前查看所有插件属性及其实际值。
    • mvn @987654326@ &gt; pom.log 计算构建项目时将应用的 pom。它还显示活动的配置文件。
    • mvn @987654327@ &gt; settings.log 计算将在构建项目时应用的设置

    首先检查您的有效 pom,然后调试输出,最后检查有效设置。

    环境

    在极少数情况下,问题可能出在环境中。您必须知道 maven 使用 java,因此您需要这些来了解您的实际环境:

    • java -version
    • mvn -version

    Maven 通过以下环境变量 (see its install instructions) 了解其环境:

    • M2_HOME - maven 安装文件夹根目录的绝对路径
    • M2 - 上面的 bin 文件夹,这是 maven 可执行文件所在的位置
    • JAVA_HOME - JDK 安装文件夹根目录的绝对路径 - 通过更改此值,您可以更改 Maven 使用的 Java

    当然,所有三个变量都必须在PATH environment variable 中。

    【讨论】:

      【解决方案2】:

      定义这样的东西最好是像这样使用pluginManagement:

      <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                            http://maven.apache.org/xsd/maven-4.0.0.xsd">
        ...
        <build>
          ...
          <pluginManagement>
            <plugins>
              <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
              </plugin>
            </plugins>
          </pluginManagement>
          ...
        </build>
      </project>
      

      这应该可以解决你的问题,但我不能 100% 确定,因为我没有完整的 pom 文件。

      【讨论】:

      • pluginMangement 的值被对应插件的有效 pom 插件部分中的值覆盖,所以不是这样(试试看):)
      • 什么意思?插件本身没有 pluginManagement pom。它应该放在你的 pom 文件中(可能在你的项目的父级中)。
      • 如果一个 pom 有 pluginmanagement (pm) 并且在它的 plugins (ps) 中定义了一个带有 group/artifact/version (gav) 集的插件 (p),并且在 build.ps 中定义了一个 p和 pm.ps.p.g === b.ps.p.g 和 pm.ps.p.a === b.ps.p.a 然后 b.ps.p.v 覆盖 pm.ps.p.v 而不是反之亦然。如果 pom 中有一个 active 配置文件 (pr),其定义的 b.ps.p 具有相同的 g 和 a,则 pr.b.ps.p.v 会覆盖 b.ps.p.v。对不起,缩写,否则不适合评论。
      【解决方案3】:

      如果您在同一个mvn 调用中运行versions:setpackage(或任何消耗目标),Maven 似乎会忽略设置的版本。但是在单独的调用中运行它们是可行的。

      换句话说,这有效(至少对我来说):

      mvn -DnewVersion=0.0.2 versions:set
      mvn package
      

      这不起作用:

      mvn -DnewVersion=0.0.2 versions:set package
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2016-09-30
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        相关资源
        最近更新 更多