Aktuelle JAR-Datei nutzen ?

vrcat

Mitglied
Hallo zusammen,

ich hätte da mal ne Frage bezüglich später eingebundener JAR-Dateien.

Code:
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class JarLoadExample {
	
	public static void main(String[] args) throws Exception {		
	
		// ClassLoder hollen und einzubindende jar bestimmen ----------
		ClassLoader clL		= JarLoadExample.class.getClassLoader();
		File 		tmpLib 	= new File("desktop.jar");
		
		// Hinzufügen des externen Jar File's zum Classpath ----------- 
		Method m;
		m = URLClassLoader.class.getDeclaredMethod("addURL",	
								   new Class[] {URL.class});
		
m.setAccessible(true);
		m.invoke(clL, new Object[] { tmpLib.toURL() });

		// Klasse erstellen -------------------------------------------
		String classname 	= "desktop.MainDesktop";

		// Neue Instance der Klasse erzeugen --------------------------
		Class  cl  	= Class.forName(classname);
		Object obj 	= cl.newInstance();		
		
	}
}

Nun habe ich die Jar-Datei samt ihrer Klassen in meinem CP und kann die Klassen auch Instanceieren. Nun mein Problem, zur Laufzeit des Programms möchte ich gerne, eine neuere Version der der JAR-Datei einbinden. Das heist ich lösche alle Instancen der Klassen die aus der alte JAR-Datei sind. Danach möchte ich Gleichnamige Klassen aus der neuen JAR-Datei erstellen nur das geht nicht.

Code:
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class JarLoadExample {
	
	public static void main(String[] args) throws Exception {		
	
		// ClassLoder hollen und einzubindende jar bestimmen ----------
		ClassLoader clL		= JarLoadExample.class.getClassLoader();
		File 		tmpLib 	= new File("test.jar");
		
		// Hinzufügen des externen Jar File's zum Classpath ----------- 
		Method m;
		m = URLClassLoader.class.getDeclaredMethod("addURL",	
								   new Class[] {URL.class});
		
		m.setAccessible(true);
		m.invoke(clL, new Object[] { tmpLib.toURL() });

		// Klasse erstellen -------------------------------------------
		String classname 	= "test.Test";

		// Neue Instance der Klasse erzeugen --------------------------
		Class  cl  	= Class.forName(classname);
		Object obj 	= cl.newInstance();		
		obj = null;
		System.gc();
		
		// Aktuellere Version !
		
		// Hinzufügen des externen Jar File's zum Classpath ----------- 
		tmpLib 	= new File("TEST/test.jar");
		m = URLClassLoader.class.getDeclaredMethod("addURL",	
								   new Class[] {URL.class});
		m.setAccessible(true);
		m.invoke(clL, new Object[] { tmpLib.toURL() });
		
		// Neue Instance der Klasse erzeugen --------------------------
		cl  	= Class.forName(classname);
		obj 	= cl.newInstance();	
		
	}
	
	
}

Kann mir da jemand Helfen oder geht das überhaupt was ich vor habe?

mfg vrcat
 
Hallo!

Um das zu erreichen, musst du dafuer sorgen, dass der ClassLoader ueber den die "alten" Klassen geladen wurden (und damit alle durch ihn geladenen Klassen) nicht mehr von einem Thread aus erreicht werden und somit vom GC aufgesammelt werden können. Dann kannst du einen neuen ClassLoader bauen und das andere Jar in dessen ClassPath aufnehmen...

Gruss Tom
 
Zurück