Proguard + Spring Boot + Maven维护结构

时间:2017-11-17 07:34:58

标签: java maven spring-boot proguard maven-plugin

我在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文件的原始结构。我尝试了不同的方法,但没有运气。

提前致谢

2 个答案:

答案 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的副本,如下所示

Output

答案 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>