摘要:一般來說,可以被加入到中的東西,除了文件夾,就只有包了但有的時(shí)候,我們可能希望將一個(gè)已經(jīng)存在的包里面的所有文件加入,這包括下的所有文件和下的所有包直接將該包加入中是不能達(dá)到上述目的的,那么就可以使用下面這個(gè)工具達(dá)到此目的用法
一般來說,可以被加入到j(luò)ava classpath中的東西,除了文件夾,就只有jar包了;
但有的時(shí)候,我們可能希望將一個(gè)已經(jīng)存在的war包里面的所有class文件加入classpath,這包括/WEB-INF/classes下的所有class文件和/WEB-INF/lib下的所有jar包;
直接將該war包加入classpath中是不能達(dá)到上述目的的,那么就可以使用下面這個(gè)工具達(dá)到此目的:
package kilim.tools; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * classloader which allows user to set a war archive path to be included in the * classpath dynamically. * * @author pf_miles * */ public class WarPathClassLoader extends URLClassLoader { private boolean warPathSet; private String explodedWarPath; public WarPathClassLoader(ClassLoader parent) { super(new URL[0], parent); } public void setWarPath(String path) { if (this.warPathSet) throw new RuntimeException("War archive path already set. Kilim-fiber tools cannot weave multiple war archives at the same time."); File w = new File(path); if (w.exists()) { final File dir; try { warPathSet = true; // 0.create a temp dir dir = createTempDirectory(w.getName()); // 1.extract the war to the temp dir extractTo(w, dir); // 2.add /WEB-INF/classes to cp File clses = locateFile(dir, "WEB-INF", "classes"); super.addURL(clses.toURI().toURL()); // 3.add all jars under /WEB-INF/lib/ to cp File lib = locateFile(dir, "WEB-INF", "lib"); File[] jars = lib.listFiles(); for (File j : jars) super.addURL(j.toURI().toURL()); } catch (MalformedURLException e) { throw new RuntimeException(e); } // delete temp dir when exit Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { if (dir != null) { delRecur(dir); } } })); this.explodedWarPath = dir.getAbsolutePath(); } else { throw new RuntimeException("File not exists: " + path); } } private static void delRecur(File file) { if (!file.exists()) return; if (file.isDirectory()) { // 1.del sub files first for (File s : file.listFiles()) delRecur(s); // 2.del the dir file.delete(); } else { file.delete(); } } private static File locateFile(File dir, String... paths) { File cur = dir; outter: for (String p : paths) { File[] all = cur.listFiles(); for (File f : all) { if (p.equals(f.getName())) { cur = f; continue outter; } } throw new RuntimeException("No path named "" + p + "" found in file: " + cur.getAbsolutePath()); } return cur; } // extract content of "w" to dir private static void extractTo(File w, File dir) { String dirPath = dir.getAbsolutePath(); if (!dirPath.endsWith("/")) dirPath += "/"; try { JarFile jar = new JarFile(w); Enumeratione = jar.entries(); byte[] buf = new byte[4096]; while (e.hasMoreElements()) { JarEntry file = (JarEntry) e.nextElement(); File f = new File(dirPath + file.getName()); if (file.isDirectory()) { // if its a directory, create it f.mkdirs(); continue; } InputStream is = jar.getInputStream(file); FileOutputStream fos = ensureOpen(f); // write contents of "is" to "fos" for (int avai = is.read(buf); avai != -1; avai = is.read(buf)) { fos.write(buf, 0, avai); } fos.close(); is.close(); } } catch (IOException e) { throw new RuntimeException(e); } } // if does not exist, create one, and ensure all parent dirs exist private static FileOutputStream ensureOpen(File f) throws IOException { if (!f.exists()) { File p = f.getParentFile(); if (p != null && !p.exists()) p.mkdirs(); f.createNewFile(); } return new FileOutputStream(f); } private static File createTempDirectory(String dirName) { final File temp; try { temp = File.createTempFile(dirName, Long.toString(System.currentTimeMillis())); temp.deleteOnExit(); } catch (IOException e) { throw new RuntimeException(e); } if (!(temp.delete())) { throw new RuntimeException("Could not delete temp file: " + temp.getAbsolutePath()); } if (!(temp.mkdir())) { throw new RuntimeException("Could not create temp directory: " + temp.getAbsolutePath()); } return (temp); } /** * get the temporary directory path which contains the exploded war files */ public String getExplodedWarPath() { if (this.explodedWarPath == null) throw new RuntimeException(""explodedWarPath" is null, maybe the war path is not set."); return this.explodedWarPath; } }
用法:new一個(gè)WarPathClassLoader實(shí)例,然后調(diào)用setWarPath指定war包所在位置即可
gist地址:https://gist.github.com/pfmiles/2002fdace1caa247618b
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64418.html
摘要:的打包結(jié)構(gòu)改動(dòng)是這個(gè)引入的這個(gè)的本意是簡(jiǎn)化的繼承關(guān)系,以一種直觀的優(yōu)先的方式來實(shí)現(xiàn),同時(shí)打包結(jié)構(gòu)和傳統(tǒng)的包應(yīng)用更接近。目前的繼承關(guān)系帶來的一些影響有很多用戶可能會(huì)發(fā)現(xiàn),一些代碼在里跑得很好,但是在實(shí)際部署運(yùn)行時(shí)不工作。 前言 對(duì)spring boot本身啟動(dòng)原理的分析,請(qǐng)參考:http://hengyunabc.github.io/s... Spring boot里的ClassLoad...
時(shí)間:2017年12月01日星期五說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 熱部署的使用場(chǎng)景 本地調(diào)式 線上發(fā)布 熱部署的使用優(yōu)點(diǎn) 無論本地還是線上,都適用 無需重啟服務(wù)器:提高開發(fā)、調(diào)式效率、提升發(fā)布、運(yùn)維效率、降低運(yùn)維成本 前置...
摘要:注本系列文章所用版本為介紹是個(gè)輕量級(jí)的框架,致力于讓程序員實(shí)現(xiàn)快速高效開發(fā),它具有以下幾個(gè)方面的優(yōu)勢(shì)熱加載。在調(diào)試模式下,所有修改會(huì)及時(shí)生效。拋棄配置文件。約定大于配置。 注:本系列文章所用play版本為1.2.6 介紹 Play framework是個(gè)輕量級(jí)的RESTful框架,致力于讓java程序員實(shí)現(xiàn)快速高效開發(fā),它具有以下幾個(gè)方面的優(yōu)勢(shì): 熱加載。在調(diào)試模式下,所有修改會(huì)及時(shí)...
摘要:第一次寫技術(shù)文章,主要內(nèi)容是使用創(chuàng)建一個(gè)簡(jiǎn)單的項(xiàng)目,如有操作或理解錯(cuò)誤請(qǐng)務(wù)必指出,當(dāng)謙虛學(xué)習(xí)。基本思想其實(shí)就是一個(gè)項(xiàng)目引用別的模塊包,最終項(xiàng)目被打成包發(fā)布。 第一次寫技術(shù)文章,主要內(nèi)容是使用maven創(chuàng)建一個(gè)簡(jiǎn)單的SpringMVC WEB 項(xiàng)目,如有操作或理解錯(cuò)誤請(qǐng)務(wù)必指出,當(dāng)謙虛學(xué)習(xí)。做這一次的工作主要是因?yàn)橄爰訌?qiáng)一下自己對(duì)Spring Web 項(xiàng)目的理解,因?yàn)槠綍r(shí)都是直接寫業(yè)務(wù)代...
摘要:比如說,就是復(fù)姓,名字為的類別則是復(fù)姓,名字為的類別。先介紹的機(jī)制基本原則需要將類文件切實(shí)安置到其所歸屬之所對(duì)應(yīng)的相對(duì)路徑下。把源代碼文件,文件和其他文件有條理的進(jìn)行一個(gè)組織,以供來使用。可以使用通配符,代表某下所有的,不包括子目錄。 一些人用了一陣子的Java,可是對(duì)于 Java 的 package 跟 import 還是不太了解。很多人以為原始碼 .java 文件中的 import...
閱讀 1385·2021-11-22 09:34
閱讀 2591·2021-11-12 10:36
閱讀 1124·2021-11-11 16:55
閱讀 2338·2020-06-22 14:43
閱讀 1477·2019-08-30 15:55
閱讀 1988·2019-08-30 15:53
閱讀 1775·2019-08-30 10:50
閱讀 1231·2019-08-29 12:15