Hallo zusammen,
ich bin gerade dabei für eine kleine Anwendung einen Classloader zu schreiben, der nach dem Start dynamisch die Jar-Dateien einliest, die sich in einem vorgegebenen Ordner befinden. Aus meiner Sicht hat dies den Vorteil, dass die Anwendung auf neue Bibliotheken zugreifen kann und deshalb nicht immer wieder neu kompiliert werden muss. Außerdem kann der Anwender den Austausch der JAR-Dateien selbständig durchführen, sofern er dies machen möchte.
Der folgende Code funktioniert soweit auch:
Zur besseren Protokollierung möchte ich einbauen, dass die Methode loadJarsOfFolder eine ArrayList zurückgibt, mit den Jar-Dateien, die eingebunden wurden. Dazu erweitere ich das obige Beispiel wie folgt:
Das führt allerdings zum Problem, dass keine Ausgabe in die genannte Log-Datei erfolgt. Darüber hinaus wird die Fehlermeldung NoClassDefFoundError geschmissen, wenn ich den Logger mittels Java-Code konfiguriere. Diese Fehlermeldung wird allerdings bei beiden Varianten erzeugt.
Hat jemand auf dem ersten Blick eine Idee, woran es liegen könnte oder was ich in meiner Realisierung nicht bedacht habe? Ich bin über jeden Hinweis dankbar.
Vielen Grüße
Mathias
ich bin gerade dabei für eine kleine Anwendung einen Classloader zu schreiben, der nach dem Start dynamisch die Jar-Dateien einliest, die sich in einem vorgegebenen Ordner befinden. Aus meiner Sicht hat dies den Vorteil, dass die Anwendung auf neue Bibliotheken zugreifen kann und deshalb nicht immer wieder neu kompiliert werden muss. Außerdem kann der Anwender den Austausch der JAR-Dateien selbständig durchführen, sofern er dies machen möchte.
Der folgende Code funktioniert soweit auch:
Java:
public class StartMain {
public static void main(String[] args) {
StartMain.loadJarsOfFolder(Thread.currentThread()
.getContextClassLoader(), "lib");
PropertyConfigurator.configure("properties/log4j.properties");
Log log = LogCreator.getAdminInstance(StartMain.class);
log.info("JAR-Pakete initialisiert");
}
public static void loadJarsOfFolder(ClassLoader classLoader,
String folder) {
if (classLoader instanceof URLClassLoader) {
try {
Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] { URL.class });
addUrlMethod.setAccessible(true);
if (null != addUrlMethod) {
File libFolder = new File("lib");
for (File jar : libFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File arg0, String arg1) {
return s.toLowerCase().endsWith(".jar")
}
})) {
try {
addUrlMethod.invoke(classLoader, jar.toURI().toURL());
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Zur besseren Protokollierung möchte ich einbauen, dass die Methode loadJarsOfFolder eine ArrayList zurückgibt, mit den Jar-Dateien, die eingebunden wurden. Dazu erweitere ich das obige Beispiel wie folgt:
Java:
public class StartMain {
public static void main(String[] args) {
ArrayList<String> msg = StartMain.loadJarsOfFolder(Thread.currentThread()
.getContextClassLoader(), "lib");
PropertyConfigurator.configure("properties/log4j.properties");
Log log = LogCreator.getAdminInstance(StartMain.class);
log.info("JAR-Pakete initialisiert");
for (String elem : msg) {
log.info(elem);
}
}
public static ArrayList<String> loadJarsOfFolder(ClassLoader classLoader,
String folder) {
ArrayList<String> msg = new ArrayList<String>();
if (classLoader instanceof URLClassLoader) {
try {
Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL",
new Class[] { URL.class });
addUrlMethod.setAccessible(true);
if (null != addUrlMethod) {
File libFolder = new File("lib");
for (File jar : libFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File arg0, String arg1) {
return s.toLowerCase().endsWith(".jar")
}
})) {
try {
addUrlMethod.invoke(classLoader, jar.toURI().toURL());
msg.add(System.currentTimeMillis() + " added " + jar.toURI() + "to classpath.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return msg;
}
}
Das führt allerdings zum Problem, dass keine Ausgabe in die genannte Log-Datei erfolgt. Darüber hinaus wird die Fehlermeldung NoClassDefFoundError geschmissen, wenn ich den Logger mittels Java-Code konfiguriere. Diese Fehlermeldung wird allerdings bei beiden Varianten erzeugt.
Hat jemand auf dem ersten Blick eine Idee, woran es liegen könnte oder was ich in meiner Realisierung nicht bedacht habe? Ich bin über jeden Hinweis dankbar.
Vielen Grüße
Mathias