• Java实现动态修改Jar包内文件内容


    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    
    import java.io.*;
    import java.util.Enumeration;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    import java.util.jar.JarOutputStream;
    
    /**
     * jarPath: jar包所在路径
     * jarFilePath: jar中想要修改文件所在的路径
     * regex:正则表达式
     * replacement:替换的字符串
     * 注意:Jar包内的jar包内的文件不适用!
     */
    public class JarTool {
    
        public void change(String jarPath, String jarFilePath, String regex, String replacement) throws IOException {
            File file = new File(jarPath);
            JarFile jarFile = new JarFile(file);// 通过jar包的路径 创建Jar包实例
            change(jarFile, jarFilePath, regex, replacement);
        }
    
        public void change(JarFile jarFile, String jarFilePath, String regex, String replacement) throws IOException {
            JarEntry entry = jarFile.getJarEntry(jarFilePath);//通过某个文件在jar包中的位置来获取这个文件
            //创建该文件输入流
            InputStream input = jarFile.getInputStream(entry);
            //获取entries集合lists
            List<JarEntry> lists = new LinkedList<>();
            Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry jarEntry = entries.nextElement();
                lists.add(jarEntry);
            }
            String s = readFile(input, regex, replacement);// 读取并修改文件内容
            writeFile(lists, jarFilePath, jarFile, s);// 将修改后的内容写入jar包中的指定文件
            jarFile.close();
        }
    
        private static String readFile(InputStream input, String regex, String replacement)
                throws IOException {
            InputStreamReader isr = new InputStreamReader(input);
            BufferedReader br = new BufferedReader(isr);
            StringBuilder buf = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                // 此处根据实际需要修改某些行的内容
                buf.append(line);
                buf.append(System.getProperty("line.separator"));
            }
            br.close();
            return buf.toString().replaceAll(regex, replacement);
        }
    
        private static void writeFile(List<JarEntry> lists, String jarFilePath,
                                     JarFile jarFile, String content) throws IOException {
            FileOutputStream fos = new FileOutputStream(jarFile.getName(), true);
            JarOutputStream jos = new JarOutputStream(fos);
            try {
                for (JarEntry je : lists) {
                    if (je.getName().equals(jarFilePath)) {
                        // 将内容写入文件中
                        jos.putNextEntry(new JarEntry(jarFilePath));
                        jos.write(content.getBytes());
                    } else {
                        //表示将该JarEntry写入jar文件中 也就是创建该文件夹和文件
                        jos.putNextEntry(new JarEntry(je));
                        jos.write(streamToByte(jarFile.getInputStream(je)));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭流
                jos.close();
            }
        }
    
        private static 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();
        }
    
    
        public static void main(String[] args) throws IOException {
            JarTool jarTool = new JarTool();
            jarTool.change("D:\IDEA\workSpace\demo.jar"
                    , "spring/spring-aop.xml", "expression=".*"", "expression="%%"");
        }
    
    }
    
    

    版权声明

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

  • 相关阅读:
    java中math类
    java中的值传递和引用传递(转)
    eclipse 字体和配色修改
    JAR WAR EAR包的区别
    java中基本类型
    tomcat 7.0 配置详解
    或许你需要一些可操作性更强的实践
    Assembly.CreateInstance()与Activator.CreateInstanc
    OOD沉思录2 类和对象的关系包含关系
    C#的插件开发
  • 原文地址:https://www.cnblogs.com/onblog/p/13043398.html
Copyright © 2020-2023  润新知