2011-06-04 4 views
2

J'ai une applet, que j'écrivais en Java. Récemment, j'ai pensé qu'il serait bon d'y ajouter du code Scala (puisque Scala a une bonne interopérabilité avec Java). Tout fonctionne bien, mais lorsque j'essaie d'optimiser les fichiers résultants en utilisant ProGuard, j'ai java.lang.StackOverflowError. Comment puis-je le réparer?java.lang.StackOverflowError lors de la tentative d'optimisation de Java + Scala avec ProGuard

Erreur:

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 ... 

Ma configuration fourmi pour proguard:

<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> 

Et en passant - il y a, il est en fait rien de fantaisie sur le code Scala il aussi simple que

package scala1 
object Main { 
    def sum = 14 
} 

qui est appelée à partir de Java:

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

Répondre

1

J'ai joué avec la configuration de proguard, et j'ai découvert que si je mettais "mergeinterfacesaggressively" à "false", tout commençait à fonctionner.

Je vais informer le propriétaire de la bibliothèque à ce sujet, et j'espère que cette question aidera quelqu'un.

+0

J'ai le même problème dans mon projet Android, mais je ne mets jamais trop d'interruptions de jeu, donc je ne sais pas trop quoi faire. –

+0

@ChristopherPerry - avez-vous essayé d'éteindre les autres commutateurs et de travailler avec un extrait de code simplifié? Peut-être qu'il y a une autre chose qui entrave le chemin. – Rogach

2

Il existe un problème connu lié à ceci; voir this troubleshooting link.

Cependant, le lien parle de code compliqué. Votre code semblerait être simple.

+0

Après l'optimisation et l'obfuscation, le code pourrait devenir assez complexe, j'en suis sûr. –

Questions connexes