【问题标题】:SBT ProGuard plugin: OutOfMemoryError, how to increase heapspace?SBT ProGuard 插件:OutOfMemoryError,如何增加堆空间?
【发布时间】: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 插件,或以其他方式解决此问题?

【问题讨论】:

    标签: scala sbt proguard out-of-memory


    【解决方案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") 为我工作
    猜你喜欢
    • 2016-11-17
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多