首页 > 编程语言 >java实现解压jar文件到某个目录/压缩某个目录为jar文件(好记性不如烂笔头)

java实现解压jar文件到某个目录/压缩某个目录为jar文件(好记性不如烂笔头)

时间:2023-03-03 17:44:58浏览次数:44  
标签:String jar 目录 File 某个 new fileName class

这里实现一个小功能,仅用于记忆

功能:

  1. 解压一个jar包到本地一个目录
  2. 把一个目录压缩成一个jar包
/**
     * 1,读取jar包,得到class文件
     * 2,把class文件持久化到本地磁盘
     * 3,组装class文件打成一个新jar包
     * 4,新jar包提交到flink环境去执行任务
     */
    public static void main(String[] args) throws Exception {
        //解压jar文件到临时目录
        List<String> classPathList = unzipJar("D:\\Downloads\\", "D:\\IDEA_PROJECT\\Custom_operator\\flink-test\\target\\flink-1.0.jar");
        //重新压缩成jar包
        zipJar("D:\\Downloads\\","test.jar","D:\\Downloads\\");

    }

    /**
     * 将classPath路径下的所有文件,打成jar包。
     * jar包的路径是${binJarPath}\${binJarName}.jar
     *
     * 主要还是里面工具包里面的jar命令部分的代码
     * @param binJarPath 生成jar包的地址
     * @param binJarName 生成jar包的名字
     * @param classPath 所有的.class文件所在的路径
     */
    public static void zipJar(String binJarPath, String binJarName, String classPath) throws Exception {
        if (new File(classPath).exists()) {
            Class clazz = Class.forName("sun.tools.jar.Main");
            Constructor constructor = clazz.getConstructor(new Class[]{PrintStream.class, PrintStream.class, String.class});
            Object object = constructor.newInstance(System.out, System.err, "jar");
            Method method = clazz.getMethod("run", String[].class);
            String[] args = new String[5];
            args[0] = "-cvf";
            args[1] = binJarPath + binJarName;
            args[2] = "-C";
            args[3] = classPath;
            args[4] = ".";
            method.invoke(object, new Object[]{args});
        }
    }


    /**
     * 解压缩jar文件
     * @param destinationDir 要解压到的文件路径
     * @param jarPath  jar文件路径
     * @return List<String> 类路径
     * @throws IOException
     */
    public static List<String> unzipJar(String destinationDir, String jarPath) throws IOException {
        File file = new File(jarPath);
        JarFile jar = new JarFile(file);

        List<String> classPathList = new ArrayList<>();

        for (Enumeration<JarEntry> enums = jar.entries(); enums.hasMoreElements(); ) {
            JarEntry entry = (JarEntry) enums.nextElement();
            String fileName = destinationDir + File.separator + entry.getName();
            File f = new File(fileName);
            if (fileName.endsWith("/")) {
                f.mkdirs();
            }
            classPathList.add(fileName);
        }

        for (Enumeration<JarEntry> enums = jar.entries(); enums.hasMoreElements(); ) {
            JarEntry entry = (JarEntry) enums.nextElement();
            String fileName = destinationDir + File.separator + entry.getName();
            File f = new File(fileName);
            if (!fileName.endsWith("/")) {
                InputStream is = jar.getInputStream(entry);
                FileOutputStream fos = new FileOutputStream(f);
                while (is.available() > 0) {
                    fos.write(is.read());
                }
                fos.close();
                is.close();
            }
            classPathList.add(fileName);
        }
        return classPathList.stream().filter(s->s.indexOf(".class")!=-1).collect(Collectors.toList());
    }

标签:String,jar,目录,File,某个,new,fileName,class
From: https://www.cnblogs.com/fantongxue/p/17176458.html

相关文章

  • 判断某个值是否存在指定枚举类中
    publicenumPayRecordPayWayEnum{BALANCE(1,"余额"),//1:余额ALI(2,"支付宝"),//2:支付宝WECHAT(3,"微信"),//3:......
  • 安装SQL时在功能选择时提示出"为 INSTALLSHAREDDIR 参数指定的目录“C:\Program File
    C盘被压缩了,可取消压缩:打开“我的电脑”-右键单击压缩过的分区-在“常规”选项卡下取消“压缩驱动器以节约磁盘空间”前的小勾。如果想取消单个文件夹的加密,可以在文件......
  • springboot启动报错 Failed to scan *****/derbyLocale_ja_JP.jar from classloader h
    springboot启动报错Failedtoscan*****/derbyLocale_ja_JP.jarfromclassloaderhierarchy 这两天自己在玩虚拟机,想把线上的平台复制一份到虚拟机上,jdk,tomcat服务,防......
  • 51电子-STC89C51开发板:目录
    51电子(我要电子:www.51dz.com),是国内最早一批的电子类相关网站,在深圳有实体店。这个系列文章以STC89C51来做笔记,讲解使用过程。 ------------------------------------......
  • react使用this.setState给数组中某个对象赋值
    先记录一下正确写法const{payTypeList}=this.state;lettemp=payTypeListdat.openFlag=type//这一句是必须的,不然状态无法更改temp.map((i......
  • L10_用日语询问某个东西多少钱
    概述动画会话A:たくさんありますね。有好多啊。B:すごいでしょう。これはサラサラヘア。これはツヤが出るティプ很棒吧。这款是让头发顺滑。这款是让头发出......
  • 如何查看任务管理器中某个进程的详细命令行
    有一次追查一个进程,然后想起来任务管理器可以查看进程命令行,做下记录并提供给有需要的同学首先右键,选择"任务管理器"打开任务管理器   发现没有显示命令行那一列信......
  • 增量更新jar包,常见报错问题
    1.压缩报错我们在增量更新jar时,有新增的依赖包。重新打包之后,报错:Ithasbeencompressedandnestedjarfilesmustbestoredwithoutcompression.Pleasecheckthemec......
  • Linux的目录结构
    /   根目录(Unix和Linux中没有盘符的概念)一个硬盘一个根/bin 系统的常用命令目录。包括控制台命令、系统可执行文件、系统的核心二进制文件等/etc  发布目录。保......
  • Linux的目录结构
    /   根目录(Unix和Linux中没有盘符的概念)一个硬盘一个根/bin 系统的常用命令目录。包括控制台命令、系统可执行文件、系统的核心二进制文件等/etc  发布目录。保......