文档章节

工具类-解压jar

SunnyWu
 SunnyWu
发布于 08/20 17:27
字数 423
阅读 1
收藏 0

场景

  • 页面上传jar包
  • 后台解压jar包
  • 页面展示所有package
  • 选择一个package
  • 页面显示class和子package
    • 选择class,进入class解析页面
    • 选择package,显示class和子package

解压jar

package com.wuxiongwei.java.jar2;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
 * 非常好的工具类 <br>
 * 解压jar.
 * @author
 * @version 1.0.0
 */
public class JarDecompression {

    protected static Log log = LogFactory.getLog(JarDecompression.class);

    @SuppressWarnings("resource")
    public static void uncompress(File jarFile, File tarDir) throws IOException {
        JarFile jfInst = new JarFile(jarFile);
        Enumeration enumEntry = jfInst.entries();
        while (enumEntry.hasMoreElements()) {
            JarEntry jarEntry = (JarEntry) enumEntry.nextElement();
            File tarFile = new File(tarDir, jarEntry.getName());
            if(jarEntry.getName().contains("META-INF")){
                File miFile = new File(tarDir, "META-INF");
                if(!miFile.exists()){
                    miFile.mkdirs();
                }

            }
            makeFile(jarEntry, tarFile);
            if (jarEntry.isDirectory()) {
                continue;
            }
            FileChannel fileChannel = new FileOutputStream(tarFile).getChannel();
            InputStream ins = jfInst.getInputStream(jarEntry);
            transferStream(ins, fileChannel);
        }
    }

    /**
     * 流交换操作
     * @param ins 输入流
     * @param channel 输出流
     */
    private static void transferStream(InputStream ins, FileChannel channel) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 10);
        ReadableByteChannel rbcInst = Channels.newChannel(ins);
        try {
            while (-1 != (rbcInst.read(byteBuffer))) {
                byteBuffer.flip();
                channel.write(byteBuffer);
                byteBuffer.clear();
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            if (null != rbcInst) {
                try {
                    rbcInst.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != channel) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 打印jar文件内容信息
     * @param file jar文件
     */
    public static void printJarEntry(File file) {
        JarFile jfInst = null;;
        try {
            jfInst = new JarFile(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Enumeration enumEntry = jfInst.entries();
        while (enumEntry.hasMoreElements()) {
            log.info((enumEntry.nextElement()));
        }
    }

    /**
     * 创建文件
     * @param jarEntry jar实体
     * @param fileInst 文件实体
     * @throws IOException 抛出异常
     */
    public static void makeFile(JarEntry jarEntry, File fileInst) {
        if (!fileInst.exists()) {
            if (jarEntry.isDirectory()) {
                fileInst.mkdirs();
            } else {
                try {
                    fileInst.createNewFile();
                } catch (IOException e) {
                    log.error("创建文件失败>>>".concat(fileInst.getPath()));
                }
            }
        }
    }

    public static void main(String[] args) {
        File jarFile = new File("/Users/mac/Documents/other/bw2/bopsdk-openapi-1.0.2-Release.jar");
        File targetDir = new File("/Users/mac/Documents/other/bw2/test/");
        try {
            JarDecompression.uncompress(jarFile, targetDir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文转载自:http://wuxiongwei.com/archives/jardecompression

SunnyWu
粉丝 12
博文 66
码字总数 11164
作品 0
苏州
架构师
私信 提问
Android APK反编译就这么简单

使用工具: CSDN上下载地址: apktool (资源文件获取) 下载 dex2jar(源码文件获取) 下载 jd-gui (源码查看) 下载 工具介绍: apktool 作用:资源文件获取,可以提取出图片文件和布局文...

QGlaunch
2016/05/16
52
0
关于jar包签名的问题

在写一个工具,需要一个解压的功能,是zip的文件,开始使用了系统自带的解压类,但是报错了“ java.util.zip.ZipException: invalid entry size ” 在网上查过,或能是编码问题或者什么,于是...

Dean_King
2015/02/02
416
1
修改整合的Jfinal的Model自动绑定表插件 AutoTableBindPlugin

之前发过一个 JFinal 自动探测Model 注册插件 AutoScanPlugin http://my.oschina.net/b1412/blog/67764 然后参考了 @Flio 对我的代码做出的扩展 jfinal的Model自动绑定表插件 http://www.osc...

绝望的八皮
2012/07/20
4.1K
9
Proguard进行Android代码混淆

在实际的开发成产品apk的发布过程中,我们经常会使用到代码混淆技术。不过在讲解如何进行代码混淆之前,我先跟大家演示一下反编译的过程,这样才能让大家明白为什么需要进行代码混淆。 一、代...

丁佳辉
2015/11/09
173
0
修改generator源码之xml添加新的sql元素

背景: 我发现我要用到一个批量添加的方法,但是generator并没有提供,要是每次都自己去写一遍又很麻烦,然后就各种尝试,最后决定改generator的源码(第一次修改别人的源码,尝试了10次才成...

太黑_thj
2016/11/15
78
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
5
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
9
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
7
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
10
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部