如何防止混淆器从输出 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 来解决该项目中的问题。它不漂亮,但它有效。
希望这对遇到同样情况的人有所帮助。
我正在将 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 来解决该项目中的问题。它不漂亮,但它有效。
希望这对遇到同样情况的人有所帮助。