Proguard + Spring Boot + Maven 维护结构
Proguard + Spring Boot + Maven maintain structure
我在 spring 引导应用程序(版本 1.5.8)上使用 proguard-maven-plugin 时遇到以下问题。
我正在尝试混淆最终的 jar 文件,但混淆后的 jar 中缺少一些文件。
基本上我缺少 BOOT-INF 和 org.springframework.boot.loader 包,而且 META-INF 有一个
与原始 jar 文件不同的结构。
这是我在 pom.xml
中的内容
<profiles>
<profile>
<id>obfuscation</id>
<build>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.14</version>
<executions>
<execution>
<id>proguard</id>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<obfuscate>true</obfuscate>
<injar>${project.build.finalName}.jar</injar>
<outjar>${project.build.finalName}-min.jar</outjar>
<outputDirectory>${project.build.directory}</outputDirectory>
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>5.3.3</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
这是我的proguard.conf
-dontshrink
-verbose
-optimizationpasses 3
-keepdirectories
-keep class * extends *
-keep interface * extends *
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *;
}
我使用以下命令执行混淆
mvn clean package -DskipTests=true -P obfuscation
如何在混淆后的jar中保持jar文件的原始结构。我尝试了不同的方法,但没有成功。
提前致谢
在我看来,您的 spring 启动插件没有正确打包混淆的 jar
以下配置对我有效
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<start-class>org.springframework.boot.loader.JarLauncher</start-class>
</configuration>
</execution>
</executions>
</plugin>
我弄清楚并解决了您的问题,最后得出的结论与我的第一个答案相同。根据 spring 文档
https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html
此配置将重新打包在 Maven 生命周期的打包阶段构建的 jar 或 war。
事实上 spring 插件正在为重新打包选择您的 in-jar。
要解决这个问题,请保持 in-jar 和 out-jar 的名称相同,正如我在我的 maven 片段中所建议的那样。
<configuration>
<obfuscate>true</obfuscate>
<injar>${project.build.finalName}.jar</injar>
<outjar>${project.build.finalName}.jar</outjar>
<outputDirectory>${project.build.directory}</outputDirectory>
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
</configuration>
别担心 proguard 会保留原始 in-jar 的副本,如下所示
Output
我在 spring 引导应用程序(版本 1.5.8)上使用 proguard-maven-plugin 时遇到以下问题。 我正在尝试混淆最终的 jar 文件,但混淆后的 jar 中缺少一些文件。 基本上我缺少 BOOT-INF 和 org.springframework.boot.loader 包,而且 META-INF 有一个 与原始 jar 文件不同的结构。
这是我在 pom.xml
中的内容<profiles>
<profile>
<id>obfuscation</id>
<build>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.14</version>
<executions>
<execution>
<id>proguard</id>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<obfuscate>true</obfuscate>
<injar>${project.build.finalName}.jar</injar>
<outjar>${project.build.finalName}-min.jar</outjar>
<outputDirectory>${project.build.directory}</outputDirectory>
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>5.3.3</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
这是我的proguard.conf
-dontshrink
-verbose
-optimizationpasses 3
-keepdirectories
-keep class * extends *
-keep interface * extends *
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *;
}
我使用以下命令执行混淆
mvn clean package -DskipTests=true -P obfuscation
如何在混淆后的jar中保持jar文件的原始结构。我尝试了不同的方法,但没有成功。
提前致谢
在我看来,您的 spring 启动插件没有正确打包混淆的 jar
以下配置对我有效
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<start-class>org.springframework.boot.loader.JarLauncher</start-class>
</configuration>
</execution>
</executions>
</plugin>
我弄清楚并解决了您的问题,最后得出的结论与我的第一个答案相同。根据 spring 文档
https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html
此配置将重新打包在 Maven 生命周期的打包阶段构建的 jar 或 war。
事实上 spring 插件正在为重新打包选择您的 in-jar。
要解决这个问题,请保持 in-jar 和 out-jar 的名称相同,正如我在我的 maven 片段中所建议的那样。
<configuration>
<obfuscate>true</obfuscate>
<injar>${project.build.finalName}.jar</injar>
<outjar>${project.build.finalName}.jar</outjar>
<outputDirectory>${project.build.directory}</outputDirectory>
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
</configuration>
别担心 proguard 会保留原始 in-jar 的副本,如下所示
Output