java实现解压jar文件到某个目录/压缩某个目录为jar文件(好记性不如烂笔头)
这里实现一个小功能,仅用于记忆
功能:
- 解压一个jar包到本地一个目录
- 把一个目录压缩成一个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());
}
作者:樊同学
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2022-03-03 手写一个@Transactional注解,实现事务回滚