java - Scala 可运行 JAR 的 ProGuard 进程

标签 java eclipse scala proguard executable-jar

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

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

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

有什么正确的方法吗?

最佳答案

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

-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 中使用 sbt-proguard 运行 proguard插入。然后可以将 proguard 输出输入 sbt-assemblysbt-native-packager如果您想将其合并到可执行 jar 或包中。

关于java - Scala 可运行 JAR 的 ProGuard 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379051/

相关文章:

java - 为什么 JComponent 中的图像在加载时无法正确绘制?

java - Tomcat 安装目录无效。它缺少预期的文件或文件夹 tcruntime-ctl.sh

eclipse:想要查看 css 文件但出现 "Cannot create extension"错误

scala - 自动案例类映射

java - 使用 StringBuilder 生成随机字符串会导致长度小于预定义长度的字符串

Java Group布局,垂直布局问题

java - 无法提取 Java Servlet 中的所有 cookie

java - Selenium WebDriver 是否支持 Safari?

scala - 如何在 akka-streams map 与 mapAsync 中使用异步驱动程序

scala - "for (i <- 1 to x; j <- 1 to y)"实际上如何增加 Scala 中的变量?