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

Posted

技术标签:

【中文标题】SBT ProGuard 插件:OutOfMemoryError,如何增加堆空间?【英文标题】:SBT ProGuard plugin: OutOfMemoryError, how to increase heapspace? 【发布时间】:2013-07-06 17:43:06 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

更新

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

show proguard::java-options

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

 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")

保持行与行之间的顺序和换行

【讨论】:

我试过了,还有变体,但插件似乎忽略了设置。 @JustinKaeser 尝试增加-XX:MaxPermSize=1G 好的,我试过了,但是由于烫发大小不是问题,所以问题仍然存在。 谢谢,但恐怕我不太明白。我没有你描述的设置,只是一个普通的 build.sbt 与 抱歉,我早早地发送了该评论。它的意思是说:谢谢,但恐怕我不太明白。我没有您描述的设置,只是带有import ProguardKeys._proguardSettings 的常规build.sbt。在 build.sbt 中添加您建议的行只会出现错误:error: not found: value SbtProguard【参考方案2】:

上述答案不适用于我最近的 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"))

【讨论】:

Proguard/proguard/javaOptions := Seq("-Xmx4g") 为我工作

以上是关于SBT ProGuard 插件:OutOfMemoryError,如何增加堆空间?的主要内容,如果未能解决你的问题,请参考以下文章

在 SBT 中将 unmanagedJars 添加到 proguardLibraryJars

使用 Proguard 在 dist 上混淆 Play 2 Web 应用程序?

如何告诉 sbt-proguard 包含 java *.jars?

ProGuard 使用 sbt-proguard 说 Unsupported class version number [52.0] (maximum 51.0, Java 1.7)

如何更新 sbt android-plugin 的 ProGuard 版本?

运行使用 SBT 和 ProGuard 构建的独立 jar 时出现 AbstractMethodError