栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java动态修改Jar内容

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java动态修改Jar内容

最近项目中遇到需要动态构建Jar包的任务,需要构建的Jar的内容其实都差不多,只是需要更改配置文件里面的一些东西,网上的那些方法不是不行就是导致Jar无法运行了,冲浪一番后,结合网上的资料后解决了

我这里拿的是SrpingBoot resources下的jar,生成的位置也是resources下

    @SneakyThrows
    public void demo() {
        String personId = "8888888";
        //修改SpringBoot的application.yml文件内容
        String data = "12j3h1i7tsa7sgdajk123y8asd: " + personId;
        //jar位置
        File jarFile = new ClassPathResource("app/TimerScrap.jar").getFile();
        //新jar包位置
        String resultPath = URLDecoder.decode(this.getClass().getClassLoader().getResource("app/").getFile(), "UTF-8");
        upJarFile(jarFile, resultPath, "BOOT-INF/classes/application.yml", personId, data);
    }


    
    @SneakyThrows
    private void upJarFile(File originalJarFile, String resultPath, String upFilePath, String newJarName, String content) {
        //获取jar文件
        JarFile jarFile = new JarFile(originalJarFile);
        //获取当前jar中的所有文件
        Enumeration entries = jarFile.entries();
        //创建同名jar
        JarOutputStream jarOutputStream = new JarOutputStream(new FileOutputStream(resultPath + newJarName + ".jar"));
        while (entries.hasMoreElements()) {
            //获取原jar包下的文件
            JarEntry jarEntry = entries.nextElement();
            //匹配是否是需要更改的文件
            if (upFilePath.equals(jarEntry.getName())) {
                //添加到新jar包中(这里一定要自己重新 new JarEntry,否则用原jar中的文件就是字节数、编码对不上
                JarEntry upJarEntry = new JarEntry(upFilePath);
                jarOutputStream.putNextEntry(upJarEntry);
                jarOutputStream.write(content.getBytes(StandardCharsets.UTF_8));
            } else {
                //添加到新jar包中
                jarOutputStream.putNextEntry(jarEntry);
                jarOutputStream.write(streamToByte(jarFile.getInputStream(jarEntry)));
            }
        }
        jarOutputStream.close();
    }

    
    private byte[] streamToByte(InputStream inputStream) {
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        try {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return outSteam.toByteArray();
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490066.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号