Servlet - Problem mit nachladen von JARs

Also im moment sieht es folgendermaßen aus:
Ich habe ein Konfigurationsfile (xml). In dieser Konfig sind erst einmal alle Funktionen aufgelistet, die mein Servlet ausführen kann. Zu jeder Funktion steht die entsprechende Resource dabei, bzw die ID zu der Resource. Die Resources selbst sind auch in der Konfig aufgelistet, zu jeder ID steht das passende File, momentan sind es nur Jars.

Wenn das Servlet dann läuft und eine Funktion aufgerufen wird, soll anhand der Resource ID der Funktion in der Konfig, der Connector entsprechend initalisiert werden.

Momentan bestehen die Resources nur aus Jar Files, später wird mein Servlet auch eine JavaScript Engine haben, die Resources können dann also auch Skripte sein.

Darf ich einfach mal blöd fragen, wie du es machen würdest?
Die "Bestückung" in Form von Jar Files wird sich nicht oft ändern. Beim aufsetzen des Servlets werden dann die entsprechenden Jars integriert, Konfig angepasst und das wars.
Wenn eine neues Jar integriert wird, heißt das, das der anwender auch ein neues ERP System hat, wird ja denk ich nicht soooo oft vorkommen.
Wie das bei bei den Skripten aussieht kann ich auch nicht genau sagen, ob und wie oft sich diese ändern...

Das die verschiedenen Resourcen in Jar Files liegen sollen, kommt nicht von mir, sondern ist eine Anforderung!

gruß
Timo
 
Zuletzt bearbeitet:
Okay... mir stellen sich folgende Fragen / Gedanken:

Das Servlet soll Anfragen bearbeiten und sich gleichzeitig um irgendeine Form von Konfiguration kümmern. Das klingt für mich nach einer Verletzung des Seperation of Concerns. Ist es für dich nicht auf irgendeine Art und Weise möglich, die Konfiguration und Bestückung komplett vor bzw. während des Deployments durchzuführen?

Nehmen wir mal folgende Idee. Ausgangspunkt ist ja, dass dein Servlet eine Anfrage bzgl. eine Funktionalität bekommt. Es muss dann wahrscheinlich entscheiden, ob es diese Funktionalität ausführen kann, oder nicht. Falls ja wird an das entsprechende Plugin delegiert. (Hab ich das richtig verstanden?)

Wie wärs dann, wenn die Plugins ein Interface implementieren, so dass das Servlet das Plugin fragen kann, ob es die Anfrage bearbeiten kann. z.B. so:

Java:
public interface Plugin {

   public boolean supports(FunctionalityRequest request);
}

Nun könntest du die Plugin Konfiguration in init() einlesen und sämtliche PLugins in einer Liste vorhalten und bei einem Request über die Liste iterieren und die Plugins fragen, ob sie die Anfrage bearbeiten können.

Deployment: reicht es nicht, einfach die Jars für die Plugins in den Classpath zu legen (WEB-INF/lib) und die Konfiguration anzupassen?

Kann sein, dass ich jetzt vollkommen am Thema vorbeigeredet hab. :D Ich seh halt in deiner Problembeschreibung noch nichts, was diese Dynamik Klassen nachzuladen erfordert. Und wenn man sich Technologie sparen kann, sollte man das tun.

Wenn Modularität zur Laufzeit wichtig ist (v.A. die Austauschbarkeit von Modulen) würde ich wohl auf OSGi setzen.

Gruß
Ollie
 
Ja du hast mich richtig verstanden!
Ich hab mich anscheinend nicht gut ausgedrückt... Die Bestückung soll ja im vorhinein ausgeführt werden. Ob mein Servlet eine Funktionalität ausführen kann, soll eigentlich nur davon abhängen, ob die Quelle auch da ist, also das entsprechende Jar da ist, da die Plugins ja ein Interface des Connectors implementieren und deshalb alle gleich Aufgebaut sind.

Modulariät zur Laufzeit spielt eigentlich keine Rolle, da hast du vollkommen Recht.
Wenn ich die Jars in den Classpath lege, heißt das doch auch, jedes mal wenn ein Plugin, also ein Jar hinzugefügt wird, muss ich auch die classpath Datei anpassen, oder?

gruß
Timo
 
jo, und da steht drin, was du über die projekteigenschaften dem classpath hinzufügst. Das ding brauchst du nicht manuell editieren.
 
Ja da hast du Recht. Momentan hab ich es einfach so gemacht, das ich die Jar Pakete im WEB-INF/lib hab, und im Init() meine Connectoren in einer liste initalisiere, dabei lade ich die Klassen aus den Jar Paketen mit getClass().getClassLoader().loadclass("x.y.Z").
 
Zuletzt bearbeitet:
Ich habe die im Lib Ordner. Aber die Klassen muss ich doch noch über den ClassLoader laden oder nicht? Ich weiß ja im vorhinein nicht welche Klassen letztendlich in dem Libs Ordner liegen, das erfahr ich ja erst nach dem einlesen der Config, deswegen kann ich z.B. nicht sagen : Connector connector = new XY();, sondern das muss ja "dynamisch" gemacht werden, je nachdem was in der Config steht.
 
Zurück