如何防止混淆器从输出 jar 中删除 "module-info.class"?

How to prevent proguard from removing "module-info.class" from the output jar?

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

在我使用 Proguard (6.0.2) 添加混淆步骤之前,一切都运行良好。 一旦我启用了混淆(使用 < JDK9 项目中的工作混淆器配置文件),它就会按预期工作,但混淆器会从输出 JAR 中删除 module-info.class,从而阻止 javapackager 找到模块。

根据 Proguard 的 injars 参数文档

By default, any non-class files will be copied without changes.

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

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

filing a bug report 之后,Proguard 的作者确认我们需要将 module-info 视为另一个 class 并添加一条规则来保留它,如下所示:

-keep class module-info

并可能使用

-keepattributes Module*

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

在作者的回复之后,我在一个更简单的项目上进行了尝试,上面的 "keep" 规则运行良好,这意味着我的第一个项目的某些特定问题导致了这个问题。

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

希望这对遇到同样情况的人有所帮助。