2016-11-25 72 views
1

我有一個項目document-scanner-aggregator在Maven 3.1.1運行時本地運行,即~/apache-maven-3.1.1/bin/mvn clean install,但不是on travis-ci.org,它檢測到Maven 3.2.5,它可疑是由travis-ci.org提供的版本。但是它不應該這樣做,因爲運行構建的Maven版本應該被強制執行,對吧?爲什麼在travis-ci.org上運行3.1.1時,maven-enforcer-plugin會檢測Maven 3.2.5?

故障是

[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireMavenVersion failed with message: 
Detected Maven Version: 3.2.5 is not in the allowed range (,3.2). 
... 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4:enforce (enforce-versions) on project javaocr-parent: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1] 

和配置是

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4</version> 
    <executions> 
     <execution> 
      <id>enforce-versions</id> 
      <goals> 
       <goal>enforce</goal> 
      </goals> 
      <configuration> 
       <rules> 
        <requireMavenVersion> 
         <!--different rules for different issues--> 
         <!--3.3.x causes `java.lang.NoClassDefFoundError: org/eclipse/aether/spi/connector/Transfer$State` which is caused by certain maven versions, see https://cwiki.apache.org/confluence/display/MAVEN/AetherClassNotFound for details--> 
         <version>(,3.3)</version> 
         <!--3.2.x causes `No implementation for org.eclipse.aether.connector.wagon.WagonConfigurator was bound.`--> 
         <version>(,3.2)</version> 
        </requireMavenVersion> 
       </rules> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
javaocr

.travis.yml

language: java 
install: 
- wget http://mirrors.ae-online.de/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz && tar xf apache-maven-3.1.1-bin.tar.gz 
- apache-maven-3.1.1/bin/mvn clean install 

回答

2

你誤解了Enforcer Plugin的作用:

的強制實施插件提供目標,以控制某些環境的制約,如Maven的版本,JDK版本和操作系統家族以及更多的標準規則和用戶創建的規則。

它的目標不是魔術,以便配置的規則被驗證,但是當其中一個規則未被驗證時,它的構建失敗。換句話說,它會檢查已配置規則的列表,以便在其中一個未驗證的情況下構建無法繼續。原因是如果構建的先決條件之一未得到滿足,最好儘早失敗。

就你的情況而言,requireMavenVersion規則強制使用嚴格低於3.2的Maven版本進行構建。如果您使用Maven 3.2.5運行構建,則不會生成新的Maven實例,以便驗證規則;應該使用哪個版本,以及它在哪裏獲得它?相反,它檢測到構建是使用不允許的Maven版本完成的,並相應地失敗。由於Travis構建is configured to use Maven 3.2.5,它預計會失敗,並且您需要爲Travis構建安裝低於3.2的Maven版本。

要使用不同的Maven版本,如3.1.1,在特拉維斯CI,你可以在.travis.yml如下:

before_install: 
    - wget http://mirrors.ae-online.de/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz 
    - tar xf apache-maven-3.1.1-bin.tar.gz 
    - export M2_HOME=$PWD/apache-maven-3.1.1 
    - export PATH=$M2_HOME/bin:$PATH 

install: /bin/true 

script: mvn clean install 

作爲一個側面說明,你的

當前配置
<requireMavenVersion> 
    <version>(,3.3)</version> 
    <version>(,3.2)</version> 
</requireMavenVersion> 

是完全等效於

<requireMavenVersion> 
    <version>(,3.2)</version> 
</requireMavenVersion> 

範圍(,3.2)means它匹配的版本嚴格低於3.2。因此,要求它嚴格低於3.3是多餘的(因爲3.2在3.3之前)。

+0

太棒了! '.travis.yml'做到了。我建議編輯答案,以便更快地獲得關鍵信息,因爲我有一種感覺,我不會成爲最後一個問題。 –

相關問題