java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > jar包rar压缩后无法运行

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

作者: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文件

修改解压后后的文件

重新打包

方案二:

总结

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

您可能感兴趣的文章:
阅读全文