>所有的依赖和
>我的代码的模糊版本.
它不起作用 – 我的代码在“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>