2

我注意到 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 文件配置?

4

3 回答 3

4

更新

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

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

如果这是原因,您可以在您的 pom 中停用配置文件,或者在从命令行运行时仅附加-P !<PROFILE_NAME>-P \!<PROFILE_NAME>用于 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 文件配置?

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

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

调试

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

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

环境

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

  • java -version
  • mvn -version

Maven 通过以下环境变量了解其环境(请参阅其安装说明):

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

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

于 2013-08-23T11:41:05.623 回答
1

定义这种东西的最好方法是像这样使用 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 文件。

于 2013-08-23T11:03:30.073 回答
0

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

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

mvn -DnewVersion=0.0.2 versions:set
mvn package

这不起作用:

mvn -DnewVersion=0.0.2 versions:set package
于 2017-11-06T12:14:15.950 回答