我在spring boot应用程序(ver.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文件的原始结构。我尝试了不同的方法,但没有运气。
提前致谢
答案 0 :(得分:1)
我想出了&amp;解决了你的问题,最后结论与我的第一个答案相同。按照春季文档
https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html
此配置将重新打包在Maven生命周期的打包阶段构建的jar或war。
事实上,Spring插件正在挑选你的罐子里进行重新包装。
要解决此问题,请保留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的副本,如下所示
答案 1 :(得分:0)
在我看来,你的弹簧启动插件没有正确包装混淆的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>