特拉维斯 CI 忽略 MAVEN_OPTS?

Travis CI ignoring MAVEN_OPTS?

我的 Scala 项目 (Maven-managed) 无法在 Travis 上构建,抛出 GC overhead limit exceeded 错误,尽管使用相同的 MAVEN_OPTS=-Xmx3g -XX:MaxPermSize=512m 在本地编译良好。我怀疑 Travis 以某种方式忽略了我的 MAVEN_OPTS:当我尝试针对 Oracle JDK 8 进行测试时,Travis 记录:

$ Setting environment variables from .travis.yml
$ export MAVEN_OPTS="-XX:MaxPermSize=512m -Xmx3g"

看起来不错。但是,在它记录后不久:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=192m; support was removed in 8.0

这很麻烦,因为我没有指定 -XX:MaxPermSize=192m,只指定 512m。 (这让我相信我的 -Xmx3g 也被忽略了,导致编译失败。)

我尝试在我的 pom 中的许多其他位置指定 MAVEN_OPTS,但无济于事。例如,对于 maven-scala-plugin,我有:

<configuration>
  ...
  <jvmArgs>
    <jvmArg>-Xmx3g</jvmArg>
    <jvmArg>-XX:MaxPermSize=512m</jvmArg>
  </jvmArgs>
</configuration>

我在 maven-surefire-plugin 和 scalatest 插件下也有以下内容,尽管构建在编译期间失败,而不是在测试期间:

<configuration>
  <argLine>-Xmx3g -XX:MaxPermSize=512m</argLine>
</configuration>

以下是我的全部。travis.yml:

language: java
env:
  global:
    - MAVEN_OPTS="-XX:MaxPermSize=512m -Xmx3g"
script: mvn clean install
jdk:
    - oraclejdk8
    - oraclejdk7

我正在使用 Scala 2.11.2 和 scala-maven-plugin 3.2.0.

虽然可以在 Travis CI 构建中设置 -Xmx3g,但其服务器的内存有限,无法在分叉的 surefire 测试中用于 JVM 堆。

这是使用 -Xmx2560m 在 Travis CI 上获得最大速度的项目: https://github.com/plokhotnyuk/actors/blob/8f22977981e0c4d21b67beee994b339eb787ee9a/pom.xml#L151

您可以通过添加到 .travis.yml- sudo cat /proc/meminfo 行来检查可用内存。这是一些 Travis CI 构建的输出:https://travis-ci.org/plokhotnyuk/actors/jobs/55013090#L923

如果您的项目需要更大的堆大小,请尝试 https://www.shippable.com

或者最好使用 Wercker(构建速度更快,根本不需要排队)http://wercker.com

更新(11/2/15):

终于彻底解决了here。引用:

如果你想使用基于容器的构建(不依赖 sudo),你可以将你想要的内容回显到 $HOME/.mavenrc 文件中,这将优先于 /etc/mavenrc,如下所示:

.travis.yml中:

before_script:
  - echo "MAVEN_OPTS='-Xmx2g -XX:MaxPermSize=512m'" > ~/.mavenrc

(您也可以根据您的设置将其放入 before_install)。

旧答案:

我终于在 Travis CI github.

上找到了答案 here, which references this (closed but not resolved) issue

Travis 似乎通过文件 /etc/mavenrcMAVEN_OPTS 环境变量导出为 root,然后它不会被任何其他 MAVEN_OPTS 定义覆盖(例如通过 env/global travis 配置中的设置)。解决方法是在设置自定义 MAVEN_OPTS.

之前删除 /etc/mavenrc

我能够设置自定义 MAVEN_OPTS 并在我的 .travis.yml 中使用以下内容成功构建:

script:
  - sudo rm /etc/mavenrc
  - export MAVEN_OPTS="-Xmx2469m -XX:MaxPermSize=512m"
  - mvn clean install

请注意,我没有在我的 travis 配置中使用 language: java,只是通过 script 指令直接调用 maven。

export MAVEN_SKIP_RC=true 是在处理具有 /etc/mavenrc 的系统时推荐的方法。这将使它忽略默认值并读取 MAVEN_OPTS 变量。

这就是最终对我有用的方法。

language: java
sudo: false
jdk:
  - oraclejdk8
install: MAVEN_SKIP_RC=true MAVEN_OPTS="-Xss4M" mvn install -DskipTests=true
script: MAVEN_SKIP_RC=true MAVEN_OPTS="-Xss4M" mvn

正如@adam 所说,MAVEN_SKIP_RC 是必需的,MAVEN_OPTS 是让 javac 停止炸毁堆栈所需要的。