【问题标题】:ProGuard process for Scala runnable JARScala 可运行 JAR 的 ProGuard 进程
【发布时间】:2015-06-05 09:46:08
【问题描述】:

我正在尝试缩小(以及混淆和优化)打包到可运行 JAR 中的简单 Scala 程序。

我在 Scala IDE 中创建了 2 个项目:简单的 Scala 程序和执行此 Scala 程序的 Java 包装器。然后我使用“Export”->“Runnable JAR file”Eclipse 实用程序和“Extract required libraries into generated JAR”选项生成了可运行的 JAR。

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

有什么正确的方法吗?

【问题讨论】:

    标签: java eclipse scala proguard executable-jar


    【解决方案1】:

    一个好的起点是在http://proguard.sourceforge.net/manual/examples.html#scala 的Scala 项目上运行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;
    }
    

    我也使用这些:

    -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.** { *;}    
    

    如果你想自动化它,你也可以使用sbt-proguard 插件在 sbt 中运行 proguard。如果您想将 proguard 输出合并到可执行 jar 或包中,则可以将其输入到 sbt-assemblysbt-native-packager

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 2011-12-25
      • 1970-01-01
      • 2016-11-11
      • 2011-02-25
      • 2011-09-16
      • 2013-11-04
      • 2011-03-18
      相关资源
      最近更新 更多