java 代码解析 jar 文件

import org.apache.logging.log4j.util.Base64Util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class JarFileUtils {
    public static void main(String[] args) throws Exception {
        String str = "C:\\Users\\lenovo\\Desktop\\testJar\\bytecode.jar";

        List<String> list = new ArrayList();
        list.add("test\\demo");

        list= list.stream().map(x->x.replace("\\","/")).toList();

        String s = unCompressProjectJarFile(str, list);
        System.out.println("--------------------------------");
        System.out.println(s);
    }


    public static String unCompressProjectJarFile(String filePath, List<String> projectPath) throws Exception {
        File file = new File(filePath);
        if (file.isDirectory()) {

            File[] files = file.listFiles();
            for (File tempFile : files) {
                unCompressProjectJarFile(tempFile.getAbsolutePath(), projectPath);
            }

            return filePath;
        } else {

            if (filePath.endsWith(".jar") || filePath.endsWith(".war")) {

                JarFile jarFile = new JarFile(filePath);
                List<JarEntry> jarEntries = jarFile.stream().toList();
                for (JarEntry entry : jarEntries) {
                    String realName = entry.getRealName();

                    List<String> list = projectPath.stream().filter(x -> {
                        return realName.contains(x);
                    }).toList();

                    if (!list.isEmpty()) {
                        String jarUnCompressPath = unCompressJarFile(filePath);

                        unCompressProjectJarFile(jarUnCompressPath, projectPath);

                        return jarUnCompressPath;
                    }
                }
            }

            return "";
        }
    }

    public static String unCompressJarFile(String filePath) throws Exception {

        File rawFile = new File(filePath);
        // 文件的名称,不包含路径
        String name = rawFile.getName();

        name = Base64Util.encode(name);

        String rootPath = rawFile.getParent() + File.separator + name + File.separator;
        File rootDir = new File(rootPath);
        if (!rootDir.exists()) {
            rootDir.mkdirs();
        }


        JarFile jarFile = new JarFile(filePath);
        List<JarEntry> jarEntries = jarFile.stream().toList();
        for (JarEntry entry : jarEntries) {

            String realName = entry.getRealName();
            String fileName = rootPath + realName;
            File targetFile = new File(fileName);

            if (entry.isDirectory()) {

                if (!targetFile.exists()) {
                    targetFile.mkdirs();
                }

            } else {

                InputStream inputStream = jarFile.getInputStream(entry);

                FileOutputStream outputStream = new FileOutputStream(targetFile);

                byte[] bytes = new byte[1024];
                int len;
                while ((len = inputStream.read(bytes)) > 0) {
                    outputStream.write(bytes, 0, len);
                }

            }
        }

        return rootPath;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值