SBT ProGuard插件:OutOfMemoryError,如何增加堆空间?

时间:2013-07-09 07:48:42

标签: scala sbt proguard out-of-memory

当尝试使用sbt-proguard插件为我的项目组装jar时,我总是得到Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我尝试增加sbt的堆空间,但事实证明,proguard插件生成了自己的java进程并且-Xmx256M参数是硬编码的。我无法弄清楚如何更改它,而不是更改proguard代码本身。

我正在使用sbt 0.12.3的sbt-proguard插件0.2.1和JDK 7上的Scala 2.10.1

我已尝试设置javaOptions in proguard := Seq("-Xmx2G")以及javaOptions in proguard += "-Xmx2G",但该插件似乎忽略/覆盖此内容:

> ps aux|grep java
kaeser         47084 105.1  1.1  2927540  94440 s000  R+   10:07AM   0:05.52 /usr/bin/java -Xmx256M -cp /Users/kaeser/.ivy2/cache/net.sf.proguard/proguard-base/jars/proguard-base-4.9.jar proguard.ProGuard -include /Users/kaeser/Documents/workspace/pipeline-runner/target/scala-2.10/proguard/configuration.pro
kaeser         45087   0.0  6.3  5312012 531028 s000  S+    6:03PM   1:24.88 /usr/bin/java -Xmx2G -Xms512M -Xmx2G -Xss1M -XX:MaxPermSize=512m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -Xshare:off -jar /usr/local/Cellar/sbt/0.12.3/libexec/sbt-launch.jar

我如何将Java选项传递给proguard插件,或以其他方式解决此问题?

2 个答案:

答案 0 :(得分:7)

javaOptions in proguard := Seq("-Xmx...")行添加到项目设置

<强>更新

好吧我想我知道你的问题是什么。 如果在sbt session中打印以下命令:

show proguard::java-options

它会打印给你[info] List(-Xmx2G),这意味着你的proguard configuration堆大小设置为2GB,但如果你尝试这个命令:show proguard:proguard::java-options它会显示你在proguardTask中使用的[info] List(-Xmx256M)。考虑到这一点,我猜你在项目设置中有这样的东西:

 lazy val main = Project(
    id = "project",
    base = file("."),
    settings = Seq(javaOptions in proguard := Seq("-Xmx2G")) ++ proguardSettings)

基本上发生了什么,proguard使用默认配置并使用任务正在使用命令的任务范围来清除javaOptions设置。

所以添加这一行:

javaOptions in (SbtProguard.Proguard, proguard) := Seq("-Xmx2G")

到您的设置,它看起来应该类似于:

lazy val main = Project(
  id = "project",
  base = file("."),
  settings =  proguardSettings ++ Seq(
    javaOptions in (SbtProguard.Proguard, proguard) := Seq("-Xmx2G")
  )

现在致电show proguard:proguard::java-options,它会显示[info] List(-Xmx2G)。您还可以打开会话的全局日志记录,查看是否一切正常:set logLevel in Global := Level.Debug

<强>更新

我更喜欢Build.scala个文件,但在*.sbt中它更简单,只需按此顺序添加以下行:

import com.typesafe.sbt.SbtProguard._
import com.typesafe.sbt.SbtProguard.ProguardKeys.proguard

proguardSettings

javaOptions in (Proguard, proguard) := Seq("-Xmx2G")

保留行之间的顺序和换行符

答案 1 :(得分:6)

上述答案对我来说不适用于最近的SBT / sbt-proguard。

使用最近的sbt-proguard插件和SBT 0.13.1,我已经能够使用以下工具:

name := "project"

organization := "scott.andy"

version := "0.0.0"

scalacOptions := Seq("-deprecation", "-unchecked")

proguardSettings

ProguardKeys.options in Proguard ++= Seq("-dontnote", "-dontwarn", "-ignorewarnings")

ProguardKeys.options in Proguard += ProguardOptions.keepMain("scott.andy.project.Main")

inConfig(Proguard)(javaOptions in ProguardKeys.proguard := Seq("-Xmx2g"))