eine Klasse in Ihrem JAR mit dem folgenden Code hinzufügen:
public class TomcatStartupListener implements org.apache.catalina.LifecycleListener {
public void lifecycleEvent(org.apache.catalina.LifecycleEvent event) {
if (event.getType().equals("after_start")) {
// call your main method here
}
}
}
Hinweis: Um dies zu kompilieren, müssen Sie <tomcat-dir>/lib/catalina.jar
zu Ihrem Classpath hinzuzufü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 das JAR wie gewohnt unter <tomcat-dir>/lib
.
jetzt offen <tomcat-dir>/conf/server.xml
und fügen Sie den folgenden unter dem <Server>
Abschnitt:
<Listener className="com.yourpackage.TomcatStartupListener" />
Nun, wenn Ihr Tomcat-Server startet, diese TomcatStartupListener
Klasse in Ihrem JAR genannt wird, und Sie können Ihre Hauptmethode aufrufen. Es gibt auch viele andere Event-Typen!Sie können jede dieser Ereignistypen verwenden:
- before_init
- after_init
- before_start
- configure_start
- Start
- after_start
- before_stop
- Anschlag
- configure_stop
- after_stop
- before_destroy
- after_destroy
Dieser Ansatz wegen der Art und Weise notwendig ist, die classloaders work in Tomcat (oder sogar die meisten JVMs). Hier sind die wichtigsten Punkte aus diesem Link:
There are three aspects of a class loader behavior
Lazy Loading
Class Caching
Separate Namespaces
Die JVM sehr schwer bekommen, wenn alle Klassen innerhalb aller JAR-Dateien wahllos erhalten geladen. So werden die Klassen innerhalb gemeinsamer JARs nur on-demand geladen. Sie können die Hauptmethode nur aufrufen, indem Sie den obigen Lifecycle-Listener hinzufügen.
Ich habe einige aspectj Code in meiner Bibliothek, die ich alle laufenden Anwendungen in der jvm weben will, wenn ich mein Glas in Kriegsdatei bündeln, der Aspektj Code wird nur in die Klassen in der Kriegsdatei weben. – Sammy
Raten Sie, dass diese Methode nicht funktioniert, da sie keine globalen Klassen oder Klassen in anderen WAR-Dateien instrumentiert. Bitte sehen Sie meine Lösung unten, wenn es passt. – Subhas