Java动态打Jar包工具类

来源:互联网 发布:redis批量查询数据 编辑:程序博客网 时间:2024/06/16 22:07
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();}}}}

0 0