解决jar包rar压缩后无法运行问题
jar包rar压缩后无法运行
报错为Failed to get nested archive for entry
java.io.IOException: Unable to open nested jar file
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包或者更新后的引入lib包,复制到压缩目录时需要选择压缩方式,一定要选择存储方式。
不然rar默认会给你再次压缩,部署到linux后项目就无法正常运行。
再次压缩后大小与未压缩时不一致,所以会报错。
一定要选择存储方式复制或覆盖到压缩目录
java解压缩zip和rar的工具类
import java.io.File; import java.io.FileOutputStream; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Expand; import de.innosystec.unrar.Archive; import de.innosystec.unrar.rarfile.FileHeader; public class DeCompressUtil { /** * 解压zip格式压缩包 * 对应的是ant.jar */ private static void unzip(String sourceZip,String destDir) throws Exception{ try{ Project p = new Project(); Expand e = new Expand(); e.setProject(p); e.setSrc(new File(sourceZip)); e.setOverwrite(false); e.setDest(new File(destDir)); /* ant下的zip工具默认压缩编码为UTF-8编码, 而winRAR软件压缩是用的windows默认的GBK或者GB2312编码 所以解压缩时要制定编码格式 */ e.setEncoding("gbk"); e.execute(); }catch(Exception e){ throw e; } } /** * 解压rar格式压缩包。 * 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar */ private static void unrar(String sourceRar,String destDir) throws Exception{ Archive a = null; FileOutputStream fos = null; try{ a = new Archive(new File(sourceRar)); FileHeader fh = a.nextFileHeader(); while(fh!=null){ if(!fh.isDirectory()){ //1 根据不同的操作系统拿到相应的 destDirName 和 destFileName String compressFileName = fh.getFileNameString().trim(); String destFileName = ""; String destDirName = ""; //非windows系统 if(File.separator.equals("/")){ destFileName = destDir + compressFileName.replaceAll("\\\\", "/"); destDirName = destFileName.substring(0, destFileName.lastIndexOf("/")); //windows系统 }else{ destFileName = destDir + compressFileName.replaceAll("/", "\\\\"); destDirName = destFileName.substring(0, destFileName.lastIndexOf("\\")); } //2创建文件夹 File dir = new File(destDirName); if(!dir.exists()||!dir.isDirectory()){ dir.mkdirs(); } //3解压缩文件 fos = new FileOutputStream(new File(destFileName)); a.extractFile(fh, fos); fos.close(); fos = null; } fh = a.nextFileHeader(); } a.close(); a = null; }catch(Exception e){ throw e; }finally{ if(fos!=null){ try{fos.close();fos=null;}catch(Exception e){e.printStackTrace();} } if(a!=null){ try{a.close();a=null;}catch(Exception e){e.printStackTrace();} } } } /** * 解压缩 */ public static void deCompress(String sourceFile,String destDir) throws Exception{ //保证文件夹路径最后是"/"或者"\" char lastChar = destDir.charAt(destDir.length()-1); if(lastChar!='/'&&lastChar!='\\'){ destDir += File.separator; } //根据类型,进行相应的解压缩 String type = sourceFile.substring(sourceFile.lastIndexOf(".")+1); if(type.equals("zip")){ DeCompressUtil.unzip(sourceFile, destDir); }else if(type.equals("rar")){ DeCompressUtil.unrar(sourceFile, destDir); }else{ throw new Exception("只支持zip和rar格式的压缩包!"); } } }
修改jar文件,重新打包
报错
Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/xxxx-0.0.1-SNAPSHOT.jar'
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:261)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:247)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:109)
... 4 more
Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/xxxx-0.0.1-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
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:287)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:269)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:258)
... 6 more
Socket error Event: 32 Error: 10053.
Connection closing...Socket close.
处理方案
方案一:
解压jar文件
- jar -xvf ./*.jar
- jar -xf jar文件
修改解压后后的文件
重新打包
- jar -cfM0 *.jar ./
方案二:
- winrar或7zip添加文件的时候, 将选择压缩方式由"标准"改为存储(Store)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
springboot vue接口测试前后端树节点编辑删除功能
这篇文章主要为大家介绍了springboot vue接口测试前后端树节点编辑删除功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-05-05springboot快速集成mybatis-plus的详细教程
这篇文章主要介绍了springboot快速集成mybatis-plus的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09
最新评论