У меня есть апплет, который я писал на Java.Недавно я подумал, что было бы неплохо добавить к нему немного кода Scala (поскольку у Scala хорошая совместимость с Java).Все отлично работает, но когда я пытаюсь оптимизировать получившиеся банки, используя ProGuard, I have java.lang.StackOverflowError. How can I fix it?
Error:
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 ...
My ant configuration for proguard:
<!-- scala-library.jar is also in this lib directory -->
-dontwarn ** $$ anonfun $ * -dontwarn scala.collection.immutable.RedBlack $ Пусто -dontwarn scala.tools. **, plugintemplate. ** -keepclasseswithmembers открытый класс * {открытый статический void main (java.lang.String []);} -keep class * реализует 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;}
И, кстати, там нет ничего необычного в коде Scala, на самом деле он такой же простой, как
package scala1
object Main {
def sum = 14
}
, который вызывается из Java:
System.err.println(scala1.Main.sum());