【问题标题】:How to prevent proguard from removing "module-info.class" from the output jar?如何防止 proguard 从输出 jar 中删除“module-info.class”?
【发布时间】:2018-05-06 18:27:25
【问题描述】:

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

在我使用 Proguard (6.0.2) 添加了一个混淆步骤之前,一切都很好。 一旦我启用了混淆(使用 module-info.class,这会阻止 javapackager 找到模块。

根据 Proguard 的 injars 参数文档

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

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

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

【问题讨论】:

  • 这看起来像一个有用的产品。我也打算试一试,假设你发现的这个问题已经解决了!我很好奇你尝试了什么。查看“保留概述”guardsquare.com/en/proguard/manual/usage#keepoverview 似乎一个简单的 -keep 应该既可以防止 module-info.class 被重命名或删除。您能否更详细地说明一下如何将 -keep 选项与 module-info.class 一起使用?祝你好运!
  • 就是这样,尽管module-info.class 以.class 结尾,但它不是类文件。根据手册,-keep 选项需要后跟类规范guardsquare.com/en/proguard/manual/usage#classspecification。问题是该文件不包含类/接口/枚举,只是模块的描述。根据我的阅读,我使用的版本(6.0.2)应该已经支持JDK9,所以它忽略该文件是很自然的,但事实并非如此。
  • 软件制造商是否提供响应式支持?另外,我想知道是否可以将某种注释添加到模块信息中以防止其被删除。我会在这里关注更新,如果我发现任何有用的信息,我会在完成此步骤后更新自己。
  • 是的,作者非常有帮助,请在下面查看我的答案
  • 感谢您的跟进。至于我自己,我决定使用 Inno-Setup 5 并放弃混淆,并且我发现打包的路线是可行的。 (我正在打包项目上JLINK操作的结果文件系统。)

标签: java gradle proguard java-platform-module-system


【解决方案1】:

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

-keep class module-info

并且可能使用

-keepattributes Module*

在我的情况下,我实际上在发布问题之前已经尝试过,但它在我使用它的项目中对我不起作用(我在尝试时收到了 NullPointerException,更多详细信息在错误报告中)

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

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

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

【讨论】:

  • 我仍然得到一个错误,说现在有一个错误命名的类文件
  • 由于我不明白,当我添加像这样 keepattributes 'Exceptions,InnerClasses,Signature,Deprecated,Module*' 这样的 keepattributes 时,这对我不起作用,但是当我添加另一个 keepattributes Module* 行时它起作用了.我还应该注意它是直接用 gradle 编写的,而不是在配置文件中。很抱歉对答案投了反对票,很遗憾我不能再改变它了。
  • 对于给定的定义,它对我们不起作用。我们现在使用“-dontwarn module-info”作为选项。
  • 这两个选项对我有用,可以保留模块信息类,但它不起作用。就好像 ProGuard 正在将主 jar 的模块信息复制到其他 jar,因为我从 jlink 收到此错误:发现模块 X 的两个版本。我有多个罐子,每个罐子都有自己的模块。运行jar --describe-module --file a.jar 显示 ProGuard 输出中的每个非主 jar 都与主 jar 匹配,但输入 jar 没问题。
  • 对于任何使用模块的人来说,这似乎都是一个常见的问题。随着为 Java 14 支持而发布的 ProGuard 7,我们仍然需要以一些 hacky 方式来处理它。我想我将不得不在混淆下选择“打印映射”,并为我的构建过程编写一个脚本来解析该映射并复制模块信息类以及对导出包等的更新(混淆)引用。跨度>
猜你喜欢
  • 2019-09-27
  • 2019-03-13
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2012-11-18
  • 2011-09-10
相关资源
最近更新 更多