1

我有一个项目document-scanner-aggregator,它在使用 Maven 3.1.1 运行时在本地运行良好,即~/apache-maven-3.1.1/bin/mvn clean install,但不在travis-ci.org上,它检测到 Maven 3.2.5 可疑是 travis-ci 提供的版本.org。但是它不应该这样做,因为运行构建的 Maven 版本应该被强制执行,对吗?

失败是

[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
4

1 回答 1

2

您误解了Enforcer Plugin的作用:

Enforcer 插件提供了控制某些环境约束的目标,例如 Maven 版本、JDK 版本和 OS 系列以及更多标准规则和用户创建的规则。

它的目标不是变魔术以验证配置的规则,而是在未验证其中一个规则时使构建失败。换句话说,它会检查已配置规则的列表,因此如果其中一个未得到验证,则构建将无法继续。原因是如果构建的先决条件之一没有得到满足,最好尽早失败。

在您的情况下,该requireMavenVersion规则强制使用严格低于 3.2 的 Maven 版本完成构建。如果您使用 Maven 3.2.5 运行构建以验证规则,它将不会产生新的 Maven 实例;它应该使用哪个版本,从哪里得到它?相反,它检测到构建是使用不允许的 Maven 版本完成的,并相应地失败。由于 Travis 构建配置为使用 Maven 3.2.5,因此预计会失败,并且您需要为 Travis 构建安装低于 3.2 的 Maven 版本。

要在 Travis CI 上使用不同的 Maven 版本,例如 3.1.1,您可以在以下位置添加以下内容.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) 意味着它匹配严格低于 3.2 的版本。因此,要求它也严格低于 3.3 是多余的(因为 3.2 在 3.3 之前)。

于 2016-11-25T09:47:12.803 回答