我注意到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文件配置?
答案 0 :(得分:4)
Plugin management是一种共享插件默认配置(来自父项目或同一项目)的机制,它会被effective pom build plugins
部分中的值覆盖,因此不会解决方案。
可能是你的pom中有一个被激活的配置文件,它会覆盖插件版本值(请参阅下面的debug,阅读你的有效pom)。注释掉(<!--
,-->
)pom中的配置文件节点,然后重新运行构建。
如果这是原因,您可以deactivate the profile in your pom或从命令行运行时只需为{1.6}添加-P !<PROFILE_NAME>
或-P \!<PROFILE_NAME>
。
更具体地说,如果您的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:someArtifactId
在pluginManagement
,plugins
和profiles
部分中定义。
版本解析如下:
versionFromPlugins
未定义且BOOLEAN_STRING为 false
,则生成的版本为versionFromPluginManagement
versionFromPlugins
,且BOOLEAN_STRING为 false
,则生成的版本为versionFromPlugins
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 > 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通过以下环境变量(see its install instructions)了解其环境:
M2_HOME
- maven安装文件夹根目录的绝对路径M2
- 上面的bin
文件夹,即maven可执行文件的位置JAVA_HOME
-absoulte JDK安装文件夹根目录的路径 - 通过更改此值可以更改Maven使用的Java 当然,所有三个变量都必须在PATH environment variable。
中答案 1 :(得分: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>
这可以解决你的问题,但我不是百分百肯定,因为我没有完整的pom文件。
答案 2 :(得分:0)
如果您在同一versions:set
次调用中运行package
和mvn
(或任何消费目标),Maven似乎会忽略设置版本。但是在单独的调用中运行它们会起作用。
换句话说,这适用于(至少对我来说):
mvn -DnewVersion=0.0.2 versions:set
mvn package
这不起作用:
mvn -DnewVersion=0.0.2 versions:set package