Frage

Meine Servlet-Anwendung enthält eine Reihe von Bibliothek .jars, enthalten, von denen einige log4j.xml oder log4j.properties Dateien eingebettet sind. Ich möchte sicherstellen, dass log4j meine log4j.xml findet zuerst! Ich habe für einige Spezifikation der Prioritäten der verschiedenen Classpath Elemente in einem Servlet versucht, die Suche (zB nicht WEB-INF / classes immer WEB-INF / lib vorangehen?) Oder eine Art und Weise des Servlets Classloader zu konfigurieren oder zu optimieren, so dass ein gegebenes Ressourcenverzeichnis erscheint früh im classpath. Bisher habe ich eine Niete gezogen. Irgendwelche Vorschläge auf, sicherzustellen, dass ein Servlet-WAR-Datei lädt die richtige log4j.xml über den Classloader?

War es hilfreich?

Lösung

Soweit ich die Ressourcenauswahl aus dem Classpath verstehen, ist nicht deterministisch (aus der Sicht des App-Entwickler). Selbst wenn die gleiche Datei konsequent könnte das Verhalten geladen ändern:  1. Wenn Sie die Version Ihres aktuellen Container aktualisieren.  2. Wenn Sie wechseln Container.

Die einfachste Lösung wird es sein, entfernen eingebettet log4j Konfigurationsdateien aus der Bibliothek Gläsern . Es ist fast nie eine gute Idee log4j config einzubetten, wie es zu dem Problem führt Sie hier sehen ...

Sind sie Dritte Gläser oder Krüge Sie entwickelt?

Andere Tipps

Tomcat 8.5

Ditto Tomcat 8.0.

Siehe Dokumentation: Class Loader HOW-TO .

Tomcat 8.0

Die Antwort ist einfach, genommen von der Tomcat Dokumentation Seite Class Loader HOW-TO . Insbesondere Mitteilung der Verwendung der /WEB-INF/ Verzeichnis / Ordner.

  

Daher ist aus der Sicht einer Web-Anwendung, Klasse oder Laden von Ressourcen sieht in den folgenden Repositories, in dieser Reihenfolge:

     
      
  • Bootstrap Klassen Ihrer JVM
  •   
  • /WEB-INF/classes Ihre Web-Anwendung
  •   
  • /WEB-INF/lib/*.jar Ihre Web-Anwendung
  •   
  • Systemklassenlader-Klassen (wie oben beschrieben)
  •   
  • Gemeinsame Klassenladeklassen (wie oben beschrieben)
  •   
     

Wenn die Web-Anwendung Class Loader ist konfiguriert mit <Loader delegate="true"/> dann die Reihenfolge wird:

     
      
  • Bootstrap Klassen Ihrer JVM
  •   
  • Systemklassenlader-Klassen (wie oben beschrieben)
  •   
  • Gemeinsame Klassenladeklassen (wie oben beschrieben)
  •   
  • /WEB-INF/classes Ihre Web-Anwendung
  •   
  • /WEB-INF/lib/*.jar Ihre Web-Anwendung
  •   

Tomcat 6

Excerptiert von Tomcat 6 Seite Class Loader HOW-TO .

  

Daher ist aus der Sicht einer Web-Anwendung, Klasse oder Laden von Ressourcen sieht in den folgenden Repositories, in dieser Reihenfolge:

     
      
  • Bootstrap Klassen Ihrer JVM
  •   
  • Systemklassenlader-Klassen (wie oben beschrieben)
  •   
  • /WEB-INF/classes Ihre Web-Anwendung
  •   
  • /WEB-INF/lib/*.jar Ihre Web-Anwendung
  •   
  • $CATALINA_HOME/lib
  •   
  • $CATALINA_HOME/lib/*.jar
  •   

Wir sind der Frühling Log4jConfigListener in unserer Datei web.xml.

Sie können als Kontextparameter die Position der log4j Konfigurationsdatei angeben, das heißt Sie es als /WEB-INF/log4j.xml einstellen könnte

Wäre dies eine Option für Sie sein? Wenn Sie nicht Frühling mit weiß ich, dass Sie den Log4j Standort festlegen können programmatisch die auch funktionieren könnte.

Nach meiner Erfahrung, WEB-INF / classes dauert in der Regel Vorrang vor den Gläsern in WEB-INF / lib, aber das hängt auch von den Servlet-Containern Sie verwenden (ich konnte nie das Verhalten von JRun herauszufinden, zum Beispiel). Es würde helfen ungemein, wenn Sie mir sagen, welche Container Sie verwenden.

Auch Sie sind sicher, dass die säumige log4j Konfiguration in einem Glas in WEB-INF / lib ist? Normalerweise, wenn ich in Classpath Probleme in einer Servlet-Containern Situation ausgeführt habe, ist es wegen der Bibliotheken ist die Wohnsitz außerhalb des Web-App.

Das Servlet-Spezifikationen empfehlen , dass die Web-App Klassenladeprogramme ihre eigenen Klassen laden, bevor der Behälterklassenlader (SRV.9.7.2) zu delegieren, aber da dies gegen die Spezifikation Java ist, nicht alle Anbieter tun dies standardmäßig (in der Tat Tomcat ist der einzige Behälter ich verwendet habe, dass dies standardmäßig der Fall ist). Mit dieser sagte, ist es immer möglich, Ihre Container Web App Classloading Verhalten zu konfigurieren. Wenn Sie mir Container Sie verwenden welche sagen, kann ich in der Lage sein, Ihnen zu helfen (genauer gesagt, ich habe dies getan, erfolgreich, bevor sie auf WebLogic, WebSphere, Glassfish und JRun)).

Wenn Sie nicht auf den Klassenpfad zu steuern, da Tomcat ist es für Sie einstellen, sind Sie zumindest der Lage, eine Systemeigenschaft für log4j.configuration einstellen? Ich glaube, dass Lage, auf der das Eigentum außerhalb des Classpath eingestellt werden.

Wenn nicht, ein anderer Ansatz, obwohl eine hässliche, wäre ausdrücklich eine der Konfiguratoren laufen, sich im Anwendungscode.

Sie müssen log4j.properties in CLASSPATH haben. Der beste Platz ist unter WEB-INF / classes.

Sie müssen auch sicherstellen, dass Sie Ihre Version von log4j.jar verwenden. Also, legen es in WEB-INF / lib, nur um sicherzustellen, dass Sie nicht eine verwenden von tomcat Ordner, da es seltsam Classloading Probleme verursachen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top