Ich habe eine Bibliothek, die als ausführbare JAR-Datei gebündelt ist und zu weblogic / tomcat classpath hinzugefügt wird. Wie kann ich beim Start des Servers eine Hauptmethode aus der JAR-Datei ausführen und die Klassen aus der JAR-Datei laden.
Was ich möchte, ist ein Initialisierungscode, der als erstes ausgeführt wird, wenn die JAR-Datei geladen wird und der Server ohne Benutzereingriff gestartet wird.
Hinweis: Ich weiß, dass ich mein jar in einer WAR-Datei bündeln kann, aber ich habe einen aspectj-Code in meiner Bibliothek, den ich alle laufenden Anwendungen im jvm verweben möchte, wenn ich mein jar in der WAR-Datei, dem aspectj-Code, bündle wird nur in die Klassen in der WAR-Datei einweben, also habe ich meine Bibliotheks-JAR-Datei im Klassenpfad hinzugefügt.
Vielen Dank im Voraus.
Fügen Sie eine Klasse in Ihrem JAR mit dem folgenden Code hinzu:
%Vor% Hinweis: Um dies zu kompilieren, müssen Sie <tomcat-dir>/lib/catalina.jar
zu Ihrem Klassenpfad hinzufügen. Andernfalls wird es beim Kompilieren nicht in der Lage sein, die notwendigen Schnittstellen zu finden ( org.apache.catalina.LifecycleListener
und org.apache.catalina.LifecycleEvent
). Sobald Sie mit dem Kompilieren fertig sind, setzen Sie die JAR wie gewohnt unter <tomcat-dir>/lib
.
Öffnen Sie nun <tomcat-dir>/conf/server.xml
und fügen Sie im Abschnitt <Server>
Folgendes hinzu:
Jetzt, wenn Ihr Tomcat-Server startet, wird diese TomcatStartupListener
-Klasse in Ihrem JAR aufgerufen, und Sie können Ihre Hauptmethode aufrufen. Es gibt auch viele andere Event-Typen! Sie können einen beliebigen dieser Ereignistypen verwenden:
Dieser Ansatz ist notwendig, weil die Klassenladeprogramme in Tomcat funktionieren (oder sogar die meisten JVMs). Hier sind die wichtigen Punkte von diesem Link:
%Vor%Die JVM wird sehr schwer werden, wenn alle Klassen in allen JARs wahllos geladen werden. Daher werden die Klassen in gemeinsam genutzten JARs nur on-demand geladen. Sie können die Hauptmethode nur aufrufen, indem Sie den obigen Lifecycle-Listener hinzufügen.
Vielleicht ist es am einfachsten, ein triviales Servlet in einer .war-Datei zu implementieren, die auf Ihre .jar-Datei verweist. Das Servlet kann so konfiguriert werden, dass es nach der Bereitstellung / dem Containerstart gestartet wird und dann es aufrufen kann die Klasse, die Ihre main()
-Methode enthält.
Da Anwendungsserver / Servlet-Container normalerweise viele verschiedene Klassenlader haben, benötigen Sie höchstwahrscheinlich eine andere Strategie für das Weben von Aspekten in Ihrem Code als in Standalone-Anwendungen.
Ich würde empfehlen, die Aspekte zu jeder War-Datei hinzuzufügen, die zur Build-Zeit bereitgestellt wird. Dies könnte einer üblichen Technik folgen - im Gegensatz zu einer serverspezifischen.
Außerdem bin ich nicht sicher, ob es tatsächlich (richtig und unterstützt) auf einem Server gemacht werden kann. In der Regel wird ein Server erstellt, um alle Webapps voneinander zu trennen. Sie könnten es zum Funktionieren bringen, aber es könnte beim nächsten Update des Servers brechen.
Es könnte einfacher sein, eine alternative Technik vorzuschlagen, wenn Sie das Problem angeben, das Sie mit Ihrem vorgeschlagenen Ansatz lösen möchten.
Nach dem Kommentar bearbeiten: Betrachten Sie den Standardlebenszyklus der Webanwendung: Sie können Code ausführen, z. in einem Servlet, nachdem es bereitgestellt wurde. Wenn Sie darauf bestehen, dass Ihr Code in main
enthalten ist, können Sie diese Methode über den Initialisierungscode Ihrer Webanwendung aufrufen.
Sie müssen einen Java-Agenten registrieren. Siehe diesen Link: java.lang.instrument .
java.lang.instrument
stellt Dienste bereit, die es Java-Programmiersprachenagenten ermöglichen, Programme zu programmieren, die auf der JVM laufen.
Dies ist der richtige Weg, dies zu tun.