8

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

我尝试增加 sbt 的堆空间,但结果证明 proguard 插件产生了自己的 java 进程并且-Xmx256M参数硬编码。除了更改 proguard 代码本身之外,我不知道如何更改它。

我在 JDK 7 上使用 sbt-proguard 插件 0.2.1 和 sbt 0.12.3 和 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 插件,或者以其他方式解决这个问题?

4

2 回答 2

9

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

更新

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

show proguard::java-options

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

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

基本上发生了什么,proguardSettigns 使用默认配置并删除您的 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")

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

于 2013-07-09T08:01:39.580 回答
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"))
于 2014-01-31T17:51:34.823 回答