Travis CI忽略MAVEN_OPTS?

8
我的Scala项目(使用Maven管理)在Travis上构建失败,尽管在本地使用相同的“MAVEN_OPTS = -Xmx3g -XX:MaxPermSize = 512m”编译正常,但会抛出“GC超时限制已超过”的错误。我怀疑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。

4个回答

9

更新(11/2/15):

这个问题最终在这里得到了充分的解决。引用一下:

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

.travis.yml中:

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

(根据您的设置,您还可以将此内容放在before_install中。)

旧答案:

我最终在这里找到了答案,其中引用了Travis CI github上的这个(已关闭但未解决)问题

看起来Travis通过文件/etc/mavenrc作为root导出一个MAVEN_OPTS环境变量,然后不会被任何其他MAVEN_OPTS定义覆盖(例如通过travis配置中的env/global设置)。解决方法是在设置自定义MAVEN_OPTS之前删除/etc/mavenrc

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

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

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

1
你可能想要使用 before_install 或者 before_script 来执行 echo 命令。你不希望以这种方式完全替换 script。 - Craig P. Motlin
@CraigP.Motlin 谢谢,我认为你是对的,我编辑了我的答案,使用 before_script 而不仅仅是 script。在我的情况下,这并不重要,因为我无论如何都要替换脚本,以便使用 maven 和 sbt 进行编译。您能详细说明一下完全替换脚本为什么不好吗? - Emma Strubell
1
它用echo命令替换了运行测试的命令。因此,构建基本上设置环境并退出。如果命令类似于echo ... && mvn ...,那么这样做就没问题。 - Craig P. Motlin
同样地,Alpine Linux的Maven 3软件包包含一个/etc/mavenrc文件,该文件设置了-Xmx参数。可能还有其他环境也存在这个问题。 - Jason Young

3

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


1

虽然在Travis CI构建中可以设置-Xmx3g,但其服务器的内存受限,以便为分叉surefire测试中的JVM堆留出足够的空间。

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

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

如果您的项目需要更大的堆大小,则可以尝试使用https://www.shippable.com
或者最好使用Wercker(构建速度更快,完全不需要等待队列)http://wercker.com

不幸的是,这并没有起作用,我仍然收到相同的错误,并且Java 8构建日志仍然显示为192m,尽管在减少内存的情况下,我的项目在服务器上仍然能够成功构建。 - Emma Strubell
@emma-strubell,能否分享一下您的有效pom文件?您的代码是否已经开源? - Andriy Plokhotnyuk
是的,pom在这里:https://github.com/strubell/factorie/blob/jflex-tokenization/pom.xml - Emma Strubell
在那个pom文件中,maven-surefire-pluginscalatest-maven-plugin都被启用以运行测试,并且它们都可以通过argLine参数配置JVM选项以进行分叉测试。 - Andriy Plokhotnyuk
这两个插件都已经设置了argLine,我还需要在argLine中指定其他内容吗? - Emma Strubell

0

这是最终对我起作用的。

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

需要使用MAVEN_SKIP_RC,正如@adam所说的那样,而MAVEN_OPTS是我需要的,以使javac停止吹出堆栈。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接