Calendar

September 2010
S M T W T F S
« Jul    
 1234
567891011
12131415161718
19202122232425
2627282930  

Hacking Java ClassLoader

เนื่องจากว่าการทำงานส่วนมาก ต้องเขียน Business Logic ที่ Store Procedure ใน MS-SQL ทำให้เกิดความลำบากกับการทำ version ของโค๊ดเป็นอย่างมาก เลยอยากจะเขียน Script สั่นๆสักตัวเพื่อดูด Store Procedure มาเก็บเป้นไฟล์ให้ แล้วเราจะได้ดูสิ่งที่ต่างกัน (Diff) และเก็บลง SVN Server ส่วนตัว (ที่ทำงานใช้ CVS ซึ่งไม่ชอบเอาซะเลย)

ก็เลยกะว่างานนี้เขียนสั่นๆ เอา Groovy ดีกว่า ก็เลยเริ่มจาก start groovy console (run>cmd>groovyConsole ) จากนั้นก็เริ่มเขียน code

ทันใดนั้นนึงขึ้นมาได้ว่า กูจะ add jar ยังไงว่ะ ไม่ได้ start เป็น project เอ้ หรือว่า จะไปสร้าง classpath ยังไงละเนี่ย ก็เลยลองไปหาว่าเจ้า Groovy Console มันจะ add classpath ได้ไงบ้าง

ไปเจอที่บอกว่าให้แก groovy start แต่เอ้ มันไม่เท่อ่ะ ไหน groovy บอกว่าตัวเองเป็น dynamic ก็นึกว่ามันจะเอา env ข้างๆมาให้ด้วย เลยเอา jar ไปวางใน Folder ที่ทำการสั่ง groovyConsole (ในใจนึงว่ามันจะเหมือน grails console) เอ๋ ไม่ได้นี่นา

ไม่ไหวแระ ไหนๆก็ไหนๆ เลยลองเขียน ให้ JAVA มันโหลด JAR แบบ on the fly เลยละกัน ไม่อยากเขียน cmd ไป เรียก class

public static void dynmicLoadJar() {
	File libFolder = new File("libs");
	System.out.println("folder: " +libFolder.getAbsolutePath());
 
	File[] jars = libFolder.listFiles();
	System.out.println("jar: " + jars);
	List<URL> urls = new ArrayList<URL>();
	for (int i = 0; i < jars.length; i++) {
		if (jars[i].toString().contains(".jar")) {
			try {
				urls.add(jars[i].toURL());
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
		}
	}
 
	for (URL url : urls) {
		try {
			System.out.println("Dynamic add " + url.toString() + " to class path");
			URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
			Class clazz = URLClassLoader.class;
			Method method = clazz.getDeclaredMethod("addURL", new Class[]{URL.class});
			method.setAccessible(true);
			method.invoke(classLoader, new Object[]{url});
			Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");
		} catch (Exception ex) {
			System.err.println("Error when dynamic load jar");
			ex.printStackTrace();
		}
	}
}

ซึ่งจะทำการโหลด JAR ที่อยู่ใน folder libs มาให้เอง โดยใช้ reflection ยัดเข้าไปใน URLClassLoader ของ Java

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • Facebook
  • Google Bookmarks
  • Live
  • MySpace
  • PDF
  • RSS
  • Twitter
  • Yahoo! Bookmarks
  • email

1 comment to Hacking Java ClassLoader

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">