【发布时间】:2016-08-18 17:33:49
【问题描述】:
总结
我一直试图让Proguard 与Spring-boot 一起为obfuscation 工作,但在使用maven 构建后无法让Spring-boot 运行。我已经搜索并发现有人在谈论相同的问题,但我没有看到它已解决。
我有 2 个应用程序。
- A2 需要 A1
- A1
我只需要将obfuscation 构建到 A2 中,但理想情况下我想将它构建到两者中。
我正在创建一个 executable Spring-boot jar 来运行 A1 和 A3。
我可以让maven 打包并创建executable jar,但是当我运行它时,我得到下面的堆栈跟踪说compressed and nested jar files must be stored without compression。
问题
如何在不压缩嵌套 jar 的情况下让 proguard 构建我的应用程序?
谢谢
堆栈跟踪
Exception in thread "main" java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/commons-lang3-3.4.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
at org.springframework.boot.loader.c.k.e(JarFile.java:285)
at org.springframework.boot.loader.c.k.c(JarFile.java:260)
at org.springframework.boot.loader.c.k.a(JarFile.java:248)
at org.springframework.boot.loader.c.k.a(JarFile.java:237)
at org.springframework.boot.loader.a.c.a(JarFileArchive.java:103)
at org.springframework.boot.loader.a.c.a(JarFileArchive.java:87)
at org.springframework.boot.loader.a.c(ExecutableArchiveLauncher.java:72)
at org.springframework.boot.loader.c.a(Launcher.java:49)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58)
POM 插件详情
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.13</version>
<executions>
<execution>
<id>proguard</id>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- File with proguard configuration -->
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<obfuscate>true</obfuscate>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jce.jar</lib>
</libs>
<options>
<option>-optimizations !class/marking/final</option>
<option>-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF,META-INF/spring.*</option>
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option>
<option>-keepclasseswithmembers public class * { public static void main(java.lang.String[]);}</option>
</options>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>5.2.1</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
Proguard.conf
# Don't obfuscate or remove your entry point
-keep public class com.something.InitialRunner{public static void main(java.lang.String[]);}
-ignorewarnings
-dontoptimize
-dontshrink
# Uncomment if you want to have more meaningful backtraces
# Useful for obfuscation debugging
# You absolutely must keep this commented out for production
#-keepattributes SourceFile,LineNumberTable
【问题讨论】:
-
在 Maven 中,您是否将所有依赖项放入单个 jar 中执行?这可能是问题所在。我一直不得不将 Spring 库保存在可执行 jar 之外,以便它们正常工作。
-
@JRSofty 是的,我试图让它构建一切,包括 Spring 和我所有的库。您如何设置构建以排除这些库并在运行时使用它们?您是在构建没有弹簧库的混淆 jar,然后重建以使用该 jar 和弹簧生成一个可执行文件吗?谢谢
-
可能是 maven 正在执行压缩。您可能需要查看文档。一项检查是在没有 proguard 的情况下编译并查看 jar 是否运行或抛出相同的异常。
-
@JRSofty 该应用程序在没有 Proguard 的情况下运行良好。这仅在添加时发生。你是如何在 proguard 中没有 spring 的情况下构建你的应用程序的,你可以通过 proguard 设置发布或发送电子邮件给 aaronmagi@gmail.com 一个示例 pom。谢谢
标签: java spring maven spring-boot proguard