Servlet - Problem mit nachladen von JARs

Beatsteak

Grünschnabel
Hallo erstmal,

ich brauche eure hilfe.
Hab mir schon den ganzen morgen die verschiedensten Beispiele zum nachladen von Jar´s angesehen und auch viel probiert, aber in meinem Falle will es trotzdem nicht klappen. Hier mein Problem:

In meinem Servlet habe ich ein Interface erstellt. Je nachdem welche Funktion ausgeführt werden soll, muss eine Klasse nachgeladen werden, welche das Interface implementiert. Soweit sogut. Die Klasse/n die nachgeladen werden soll/en habe ich in Jar Dateien exportiert.
Diese Jar Datein sollen nachher bei meinem Servlet beispielsweise in einem Plugins Ordner liegen. Ich möchte aber nicht das mein Plugins Ordner die Struktur der Packages haben soll (Plugins/de/servlet/connector/test.jar), sondern die Jar Dateien sollen einfach im Plugins Ordner liegen.

Ich hab einen URLClassLoader erstellt, beim Initalisieren gebe ich ihm in "urls" den pfad zu den entsprechenden Jar Datei mit.
Code:
URLClassLoader ucl = new URLClassLoader(urls);
ucl.loadClass("de.ae.erp.connector.test.Test");

Das klappt nicht, jedes mal bekomm ich folgende Fehlermeldung:
java.lang.NoClassDefFoundError: de/ae/erp/connector/Connector

Warum kann er den Connector selbst, also das Inferace nicht finden?
Muss ich noch irgendwas in der classpath Datei anpassen?

Ich weiß mir einfach keinen Rat mehr, ich wäre wirklich für jede hilfe Dankbar!

gruß
Timo
 
Ich vermute der neue ClassLoader kennt das Jar in dem dein Interface liegt nicht. Du musst dem auch den aktuellen Classpath mitgeben.

Gruß
Ollie
 
Das Interface ist eigentich teil der "Hauptanwendung", also der Servlets. Das Interface liegt genau da, wo es die Fehlermeldung sagt, aber in keiner JAR sondern in Packages im Servlet selbst. Oder muss ich wenn ich eine Klasse, die ich in Jars auslagere und die ein Inferface implementiert, in die Jar Datei auch das Interface mit reinpacken?
 
Wie gesagt, dein neuer ClassLoader weiß nichts von deinem aktuellen Classpath - gar nichts! Wenn du da ein Jar lädst, dann kennt er exakt dieses Jar, nichts von irgendwelchen WEB-INF/classes, WEB-INF/lib...

Gruß
Ollie
 
Klingt logisch :-)
Wie kann ich dem URLClassLoader denn meinen Classpath mitteilen oder mitgeben? Der URLClassLoader hat ja auch einen Konstruktor, der einen ClassLoader erwartet...

Hab eben ganz vergessen mich für deine schnelle Hilfe zu bedanken, also: Danke!

gruß
Timo
 
Hallo,

dann gib dem URLClassLoader doch als Parent den aktuellen
Thread.currentThread().getContextClassLoader() bzw. getClass().getClassLoader() in deinem Servlet.

Gruß Tom
 
Hallo,

das hab ich ja gemacht, aber die loadclass gibt trotzdem null zurück. Ich weiß einfach nicht was ich falsch mache. Liegt das denn nur daran das der ClassLoader den Classpath nicht kennt?
 
Zur Info: Habs jetzt hinbekommen... Jetzt wo ich den getClass().getClassLoader() dem URLClassLoader mitgegeben hab, funktionierts richtig.

Jetzt hab ich mal noch eine Frage an die Experten:
Wie schon erwähnt lade ich ja Jars nach, die meine Connectoren enthalten. Jetzt bin ich am überlegen was mehr Sinn macht, die Jars beim Init() meines Servlet alle reinzuladen, ober jedes mal dann den entsprechenden Connector reinzuladen, wenn er benötigt wird. Ich denke, es würde mehr Sinn machen alle beim Init() zu laden, da mein Servlet (im besten Falle ;) ) auch mal paar Tage am Stück läuft. Oder wie seht ihr das? Wie Resourcenfressend ist denn das einladen von Klassen aus Jars?

Vielen Dank nochmal für die Hilfe!
Gruß
Timo
 
Was ich eher für bedenklich halte, wäre dein Nachladekonstrukt in doGet oder doPost. Damit wüdest du bei jedem Request einen neuen Classloader hohziehen und damit unweigerlich für nen ziemliches Chaos sorgen.

Wenn du es in init() machen willst, stellt sich die Frage, warum du die Sachen dann nicht in irgendnem Konfigurationsfile ablegst. Wirklich dynamisch ist das dann nämlich nicht mehr und man kann sich den Classloader krams sparen.

Die Frage ist doch eigentlich eher, welche fachlichen Anforderungen deine Anwendung stellt. Wie oft kann sich denn so eine "Bestückung" ändern?

Gruß
Ollie
 

Neue Beiträge

Zurück