2013-08-20 42 views
1

我注意到Maven输出报告的插件版本号与我在pom文件中指定的版本号不同。pom中的Maven插件版本(似乎)被忽略

例如,在我的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文件配置?

回答

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文件。

+0

从pluginMangement价值得到由一个在有效POM插件部分重写为相应的插件,所以这不是(试试吧):) – linski

+0

你是什么意思?该插件本身没有pluginManagement pom。它应该放在你的pom文件中(可能在你项目的父项目中)。 – khmarbaise

+0

如果一个pom拥有pluginmanagement(pm)并且在它的插件(ps)中定义了一个带有组/工件/版本(gav)集的插件(p),并且在build.ps和pm.ps.pg = == b.ps.pg和pm.ps.pa === b.ps.pa然后b.ps.pv覆盖pm.ps.pv,而不是相反。如果在pom中有一个**活动**配置文件(pr),并且具有相同g和a的定义b.ps.p,则pr.b.ps.p.v将覆盖b.ps.p.v.对于缩写,我很抱歉,否则不适合评论。 – linski

4

更新

Plugin management是共享插件(从母公司或同一项目)的默认配置的机制,并得到由值在effective pombuild plugins部分覆盖,这样是解决不了问题。

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

如果是这种原因,您可以deactivate the profile in your pom或命令行中运行时,只是追加为Linux -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: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 

和帖子内容。

原来的答复

是否有胜过本地POM文件配置一些全局行家设置文件?

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

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

调试

  • mvn -X clean compile > build.log - 运行行家与-X(调试)命令行标志详细输出。由于存在大量输出,建议将其输出(>)到文件中。这在使用错误文档的插件时特别有用,因为您可以在执行前看到所有插件属性及其实际值。
  • 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

0

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

换句话说,这(至少对我)的工作原理:

mvn -DnewVersion=0.0.2 versions:set 
mvn package 

这不起作用:

mvn -DnewVersion=0.0.2 versions:set package