java.lang.StackOverflowError при попытке оптимизировать Java + Scala с помощью ProGuard - PullRequest
2 голосов
/ 04 июня 2011

У меня есть апплет, который я писал на 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());

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Существует известная проблема, связанная с этим; см. эту ссылку для устранения неполадок .

Однако ссылка говорит о сложном коде. Ваш код будет казаться простым.

1 голос
/ 04 июня 2011

Я поигрался с конфигурацией proguard и обнаружил, что если я установлю "mergeinterfacesaggressively" на "false", все начнет работать.

Я сообщу об этом владельцу библиотеки и надеюсь, что этот вопрос будетпомогите кому-нибудь.

...