Moltar
Mitglied
Hallo,
ich brauche für eine Anwendung die Möglichkeit, zur Laufzeit einzelnen Komponenten auszuwechseln. Das soll so funktionieren, dass ich jeweils die verwendeten JAR-Dateien auswechsle.
Die beiden Themen haben mir schon recht weit geholfen:
http://www.tutorials.de/forum/java/224044-aktuelle-jar-datei-nutzen.html
http://www.tutorials.de/forum/java/153725-classpath-dynamisch-setzen.html
Allerdings habe ich noch das Problem, dass das JAR-File unter Windows gesperrt ist. D.h. ich kann es weder löschen noch ersetzen.
Hier meine Klasse:
Und hier der Testcode:
Die geladene Klasse implementiert das Interface ClassManagerTestModuleInterface und stellt eine Methode getString zur Verfügung, die einen Teststring zurückgibt.
Das funktioniert soweit alles. Nun will ich aber während er auf die Eingabe wartet, das JAR austauschen und das geht nicht.
Bin für jeden Hinweis dankbar.
Moltar
ich brauche für eine Anwendung die Möglichkeit, zur Laufzeit einzelnen Komponenten auszuwechseln. Das soll so funktionieren, dass ich jeweils die verwendeten JAR-Dateien auswechsle.
Die beiden Themen haben mir schon recht weit geholfen:
http://www.tutorials.de/forum/java/224044-aktuelle-jar-datei-nutzen.html
http://www.tutorials.de/forum/java/153725-classpath-dynamisch-setzen.html
Allerdings habe ich noch das Problem, dass das JAR-File unter Windows gesperrt ist. D.h. ich kann es weder löschen noch ersetzen.
Hier meine Klasse:
Java:
public class ClassManager {
private final HashMap<String, Class<?>> classes;
public ClassManager() {
classes = new HashMap<String, Class<?>>();
}
public final void loadClass(String classpath, String classname) throws MalformedURLException, ClassNotFoundException {
if(classes.containsKey(classname)) {
return;
}
URL url = new File(classpath).toURI().toURL();
URLClassLoader ucl = new URLClassLoader(new URL[] {url});
Class<?> c = ucl.loadClass(classname);
classes.put(classname, c);
}
public final void unloadClass(String classname) {
if(!classes.containsKey(classname)) {
return;
}
classes.remove(classname);
}
public final <T> T getObject(String classname) throws InstantiationException, IllegalAccessException {
if(!classes.containsKey(classname)) {
return null;
}
return (T) classes.get(classname).newInstance();
}
}
Und hier der Testcode:
Java:
public class ClassManagerTest {
public static void main(String[] args) throws IOException {
run();
System.in.read();
}
public static void run() {
try {
ClassManager manager = new ClassManager();
String jar = "..."; // Gültiger Pfad zu meinem Jar String cn = "..."; // Klassennamen inkl. packages
manager.loadClass(jar, cn);
ClassManagerTestModuleInterface m = manager.getObject(cn);
System.out.println("MODULE: " + m.getString());
m = null;
manager.unloadClass(cn);
} catch(Exception e) {
e.printStackTrace();
}
}
}
Die geladene Klasse implementiert das Interface ClassManagerTestModuleInterface und stellt eine Methode getString zur Verfügung, die einen Teststring zurückgibt.
Das funktioniert soweit alles. Nun will ich aber während er auf die Eingabe wartet, das JAR austauschen und das geht nicht.
Bin für jeden Hinweis dankbar.
Moltar