>所有的依赖和
>我的代码的模糊版本.
它不起作用 – 我的代码在“jar-with-dependencies”文件中没有被模糊化.
当我运行mvn clean编译安装生成的文件包含我的应用程序的模糊代码,但没有依赖关系.
为了拥有一个具有所有依赖关系和我的混淆代码的JAR文件,我该怎么办?
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>myproduct</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <restlet-version>2.3.5</restlet-version> </properties> <dependencies> <dependency> <groupId>org.spongepowered</groupId> <artifactId>spongeapi</artifactId> <version>3.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.easytesting</groupId> <artifactId>fest-assert-core</artifactId> <version>2.0M8</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.10.19</version> <scope>test</scope> </dependency> <dependency> <groupId>org.restlet.jse</groupId> <artifactId>org.restlet</artifactId> <version>${restlet-version}</version> </dependency> <dependency> <groupId>org.restlet.jse</groupId> <artifactId>org.restlet.ext.jackson</artifactId> <version>${restlet-version}</version> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency> </dependencies> <build> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>templating-maven-plugin</artifactId> <version>1.0-alpha-3</version> <executions> <execution> <id>filter-src</id> <goals> <goal>filter-sources</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.8</version> <executions> <execution> <phase>package</phase> <goals><goal>proguard</goal></goals> </execution> </executions> <configuration> <proguardVersion>5.2</proguardVersion> <options> <option>-allowaccessmodification</option> <option>-dontoptimize</option> <option>-dontshrink</option> <option>-dontnote</option> <option>-keepattributes Signature</option> <option>-keep class com.mycompany.MyPlugin { *; }</option> </options> <libs> <lib>${java.home}/lib/rt.jar</lib> </libs> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <version>5.2</version> <scope>runtime</scope> </dependency> </dependencies> </configuration> </plugin> </plugins> </build> </project>
更新1(17.01.2016 19:54 MSK):更改了ProGuard配置,如下所示,但是mvn clean编译程序集:single仍然使用无模糊化的类文件生成JAR.
<plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.8</version> <executions> <execution> <phase>package</phase> <goals><goal>proguard</goal></goals> </execution> </executions> <configuration> <proguardVersion>5.2</proguardVersion> <options> <option>-allowaccessmodification</option> <option>-dontoptimize</option> <option>-dontshrink</option> <option>-dontnote</option> <option>-keepattributes Signature</option> <option>-keep class com.mycompany.MyPlugin { *; }</option> </options> <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> <libs> <lib>${java.home}/lib/rt.jar</lib> </libs> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <version>5.2</version> <scope>runtime</scope> </dependency> </dependencies> </configuration> </plugin>
更新2(17.01.2016 20:29 MSK):mvn clean compile assembly:single install Failed.最后的消息可以看出here.
解决方法
您需要配置插件以通过指定injar
属性来模糊jar-with-dependencies:
Specifies the input jar name (or wars,ears,zips) of the application to be processed.
<injar>${project.build.finalName}-jar-with-dependencies.jar</injar>
现在,在POM中执行插件的顺序还有一个问题:我们需要确保在proguard-maven-plugin之前执行maven-assembly-plugin.因此,最好定义绑定到软件包阶段的maven-assembly-plugin的显式执行,而不是使用assembly:single从命令行手动调用它.这将是配置:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>assembly</id> <goals> <goal>single</goal> </goals> <phase>package</phase> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin>
然后,您只需要确保proguard-maven-plugin插件配置在POM之后.
这样做后,使用mvn clean install调用Maven将导致一个混淆的jar包含依赖关系.
要测试您的实际POM,我添加了两个存储库:
> https://repo.spongepowered.org/maven来解决beachapi依赖关系.
> http://maven.restlet.com来解析org.restlet.jse依赖关系.
对于这2个依赖关系,ProGuard生成警告,因为org.restlet.ext.jackson依赖关系使用不在构建路径上的com.sun.msv.*类.由于我认为您的代码正在工作,所以这意味着这些类不需要被包括,并且这些警告可以被忽略.因此,我添加了-dontwarn选项,以便ProGuard在出现警告时不会发生错误.
我能够使用依赖关系成功模糊jar的最终POM如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>myproduct</artifactId> <version>1.0-SNAPSHOT</version> <repositories> <repository> <id>spongepowered</id> <url>https://repo.spongepowered.org/maven</url> </repository> <repository> <id>restlet</id> <url>http://maven.restlet.com</url> </repository> </repositories> <properties> <restlet-version>2.3.5</restlet-version> </properties> <build> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>templating-maven-plugin</artifactId> <version>1.0-alpha-3</version> <executions> <execution> <id>filter-src</id> <goals> <goal>filter-sources</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>assembly</id> <goals> <goal>single</goal> </goals> <phase>package</phase> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.8</version> <executions> <execution> <phase>package</phase> <goals><goal>proguard</goal></goals> <configuration> <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> <!-- make sure to obfuscate the jar with dependencies --> <proguardVersion>5.2</proguardVersion> <options> <option>-allowaccessmodification</option> <option>-dontoptimize</option> <option>-dontshrink</option> <option>-dontnote</option> <option>-dontwarn</option> <!-- added option to ignore com.sun missing classes --> <option>-keepattributes Signature</option> <option>-keep class com.mycompany.MyPlugin { *; }</option> </options> <libs> <lib>${java.home}/lib/rt.jar</lib> </libs> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <version>5.2</version> <scope>runtime</scope> </dependency> </dependencies> </configuration> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.spongepowered</groupId> <artifactId>spongeapi</artifactId> <version>3.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.easytesting</groupId> <artifactId>fest-assert-core</artifactId> <version>2.0M8</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.10.19</version> <scope>test</scope> </dependency> <dependency> <groupId>org.restlet.jse</groupId> <artifactId>org.restlet</artifactId> <version>${restlet-version}</version> </dependency> <dependency> <groupId>org.restlet.jse</groupId> <artifactId>org.restlet.ext.jackson</artifactId> <version>${restlet-version}</version> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency> </dependencies> </project>