如何防止proguard删除" module-info.class"从输出罐?

时间:2018-05-06 18:27:26

标签: java gradle proguard jigsaw

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

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

根据Proguard关于injars参数

的文档
  

默认情况下,不会更改任何非类文件。

这里的问题是module-info.class是一个"类"文件(尽管很奇怪)。 "保持"规则取决于班级名称,所以我不认为我可以使用任何规则来防止这种删除。

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

1 个答案:

答案 0 :(得分:1)

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

-keep class module-info

并可能使用

-keepattributes Module*

在我的情况下,我实际上在发布问题之前尝试了它,但它在我使用它的项目上对我不起作用(当我尝试时我得到了NullPointerException,更多细节在错误报告)

在作者的回复之后,我在一个更简单的项目上尝试了它并且上面的“保持”规则工作得很好,这意味着我的第一个项目特定的东西导致了这个问题。

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

希望这可以帮助处于相同情况的任何人。