2015-03-31 49 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