Java动态打Jar包工具类

import java.io.*;
import java.net.*;
import java.util.jar.*;
import java.util.regex.Matcher;

/**
 * 打Jar包工具类
 */
public class JarPackageUtil {
	/**
	 * 动态生成Jar包
	 */
	public static File createJar(Class<?> clazz) throws Exception {
		String clsName = clazz.getName();
		String base = clsName.substring(0, clsName.lastIndexOf("."));
		base = base.replaceAll("\\.", Matcher.quoteReplacement("/"));
		URL root = clazz.getResource("");

		JarOutputStream out = null;
		final File jar = File.createTempFile("storm-", ".jar", new File(System.getProperty("java.io.tmpdir")));
		System.out.println(jar.getAbsolutePath());
		Runtime.getRuntime().addShutdownHook(new Thread() {
			public void run() {
				//运行完成后删除jar包
				jar.delete();
			}
		});
		try {
			File path = new File(root.toURI());
			Manifest manifest = new Manifest();
			manifest.getMainAttributes().putValue("Manifest-Version", "1.0");
			manifest.getMainAttributes().putValue("Created-By", "JarPackageUtil");
			out = new JarOutputStream(new FileOutputStream(jar), manifest);
			writeBaseFile(out, path, base);
		} finally {
			out.flush();
			out.close();
		}
		return jar;
	}

	/**
	 * 递归添加.class文件
	 */
	private static void writeBaseFile(JarOutputStream out, File file, String base) throws IOException {
		if (file.isDirectory()) {
			File[] fl = file.listFiles();
			if (base.length() > 0) {
				base = base + "/";
			}
			for (int i = 0; i < fl.length; i++) {
				writeBaseFile(out, fl[i], base + fl[i].getName());
			}
		} else {
			out.putNextEntry(new JarEntry(base));
			FileInputStream in = null;
			try {
				in = new FileInputStream(file);
				byte[] buffer = new byte[1024];
				int n = in.read(buffer);
				while (n != -1) {
					out.write(buffer, 0, n);
					n = in.read(buffer);
				}
			} finally {
				in.close();
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值