【问题标题】:Travis CI ignoring MAVEN_OPTS?Travis CI 忽略 MAVEN_OPTS?
【发布时间】:2015-05-25 22:18:28
【问题描述】:

我的 Scala 项目(由 Maven 管理)未能在 Travis 上构建,尽管使用相同的 MAVEN_OPTS=-Xmx3g -XX:MaxPermSize=512m 在本地编译良好,但仍会引发 GC overhead limit exceeded 错误。我怀疑 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。

【问题讨论】:

    标签: scala maven travis-ci scala-maven-plugin


    【解决方案1】:

    更新(2015 年 11 月 2 日):

    这终于完全解决了here。引用:

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

    .travis.yml:

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

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

    旧答案:

    我终于找到了答案here,它在Travis CI github上引用了this (closed but not resolved) issue

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

    【讨论】:

    • 您可能希望 before_install 或 before_script 执行 echo 命令。您不会希望以这种方式完全替换脚本。
    • @CraigP.Motlin 谢谢,我认为你是对的,我编辑了我的答案以使用 before_script 而不仅仅是脚本。就我而言,这并不重要,因为无论如何我都在替换脚本以便同时使用 maven 和 sbt 进行编译。您能否详细说明为什么完全替换脚本不好?
    • 它将运行测试的命令替换为 echo 命令。所以构建基本上设置了环境并退出。如果命令类似于 echo ... && mvn ... 就可以了
    • 同样,Alpine Linux 的 Maven 3 包包含一个 /etc/mavenrc 设置 -Xmx 参数。可能还有其他环境也存在此问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      这是在 Travis CI 上使用 -Xmx2560m 以获得最大速度的项目: 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

      【讨论】:

      • 不幸的是,这不起作用,我仍然遇到同样的错误,Java 8 构建日志仍然显示 192m,尽管内存减少了我的项目仍然可以在我的服务器上构建。跨度>
      • @emma-strubell,可以分享你的有效pom吗?你的代码开源了吗?
      • 在那个 pom 中,maven-surefire-pluginscalatest-maven-plugin 都可以运行测试,并且可以通过 argLine 参数为分叉测试配置 JVM 选项。
      • 这里是通过 argLine 调整 JVM 选项的示例:github.com/plokhotnyuk/actors/blob/…
      【解决方案4】:

      这最终对我有用。

      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 停止爆出堆栈。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多