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