当尝试使用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插件,或以其他方式解决此问题?
答案 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"))