Externe .jar ohne copy einbinden und up-to-date halten

Hallo Leute,
ist es möglich eine .jar in ein Java-Programm einzuhängen, welches extern referenziert und up-to-date gehalten wird?
D.h. die .jar soll bei einer Re-Compilierung in einem externen Bezug ebenfalls geupdatet werden.

Unsere Struktur sieht momentan wie folgt aus:

  • Wir haben einen WebService, der aus einem externen Ordner eine .jar-Datei benutzt.
  • Beim Einbinden der .jar wird diese in unsere WEB-INF/lib kopiert. (Dieser Schritt soll ausgelassen werden)
  • Compiliert man nun die externe .jar-Datei neu wird im WEB-INF/lib-Ordner des WebService natürlich weiterhin die alte Version der .jar verwendet, was zu Problemen führt.

How to Solve?
Danke für eure Hilfe :slight_smile:

Ich hab von WebServices quasi kaum eine Ahnung, deswegen mag meine Antwort vielleicht etwas naiv sein. Aber kannst du nicht beim Start des Java-Programms prüfen, ob eine neue Version vorhanden ist?

Der WebService ist eigentlich nur eine Randinformation, das Verhalten ist wie, als ob die .jar unter /dist/lib liegt. (Und hier soll sie eben nicht liegen, sondern von extern - Relativer oder Absoluter Pfad - referenziert werden).
Das Problem ist ja, dass die .jar schon vor Start des Java-Programms aktuell sein muss und das Projekt nicht recompiliert werden soll.

WEB-INF/lib sagt mir, dass Ihr einen Webcontainer à la Tomcat oder einen JEE-Container à la JBoss verwendet. Dass die Jars genau da und nur da liegen, ist in JEE spezifiziert. Wenn Du etwas anders machst, brichst Du aus dem Standard aus. Mag sein, dass der ein oder andere Container da sogar was anbietet. Aber dazu kann man natürlich nur was sagen, wenn Du den Container nennst, den Ihr verwendet.

Abgesehen davon würd ich das nicht machen, weil es wie gesagt von der Spezifikation abweicht. Das Beste ist ein -wie auch immer- automatisiertes (z.B. Scripte) Deployment. Der Kopiervorgang ist ja nur nervig, wenn man es jedes Mal von Hand machen muss.

Richtig, wie bei den anderen Fragen handelt es sich um eine JEE Anwendung, genauer JSF - Entwicklung unter Netbeans mit einem Glassfish- Server und „Live“ auf einem Tomcat.
Allerdings will ich nicht jedes mal das Projekt neu compilieren, nur weil sich eine Library ändert.

Abgesehen davon würd ich das nicht machen, weil es wie gesagt von der Spezifikation abweicht. Das Beste ist ein -wie auch immer- automatisiertes (z.B. Scripte) Deployment. Der Kopiervorgang ist ja nur nervig, wenn man es jedes Mal von Hand machen muss.

An ein Script, welches die Library ins WEB-INF/lib Verzeichnis kopiert habe ich auch gedacht, aber hier wollte ich eben fragen, ob es eine einfachere Methode gibt. (Hätte ja sein können, dass das über ein Script eher unüblich ist)

Vielen Dank für die ausführlichen Antworten! :slight_smile:

Ein paar Möglichkeiten gibt es.

Auf einem Applicationserver können jars hinterlegt werden, die dann zur Laufzeit von der jeweiligen Web-App verwendet werden können.
Das ganze hat aber auch Nachteile, wenn mehrere Web-Apps unterschiedliche Versionen einer Jar benötigen.
Daher wird das auch nicht immer, bzw nicht mehr unterstützt.

Ein Beispiel das ähnlich ist, sind Datenbanktreiber und Verbindungen die per Lookup durch eine Datasource übergeben werden.
In der Web-App steht dann lediglich ein Aufruf um die DS zu bekommen, die dann auf dem Applicationserver konfiguriert sein sollte incl. Treiber.

Sowas ähnliches könnte man aber auch nachbauen, was allerdings aufwändiger sein kann.

Aktuell hört man auch auf Application Servern immer mehr von OSGI.
Damit könnte man sich einen Service erstellen der eben die Dienste kapselt, die dieses Jar bereitstellt.

Hi Community,

ich hätt da gern mal ein Problem… :smiley:
Mein Problem:
Mein Programm greift auf eine Datenbank auf einem Server zu holt die Daten und schreibt auch gegebenenfalls rein.
Das Funktioniert alles prima… aber nur auf zwei PC’s…:rolleyes:
Habe jetzt herausgefunden, das der Datenbanktreiber connector… in dem Ordner JAVA/jre/lib/ext/ gespeichert sein muss damit es läuft obwohl ich es beim exportieren in eine .jar Datei mit in das Package eingebunden habe.
Meine Frage:
wie löse ich das Problem. :wink:
bzw. ich kann ja nicht von allen Usern die das kleine Spiel spielen wollen erwarten, dass sie den Treiber in das oben beschriebene Verzeichnis kopieren. Daraus folgere ich es muss einen weg geben, wie ich aus dem Package (bzw. aus der .jar) eine Installationsdatei mache, damit der Treiber in das Verzeichnis kopiert wird.

Ich freue mich wahnsinnig über alle Beiträge die mir weiterhelfen, wenn auch nicht das Problem lösen.
ich bin dankbar für jeden Tip oder Vorschlag.

MfG

zaag

Bitte dafür einen eigenen Thread aufmachen. Ich denke das Problem ist hier ein anderes als das vom TO.

ok und wie mache ich einen Thread auf? :lol:

*** Edit ***

hab ei neues Thema geöffnet
falls jemand Ideen hat bitte hier
http://forum.byte-welt.net/threads/10950-Wie-erstelle-ich-eine-Installationsdatei-um-Treiber-zu-speichern-laden?p=77690#post77690

Antworten. Vielen Dank schon mal im voraus :cool:

MfG
zaag

Ich glaube ich muss das Thema nochmal ausgraben, da das Problem so immer noch besteht :scheiterhaufen:

Aktuell hört man auch auf Application Servern immer mehr von OSGI.
Damit könnte man sich einen Service erstellen der eben die Dienste kapselt, die dieses Jar bereitstellt.

Hier OSGI zu verwenden finde ich auf den ersten Blick etwas über das Ziel hinaus geschossen. Außerdem in ein „fertiges“ System jetzt noch so ein mächtiges Framework einzubauen…

Mir sind noch ein paar Dinge über den Weg gelaufen, wie z.B. der Classloader. Allerdings wäre hier ein Latebinding eines der letzten Mittel, zu dem ich greifen würde.
Es gibt bestimmt eine ganz einfache Möglichkeit so etwas zu realisieren, eine DLL dynamisch einzubinden geht an der Stelle eigentlich auch ganz einfach.

Was mir noch in den Sinn kam: Man könnte die Jar per Batch kompilieren und jedesmal mit neu deployen. Allerdings finde ich das auch sehr „unschön“.

Vielleicht habt ihr ja noch ein paar Tipps :wink:

Also in Eclipse kann man zusätzlich zum Dynamic Web Project noch externe Jars einbinden, die nicht in den Lib-Ordner kopiert werden. Allerdings muss die Location dieser Jars der JRE oder dem Container bekannt sein (CLASSPATH), deswegen bietet sich dazu z.B. das Verzeichnis “<JAVA_HOME>/lib/ext” an (dann muss man sie nichtmal explizit referenzieren), damit die Webanwendung auf allen Rechnern läuft, ohne das die JRE oder der Container mit besonderen Argumenten gestartet werden muss.
Andernfalls müsstest du das doch umständlich mit einem eigenen Classloader realisieren, dass ist meines Erachtens aber ein unheimliches geraffel und ausserdem gibt es dann auch keine Garantie, dass die Klassen dort zur rechten Zeit gefunden und geladen werden können.