Scala 可运行 JAR 的 ProGuard 进程

Posted

技术标签:

【中文标题】Scala 可运行 JAR 的 ProGuard 进程【英文标题】:ProGuard process for Scala runnable JAR 【发布时间】: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。

有什么正确的方法吗?

【问题讨论】:

【参考方案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-assembly 或 sbt-native-packager。

【讨论】:

以上是关于Scala 可运行 JAR 的 ProGuard 进程的主要内容,如果未能解决你的问题,请参考以下文章

添加 scala-compiler.jar 作为运行时依赖项

使用 Scala 编写的库在 Android 应用上运行 Proguard

如何签署我的 ProGuard 的 Scala 独立 JAR?

将scala代码打包到一个jar文件中,proguard不起作用

使用 Scala 的 Proguard - 错误 4

尝试使用 ProGuard 优化 Java+Scala 时出现 java.lang.***Error