ProGuard不会使JAR与依赖项混淆
我有一个项目与下面给出的pom.xml
文件。 当我发出命令mvn clean compile assembly:single install
我希望Maven生成一个JAR,其中包含
- 所有的依赖和
- 我的代码的混淆版本。
它不起作用 – 我的代码在“jar-with-dependencies”文件中没有被混淆。
当我运行mvn clean compile install
,生成的文件包含我的应用程序的模糊代码,但没有依赖项。
为了拥有包含所有依赖项和混淆代码的JAR文件,我该怎么办?
4.0.0 com.mycompany myproduct 1.0-SNAPSHOT jar 2.3.5 org.spongepowered spongeapi 3.0.0 provided junit junit 4.12 org.easytesting fest-assert-core 2.0M8 test org.mockito mockito-core 1.10.19 test org.restlet.jse org.restlet ${restlet-version} org.restlet.jse org.restlet.ext.jackson ${restlet-version} com.googlecode.json-simple json-simple 1.1.1 ${project.basedir}/src/main/resources true org.apache.maven.plugins maven-compiler-plugin 3.3 1.8 1.8 org.codehaus.mojo templating-maven-plugin 1.0-alpha-3 filter-src filter-sources maven-assembly-plugin jar-with-dependencies com.github.wvengen proguard-maven-plugin 2.0.8 package proguard 5.2 -allowaccessmodification -dontoptimize -dontshrink -dontnote -keepattributes Signature -keep class com.mycompany.MyPlugin { *; } ${java.home}/lib/rt.jar net.sf.proguard proguard-base 5.2 runtime
更新1(2016年1月17日19:54 MSK):更改了ProGuard配置,如下所示,但是mvn clean compile assembly:single
仍会生成带有未经混淆的类文件的JAR。
com.github.wvengen proguard-maven-plugin 2.0.8 package proguard 5.2 -allowaccessmodification -dontoptimize -dontshrink -dontnote -keepattributes Signature -keep class com.mycompany.MyPlugin { *; } ${project.build.finalName}-jar-with-dependencies.jar ${java.home}/lib/rt.jar net.sf.proguard proguard-base 5.2 runtime
更新2(17.01.2016 20:29 MSK): mvn clean compile assembly:single install
失败。 最后的消息可以在这里看到。
proguard-maven-plugin
将模糊项目的主要工件,而不是maven-assembly-plugin
生成的辅助工件jar-with-dependencies
。
您需要通过指定injar
属性来配置插件以模糊jar-with-dependencies
:
指定要处理的应用程序的输入jar名称(或战争,耳朵,拉链)。
${project.build.finalName}-jar-with-dependencies.jar
现在,在POM中执行插件的顺序也存在问题:我们需要确保在proguard-maven-plugin
之前执行maven-assembly-plugin
proguard-maven-plugin
。 因此,最好为绑定到package
阶段的maven-assembly-plugin
定义一个显式执行,而不是使用assembly:single
从命令行手动调用它。 这将是配置:
maven-assembly-plugin assembly single package jar-with-dependencies
然后,你只需要确保proguard-maven-plugin
插件配置在你的POM之后。
完成后,使用mvn clean install
调用Maven将导致带有依赖关系的混淆jar。
为了测试您的实际POM,我添加了两个存储库:
-
https://repo.spongepowered.org/maven
解决了spongeapi
依赖关系。 -
http://maven.restlet.com
解决org.restlet.jse
依赖关系。
使用这两个依赖项,ProGuard生成警告,因为org.restlet.ext.jackson
依赖项使用不在构建路径上的com.sun.msv.*
类。 由于我认为您的代码当前正在工作,这意味着不需要包含这些类,并且可以忽略这些警告。 因此,我添加了-dontwarn
选项,以便在出现警告时ProGuard不会出错。
我能够成功地使用依赖关系模糊jar的最终POM如下:
4.0.0 com.mycompany myproduct 1.0-SNAPSHOT spongepowered https://repo.spongepowered.org/maven restlet http://maven.restlet.com 2.3.5 ${project.basedir}/src/main/resources true maven-compiler-plugin 3.3 1.8 1.8 org.codehaus.mojo templating-maven-plugin 1.0-alpha-3 filter-src filter-sources maven-assembly-plugin assembly single package jar-with-dependencies com.github.wvengen proguard-maven-plugin 2.0.8 package proguard ${project.build.finalName}-jar-with-dependencies.jar 5.2 ${java.home}/lib/rt.jar net.sf.proguard proguard-base 5.2 runtime org.spongepowered spongeapi 3.0.0 provided junit junit 4.12 org.easytesting fest-assert-core 2.0M8 test org.mockito mockito-core 1.10.19 test org.restlet.jse org.restlet ${restlet-version} org.restlet.jse org.restlet.ext.jackson ${restlet-version} com.googlecode.json-simple json-simple 1.1.1