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