【问题标题】:Proguard + Spring Boot + Maven maintain structureProguard + Spring Boot + Maven 维护结构
【发布时间】:2018-04-30 22:12:36
【问题描述】:

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

    在我看来,您的 spring boot 插件没有正确打包混淆的 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>
    

    【讨论】:

    • 我已经尝试在插件中进行相同的更改,但仍然缺少弹簧包。当我运行应用程序时,我得到一个错误' no main manifest attribute, in demo-min.jar '。你没有改变其他任何东西?
    • 你能在github上添加一个有同样问题的虚拟项目吗
    【解决方案2】:

    我发现并解决了您的问题,最后得出的结论与我的第一个答案相同。根据春季文档

    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 sn-p 中建议的那样。

    <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

    【讨论】:

    • 好的,我认为现在正在工作。我使用了错误的罐子我的错误。感谢您的帮助
    • @Shailesh 我按照您的方式进行操作,但在执行 Proguard 创建的 Jar 时出现以下错误:java -jar spring-sso.jar 线程“main”中的异常 java.lang.IllegalStateException: Failed to获取条目 BOOT-INF/lib/spring-boot-starter-web-1.5.8.RELEASE.jar 的嵌套存档原因:无法打开嵌套 jar 文件 'BOOT-INF/lib/spring-boot-starter-web- 1.5.8.RELEASE.jar” 原因:java.lang.IllegalStateException:无法打开嵌套条目'BOOT-INF/lib/spring-boot-starter-web-1.5.8.RELEASE.jar'。它已被压缩并且嵌套的 jar 文件必须在不压缩的情况下存储。
    • @Riky : 我在度假,你能解决你的问题吗
    • @Shailesh 不幸的是没有。
    猜你喜欢
    • 2017-03-26
    • 2017-10-15
    • 2016-09-25
    • 1970-01-01
    • 2012-01-23
    • 2015-09-19
    • 1970-01-01
    • 2017-05-15
    • 2016-06-30
    相关资源
    最近更新 更多