解决jar包rar压缩后无法运行问题

 更新时间:2024年05月20日 11:41:01   作者:Therf  
这篇文章主要介绍了解决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)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java 对象的克隆(浅克隆和深克隆)

    java 对象的克隆(浅克隆和深克隆)

    这篇文章主要介绍了java 对象的克隆的相关资料,这里对浅克隆和深克隆进行了实例分析需要的朋友可以参考下
    2017-07-07
  • Shell脚本管理Java应用程序的高效方法

    Shell脚本管理Java应用程序的高效方法

    在软件开发中,管理和监控 Java 应用程序的运行状态变得愈加重要,本文将分享一个自用的简单但高效的 Shell 脚本,帮助轻松管理 JAR 包的启动、停止和日志管理,需要的朋友可以参考下
    2024-09-09
  • JavaMail整合Spring实现邮件发送功能

    JavaMail整合Spring实现邮件发送功能

    这篇文章主要为大家详细介绍了JavaMail整合Spring实现邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringBoot项目中连接Gauss数据库

    SpringBoot项目中连接Gauss数据库

    本文主要介绍了SpringBoot项目中连接Gauss数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 如何解决@value获取不到yaml数组的问题

    如何解决@value获取不到yaml数组的问题

    文章介绍了在使用YAML配置文件时,通过@Value注解获取整数和数组列表的配置方法,并提供了两种解决方案:一种适用于非嵌套列表,另一种适用于嵌套列表等复杂配置
    2024-11-11
  • 基于Java在netty中实现线程和CPU绑定

    基于Java在netty中实现线程和CPU绑定

    这篇文章主要介绍了基于Java在netty中实现线程和CPU绑定,文章围绕主题的相关内容展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • JAVA利用泛型返回类型不同的对象方法

    JAVA利用泛型返回类型不同的对象方法

    下面小编就为大家带来一篇JAVA利用泛型返回类型不同的对象方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • java中归并排序和Master公式详解

    java中归并排序和Master公式详解

    大家好,本篇文章主要讲的是java中归并排序和Master公式详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • java原装代码完成pdf在线预览和pdf打印及下载

    java原装代码完成pdf在线预览和pdf打印及下载

    本文主要介绍了java原装代码完成pdf在线预览和pdf打印及下载的方法,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java 图片与byte数组互相转换实例

    Java 图片与byte数组互相转换实例

    下面小编就为大家带来一篇Java 图片与byte数组互相转换实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论