gpt4 book ai didi

java - 在构建 "maven-plugin"包时如何使用 Proguard 混淆?

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:53 26 4
gpt4 key购买 nike

“maven-plugin”项目(使用 maven-plugin-plugin)的生成输出 JAR 被 Proguard 执行的混淆破坏了工具。尝试将混淆的 JAR 用作 Maven 插件会生成异常,例如 MojoExecutionException ,这会以错误方式终止构建。允许生成包含自动生成的插件描述符的工作“maven-plugin”JAR 的正确 Proguard 配置选项是什么?

最佳答案

Maven 插件和 Proguard 工具的基础知识
为了生成一个 Maven 插件(maven 打包类型 "maven-plugin",它生成一个包含插件特定配置资源的 JAR)我们必须指示 maven-plugin-plugin关于我们 Mojos 的位置和名称。假设正确配置了 maven-plugin-plugin 执行,using annotations或其他配置选项,生成的 JAR 将在 JAR 根目录的 META-INF 目录中包含一个 plugin.xml 文件。该 plugin.xml 文件使用对 Java 类和包名称的静态引用来描述插件的目标和可配置参数(您可以在此文件 here 上找到更多信息)。
必须特别注意将混淆合并到“maven-plugin”JAR 的构建中;在这里,我们解释了使用 Proguard obfuscation library 所采取的步骤。 .使用 default Proguard configuration for library obfuscation 时,生成的 JAR 将不再正常工作,因为 Proguard 为 Maven 插件重命名、缩小、重新定位和混淆重要文件。尝试使用您的插件可能会导致异常终止构建,并出现与 Maven 运行时无法定位和处理插件的配置和类文件相关的错误。
但是,通过一些重新配置,我们可以指示 Proguard 正确维护生成的插件文件和“maven-plugin”JAR 的目录结构。 Proguard 选项的必要更改如下(请参阅有关以下链接的说明):

自定义 Proguard 配置
目录结构
-keepdirectories

-keepdirectories
这指示 Proguard 维护输入 JAR 目录结构,而不是将所有文件移动到根目录。 Maven 期望 plugin.xml 文件位于/META-INF/maven/目录中,该目录通过此选项与所有其他目录一起保留。您可以通过指定目录过滤器来更具体地过滤保留的目录,但是我选择不加选择地维护所有输入目录结构。
静态包引用
-keeppackagenames
-keeppackagenames org.apache.maven.plugin.my.MyMojo
您应该将占位符包替换为包含您的 Mojo 定义的包。如果您的 Mojo 定义不共享一个公共(public)包,您应该根据需要使用多个选项指定每个唯一的包。如果您不确定需要保留哪些包,请在文本编辑器中打开您生成的 plugin.xml 文件并检查每个“mojo”定义中的“implementation”元素。 “implementation”元素通过一个完全限定的名称来指定一个类。这些完全限定类名的每个包组件都是您应该指定的包。例如,我的 basedir-plugin 包含一个 Mojo 实现元素值“com.github.emabrey.maven.plugins.basedir.RootDirectoryGoal”,所以我将选项写为 -keeppackagenames com.github.emabrey.maven.plugins.basedir .
静态类引用
-keepnames
-keepnames class * implements org.apache.maven.plugin.AbstractMojo
此选项可防止 Proguard 重命名包含 Maven 插件 Mojo 实现的类。如果这些类被重命名,上述“实现”元素将不再正确识别包含 Mojo 实现的类。
私有(private)类字段和方法
-keepclassmembers
-keepclassmembers class * implements org.apache.maven.plugin.AbstractMojo {
private <fields>;
private <methods>;
}
此选项可防止 Proguard 重命名插件 Mojo 实现中的类级别方法和字段。 Maven 使用这些类字段/方法的名称来生成插件的配置元素。如果 Proguard 重命名字段,Maven 执行环境将无法使用用户配置正确填充 Mojo 实现。

完成 Proguard 配置
为方便起见,此处提供了 2.0.13 版( more versions here ;请参阅有关插件版本的说明)的完整配置,包括默认库配置以及上述修改 latest version of the proguard-base artifact 并将占位符包“org.apache.maven.plugin.my.MyMojo”替换为适当的值):
<!-- Configures Proguard obfuscation tool to generate an
obfuscated version of the JAR file that replaces the
default unobfuscated JAR.
-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.13</version>
<executions>
<execution>
<id>obfuscation-packaging</id>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
<configuration>
<proguardVersion>${tool.proguard.version}</proguardVersion>
<obfuscate>true</obfuscate>
<attach>true</attach>
<appendClassifier>false</appendClassifier>
<addMavenDescriptor>true</addMavenDescriptor>
<injar>${project.build.finalName}.jar</injar>
<injarNotExistsSkip>true</injarNotExistsSkip>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>

<options>
<option>-keepdirectories</option>
<option>-keeppackagenames org.apache.maven.plugin.my.MyMojo</option>
<option>-keepnames class * implements org.apache.maven.plugin.AbstractMojo</option>
<option>-keepclassmembers class * implements org.apache.maven.plugin.AbstractMojo {
private <![CDATA[<fields>]]>;
private <![CDATA[<methods>]]>;
}
</option>
<option>-keepparameternames</option>
<option>-renamesourcefileattribute SourceFile</option>
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
</option>
<option>-target 1.8</option>
<option>-keep public class * {
public protected *;
}
</option>
<option>-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
</option>
<option>-keepclasseswithmembernames,includedescriptorclasses class * {
native <![CDATA[<methods>]]>;
}
</option>
<option>-keepclassmembers,allowoptimization enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
</option>
<option>-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
</option>
</options>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>${tool.proguard.version}</version>
</dependency>
</dependencies>
</plugin>

备注
链接问题 (9-04-2019)
Proguard 网站存在某种问题,这意味着我指向程序选项的链接并不总是像包含 anchor 的链接那样到达 anchor 的位置。如果您没有看到您点击的选项最初显示在他们的网页上,只需稍微向上滚动即可。
proguard-maven-plugin 版本问题 (9-04-2019)
当前版本 ${tool.proguard.version}com.github.wvengen:proguard-maven-plugin截至 2017 年 3 月,直到进行此编辑。我将保留原始配置,版本号 2.0.14因为版本 2.0.13包含潜在的破坏性更改。它现在包含种子和 map 文件,作为最终 Proguard 混淆 Artifact 的输出 Artifact 的一部分。大多数用例实际上不太可能在使用 Artifact 中的其他文件时出现任何问题,而是忍者编辑配置以指向 2.0.14。 ,我将留下这个笔记,让您评估哪个版本适合您的项目。也就是说,只需将版本更改为 2.0.14应该没问题,因为版本 <version>2.0.14</version> 的提交历史记录中没有注意到插件配置更改.

关于java - 在构建 "maven-plugin"包时如何使用 Proguard 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34706466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com