2013-08-20 78 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