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)