如何防止 proguard 从输出 jar 中删除“module-info.class”?

lba*_*osa 7 java proguard gradle java-platform-module-system

我正在将 Java 桌面应用程序升级到 JDK10,并且需要利用模块来使用javapackager构建本机包。

一切都很好,直到我使用 Proguard (6.0.2) 添加了一个混淆步骤。一旦我启用了混淆(使用来自 < JDK9 项目的工作 proguard 配置文件),它就会按预期工作,但 Proguardmodule-info.class从输出 JAR 中删除了,这会阻止javapackager找到模块。

根据 Proguard 的injars参数文档

默认情况下,任何非类文件都将被复制而不做任何更改。

这里的问题是 module-info.class是一个“类”文件(尽管很奇怪)。“保留”规则取决于类名,所以我认为没有任何规则可以用来防止这种删除。

如何让 Proguard 保留module-info.class文件?

lba*_*osa 3

在提交错误报告后,Proguard 的作者确认我们需要将其module-info视为另一个类并添加一条规则来保留它,如下所示:

-keep class module-info

并可能使用

-keepattributes Module*

就我而言,我实际上在发布问题之前已经尝试过它,但它对我正在使用它的项目不起作用(NullPointerException当我尝试它时,我得到了一个,错误报告中的更多详细信息)

在作者回复后,我在一个更简单的项目上进行了尝试,上面的“保留”规则运行良好,因此这意味着我的第一个项目的特定内容导致了问题。

我现在通过使用 gradle 将module-info.class未混淆的 jar 复制到混淆的 jar 中来解决该项目中的问题。它不漂亮,但很有效。

希望这对处于相同情况的任何人有所帮助。