尝试使用 ProGuard 优化 Java+Scala 时出现 java.lang.StackOverflowError

标签 java optimization scala proguard

我有一个小程序,是用 Java 编写的。最近,我想向其中添加一些Scala代码会很好(因为Scala与Java具有良好的互操作性)。一切工作正常,但是当我尝试使用 ProGuard 优化生成的 jar 时,我有 java.lang.StackOverflowError。我该如何修复它?

错误:

The following error occurred while executing this line:
/var/www/parrot/Parrot/build.xml:84: 
java.lang.StackOverflowError
    at proguard.classfile.util.SimplifiedVisitor.visitProgramClass(SimplifiedVisitor.java:53)
    at proguard.optimize.info.StaticInitializerContainingClassFilter.visitProgramClass(StaticInitializerContainingClassFilter.java:50)
    at proguard.classfile.ProgramClass.accept(ProgramClass.java:280)
    at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:293)
    at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:333)
    at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:333)
    at proguard.classfile.ProgramClass.hierarchyAccept(ProgramClass.java:333)
    ... and so on, several thousand times ...

我的 proguard 的 ant 配置:

<proguard
    optimizationpasses="${optpass}"
    obfuscate="true"
    verbose="true"
    target="6"
    printseeds="true"
    allowaccessmodification="true"
    overloadaggressively="true"
    mergeinterfacesaggressively="true"
    repackageclasses="def"
    >

    <injar file="dist/Parrot.jar" />
    <injar path="dist/lib/" /><!-- scala-library.jar is also in this lib directory -->
    <libraryjar path="/home/platon/java/jdk1.6.0_24/jre/lib/" />
    <outjar file="dist/ParrotOp.jar" filter="!**.SF" />

    <keep access="public" name="launch.parrotApp" />

    <keepclassmembers extends="java.lang.Enum">
        <method access="public static"
            type="**[]"
            name="values"
            parameters="" />
        <method access="public static"
            type="**"
            name="valueOf"
            parameters="java.lang.String" />
    </keepclassmembers>

        <!-- Processing the scala library (as shown in proguard manual) -->
        -dontwarn **$$anonfun$*
        -dontwarn scala.collection.immutable.RedBlack$Empty
        -dontwarn scala.tools.**,plugintemplate.**

        -keepclasseswithmembers public class * {
            public static void main(java.lang.String[]);
        }

        -keep class * implements org.xml.sax.EntityResolver

        -keepclassmembers class * {
            ** MODULE$;
        }

        -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
            long eventCount;
            int  workerCounts;
            int  runControl;
            scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
            scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack;
        }

        -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread {
            int base;
            int sp;
            int runState;
        }

        -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask {
            int status;
        }

        -keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue {
            scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head;
            scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail;
            scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe;
        }

    </proguard>

顺便说一句 - Scala 代码没有什么特别的,实际上它就像这样简单

package scala1
object Main {
    def sum = 14
}

这是从java调用的:

System.err.println(scala1.Main.sum());

最佳答案

存在与此相关的已知问题;请参阅this troubleshooting link

但是,该链接正在讨论复杂的代码。您的代码看起来很简单。

关于尝试使用 ProGuard 优化 Java+Scala 时出现 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6236237/

相关文章:

scala - 将 Spark Row 转换为类型化的 double 组

java - Scala:从字节码角度创建公共(public)非最终类字段

java - JUnit 的代码覆盖率

java - 如何检查三个字符是否彼此相等以及它们是否相等?

java - 一个 OSGi 用例——我说的对不对?

c - 为什么调用函数时会有开销?

c++ - 如何有效地计算两点之间的角度?

algorithm - 匹配误差最低的两个图

斯卡拉/Play : load template dynamically

java - 我无法导入 gradle 项目 Eclipse。 "Finish"按钮什么都不做