先说碰到的问题,和如何解决的。
问题,更新可执行JAR包里的lib JAR包后,执行JAR包,报如下错误:
Caused by: java.lang.IllegalStateException: Unable to open nested entry '****/lib/***-1.0-SNAPSHOT.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
原因:先截个图给你看:
说明:错误说明的意思是,你改过的这个JAR啊不应该是压缩过的,应该是仅存储的也就是算法这一列你改过的这个JAR不应该是Deflate应该和其他的JAR包一样Store。
解决方案:问题清楚了开始解决。很简单我找了个工具Winrar,多么普通的一个压缩工具啊。
当添加修改后的JAR包的时候compression method选择store。也就是直接存储不压缩。
问题搞定了。
接下来详细的说一下:
先说一下我碰到这个问题的背景吧。
我手里有一个可执行Jar包,有且仅有一个Jar包,没有源码。我发现这个可执行Jar包发布出去后,有个功能出了问题。由于没有源码,你只能反编译来看(JD-GUI,自行了解一下),轻松定位到问题。问题出在这个可执行Jar包里的BOOT-INF/lib下的一个lib Jar包里。
然后我做了以下动作
1.把出问题的的class文件反编译,把内容copy出来做一个同名,同包的java文件。修改问题点。
2.把可执行Jar包打开,把所有的lib Jar包copy出来,本地搭建了可以编译第1条里改正过的java类的环境。
3.把编译后的正确的class放回lib Jar包里,替换掉原来有问题的class文件。
4.把lib Jar 包放回可执行Jar包内。
5.执行Jar包。出问题了。
Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/service-1.0-SNAPSHOT.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
6.然后就有了上边解决问题得方法了。