java 代码执行jar包的合并解压压缩的操作

Posted 请叫我大师兄_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 代码执行jar包的合并解压压缩的操作相关的知识,希望对你有一定的参考价值。

一般是Linux命令行下,进行操作就能拆jar、解压jar,把n个jar给合并了。

下面是java代码实现这几个操作的util。

public class JarUtil 

    /**
     * copy jar,不带过滤器,就是copy,带条件,就是copy某些pkg下的class
     *
     * @param src    要copy的jar
     * @param des    copy出来叫的名称
     * @param filter 过滤器,copy什么pkg开头的class文件
     * @throws Exception 异常
     */
    public static void copyJar(File src, File des, String filter) throws Exception 
        JarInputStream srcJar = null;
        JarOutputStream desJar = null;
        boolean none = true;
        try 
            srcJar = new JarInputStream(new BufferedInputStream(new FileInputStream(src)));
            Manifest manifest = srcJar.getManifest();
            if (manifest == null) 
                desJar = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(des)));
             else 
                desJar = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(des)), manifest);
            

            byte[] bytes = new byte[1024];
            while (true) 
                //重点
                ZipEntry entry = srcJar.getNextJarEntry();
                if (entry == null) 
                    break;
                
                String name = entry.getName();
                if (!name.startsWith(filter)) 
                    continue;
                
                none = false;
                //desJar.putNextEntry(entry);//这个会报错zipexception invalid entry compressed size (expected 36586 but got 37005 bytes)
                desJar.putNextEntry(new ZipEntry(entry.getName()));


                int len = srcJar.read(bytes, 0, bytes.length);
                while (len != -1) 
                    desJar.write(bytes, 0, len);
                    len = srcJar.read(bytes, 0, bytes.length);
                
            
            desJar.finish();
         finally 
            if (srcJar != null) 
                srcJar.close();
            
            if (desJar != null) 
                desJar.close();
            
        

        if (none) 
            boolean delete = des.delete();
        
    

    /**
     * 解压jar包
     *
     * @param src    要解压的包
     * @param desDir 解压到的目录
     * @throws Exception 异常
     */
    public static void unJar(File src, File desDir) throws Exception 
        JarInputStream jarIn = new JarInputStream(new BufferedInputStream(new FileInputStream(src)));
        if (!desDir.exists()) 
            desDir.mkdirs();
        
        byte[] bytes = new byte[1024];

        while (true) 
            ZipEntry entry = jarIn.getNextJarEntry();
            if (entry == null) 
                break;
            

            File desTemp = new File(desDir.getAbsoluteFile() + File.separator + entry.getName());

            //jar条目是空目录
            if (entry.isDirectory()) 
                if (!desTemp.exists()) 
                    desTemp.mkdirs();
                
             else 
                File parentDir = new File(desTemp.getParent());
                if (!parentDir.exists()) 
                    parentDir.mkdirs();
                
                //jar条目是文件
                BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(desTemp));
                int len = jarIn.read(bytes, 0, bytes.length);
                while (len != -1) 
                    out.write(bytes, 0, len);
                    len = jarIn.read(bytes, 0, bytes.length);
                

                out.flush();
                out.close();

            
            jarIn.closeEntry();
        

        //解压Manifest文件
        Manifest manifest = jarIn.getManifest();
        if (manifest != null) 
            File manifestFile = new File(desDir.getAbsoluteFile() + File.separator + JarFile.MANIFEST_NAME);
            if (!manifestFile.getParentFile().exists()) 
                manifestFile.getParentFile().mkdirs();
            
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(manifestFile));
            manifest.write(out);
            out.close();
        

        //关闭JarInputStream
        jarIn.close();
    


    /**
     * 读取文件内容并压缩
     *
     * @param filePath 文件路径
     */
    public static void compressFileToJar(String filePath, String jarFilePath) 
        try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFilePath))) 
            //递归的压缩文件夹和文件
            doCompress("", filePath, jos);
            //必须
            jos.finish();
         catch (Exception e) 
            System.out.println(e);
        
    

    public static void doCompress(String parentFilePath, String filePath, JarOutputStream jos) 
        File sourceFile = new File(filePath);
        if (!sourceFile.exists()) 
            return;
        
        String jarEntryName = parentFilePath + "/" + sourceFile.getName();
        if (parentFilePath.isEmpty()) 
            jarEntryName = sourceFile.getName();
        
        if (sourceFile.isDirectory()) 
            File[] childFiles = sourceFile.listFiles();
            if (Objects.isNull(childFiles)) 
                return;
            
            for (File childFile : childFiles) 
                doCompress(jarEntryName, childFile.getAbsolutePath(), jos);
            
         else 
            int len = -1;
            byte[] buf = new byte[1024];
            jarEntryName = jarEntryName.substring(jarEntryName.indexOf("/") + 1);
            try (InputStream input = new BufferedInputStream(new FileInputStream(sourceFile))) 
                jos.putNextEntry(new JarEntry(jarEntryName));
                while ((len = input.read(buf)) != -1) 
                    jos.write(buf, 0, len);
                
             catch (Exception e) 
                e.printStackTrace();
            
        
    

以上是关于java 代码执行jar包的合并解压压缩的操作的主要内容,如果未能解决你的问题,请参考以下文章

java 代码执行jar包的合并解压压缩的操作

JAVA中jar包和war包的区别是

Linuxwar包的解压与压缩

请问大家,能不能修改jar包中已有的文件呢?

Linux下如何在不解压jar包查看或修改配置文

用Java制作打rar压缩包程序