2015-03-31 50 views
1

我想缩小(也混淆和优化)打包到可运行JAR中的简单Scala程序。Scala可运行的ProGuard进程JAR

我在Scala IDE中创建了2个项目:简单的Scala程序和执行这个Scala程序的Java包装器。然后,我使用“Export” - >“Runnable JAR文件”Eclipse实用程序生成可运行JAR,并将“将所需库提取到生成的JAR中”选项。

之后,我尝试用ProGuard收缩器(GUI版本)缩小JAR,但失败时出现以下注释和警告:output at pastebin.com

有没有正确的方法来做到这一点?

回答

0

一个很好的开始是在scala项目上运行proguard的建议参数http://proguard.sourceforge.net/manual/examples.html#scala。这些基本的选择可能会解决大部分这些警告,例如:在SBT与

-keepattributes Signature,*Annotation* 
-dontobfuscate 

// turn some optimizations off when using -dontobfuscate 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable,!class/unboxing/enum 

// lots of other classes, e.g. logging 
-keep public class ch.qos.logback.** { *;} 
-keep public class org.slf4j.** { *;}  

如果你正在寻找自动化它,你还可以运行的ProGuard:

-dontwarn scala.** 

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

我也用这sbt-proguard插件。如果您想将其结合到可执行jar或程序包中,则可以将proguard输出送入sbt-assemblysbt-native-packager