特拉维斯 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/mavenrc
将 MAVEN_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 停止炸毁堆栈所需要的。
我的 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) issueTravis 似乎通过文件 /etc/mavenrc
将 MAVEN_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 停止炸毁堆栈所需要的。