如何防止Proguard从输出的jar中删除"module-info.class"?

7
我正在将一个Java桌面应用程序升级到JDK10,并需要利用模块来使用javapackager构建本地包。一切都很顺利,直到我添加了一个混淆步骤,使用Proguard(6.0.2)进行混淆。启用混淆后(使用来自< JDK9项目的有效proguard配置文件),它按预期工作,但是Proguard从输出JAR中删除了module-info.class,这会防止javapackager找到该模块。根据Proguard的injars参数文档,任何非类文件默认情况下将被复制而不进行更改。问题在于module-info.class是一个“类”文件(尽管是一个奇怪的文件)。由于“keep”规则依赖于类名称,因此我认为没有任何规则可以用来防止此删除。如何使Proguard保留module-info.class文件?

这看起来是一个有用的产品。假设你发现的这个故障得到解决,我也打算试一试!我很好奇你尝试了什么。从“保留概述”https://www.guardsquare.com/en/proguard/manual/usage#keepoverview来看,似乎一个简单的-keep应该可以防止module-info.class被重命名或删除。你能详细说明一下吗?实际上展示一下如何使用-keep选项与module-info.class?祝你好运! - Phil Freihofner
这就是问题所在,虽然 module-info.class.class 结尾,但它不是一个类文件。根据手册,-keep 选项需要跟随类规范 https://www.guardsquare.com/en/proguard/manual/usage#classspecification。问题在于该文件不包含类/接口/枚举,只有模块的描述。从我所读的内容来看,我使用的版本(6.0.2)应该已经支持 JDK9,因此它应该忽略该文件,但实际上并没有。 - lbarbosa
软件制造商是否提供响应支持?此外,我想知道是否有一种注释可以添加到module-info中以保护它免受删除。我会在这里关注更新,并在我达到这一步时自行更新,如果我找到任何有用的信息。 - Phil Freihofner
1
是的,作者非常有帮助,请查看我的回答。 - lbarbosa
谢谢您的跟进。就我个人而言,我决定使用Inno-Setup 5并放弃混淆,现在发现打包路线正在起作用。(正在打包项目中JLINK操作的文件系统。) - Phil Freihofner
1个回答

3
在提交了一个错误报告后,Proguard的作者确认我们需要将module-info视为另一个类并添加保留规则,如下所示:-keep class module-info,并可能使用-keepattributes Module*。在我的情况下,在发布问题之前我实际上已经尝试过这个方法,但是它对我正在使用的项目不起作用(当我尝试时出现了NullPointerException,更多详细信息请参见错误报告)。在作者的回复后,我在一个更简单的项目中尝试了一下上面的“保留”规则,结果很好,所以这意味着我的第一个项目中有些特殊的东西导致了这个问题。目前,我通过使用Gradle将未混淆的JAR文件中的module-info.class复制到混淆的JAR文件中来解决了这个问题。虽然不太美观,但它能工作。希望这可以帮助处于同样境地的人们。

我仍然收到一个错误,说有一个类文件的命名不正确。 - CamHart
由于我不理解的原因,当我添加了keepattributes 'Exceptions,InnerClasses,Signature,Deprecated,Module*'时,它对我没有起作用,但是当我添加了另一行keepattributes Module*时,它就起作用了。我还应该注意到它是直接在gradle中编写的,而不是在配置文件中。很抱歉我给出了负评,不幸的是我无法再更改它了。 - Lukas Hanacek
1
给定的定义对我们不起作用。我们现在使用“-dontwarn module-info”选项。 - gamma
1
这两个选项对我来说在保留module-info类方面是有效的,但它并没有起作用。好像ProGuard正在将主要jar的module-info复制到其他jar中,因为我从jlink得到了这个错误:找到模块X的两个版本。我有多个jar文件,每个都有自己的模块。运行jar --describe-module --file a.jar显示ProGuard输出中的每个非主jar与主jar匹配,但输入jar没问题。 - bourne2program
1
似乎这对使用模块的任何人来说都是一个常见问题。尽管ProGuard 7发布了Java 14支持,但我们仍然需要一些hacky方法来处理它。我想我不得不在混淆下选择“打印映射”,并为我的构建过程编写一个脚本来解析该映射,并将module-info类复制到已更新(混淆)的导出包引用等内容。 - bourne2program

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接