Frage

Tomcat Version: 5.0.28 JDK: 1.5.0.14

Das Problem:

Ich verwende sowohl Hibernate und Streben Wir sind nicht auf dem neuesten und größten der Version für diese Bibliotheken So- beide brauchen eine andere Version von Apache-Commons-Bibliothek.

Die Lösung, die ich im Sinn haben:

Manifest-Datei verwenden und eine andere Version von Apache-Commons für jeden angeben

Mein Web-App wird eingesetzt als webapps \ myapp

Und die lib webapps \ myapp \ WEB-INF \ lib

ich die Manifest.mf in hibernate3.jar wie folgt modifiziert

  

Manifest-Version: 1.0

     

Archiver-Version: Plexus Archiver   Erstellt-By: 1.5.0_15-b04 (Sun> Microsystems Inc.)   Class-Path: hibernatelib / slf4j-api-1.5.2.jar

und setzen Sie den slf4j-api-1.5.2.jar in webapps \ myapp \ WEB-INF \ lib \ hibernatelib

Nun würde ich erwarten, dass slf4j-api-1.5.2.jar geladen zusammen mit Hibernate automatisch würde Aber es funktioniert nicht ... Tomcat ist nicht in der Lage, die JAR-Dateien in der .MF angegeben zu finden, wie oben

Die Frage:

  1. Mache ich etwas falsch? oder ist es Tomcat?
  2. Gibt es eine andere Lösung für dieses Problem?

Ich habe bereits versucht, \ geprüft folgende

  1. Checked für new-line Zeichen am Ende der Datei
  2. Wenn ich slf4j-api-1.5.2.jar im Haupt lib Ordner- Fehler setzen geht Auswärts- damit ich weiß, es ist nicht der Lage, diese spezielle JAR-Datei finden
  3. Versuchte relativ, absoluter Pfad in der Manifest-Datei
War es hilfreich?

Lösung

Die einzige Stelle, wo das Attribut Class-Path im manifest verwendet wird, ist, wenn die jar das Manifest enthält, als ein ausführbares jar aufgerufen wird ( „java -jar theFile.jar“).

Einige Servlet-Container scheinen es zu unterstützen, aber nach auf diese Mailing-Liste Post (Sorry, couldn ‚t etwas mehr authorative so schnell finden) es auch nicht in der Spezifikation angegeben.

Soweit ich es verstehe, Web-Anwendungen in der Regel ihre Klassen laden eine einzige Klasse Loader. „Richtig“ zu lösen, dass Abhängigkeitsproblem mindestens 2 verschiedene Classloader erfordern würde.

Eine Hack-ish Lösung könnte Jarjar oder ein ähnliches Tool verwenden zu verpacken die verschiedenen Bibliotheken zusammen mit ihren jeweiligen Abhängigkeiten.

Du gehörst also jar produzieren würde enthalten Hibernate zusammen mit seiner Apache-Commons-Bibliothek und anderen jar Streben zusammen mit seiner Apache-Commons-Bibliothek enthält. Jede Kopie der Apache-Commons-Bibliothek würde verschiedene Pakete verschoben werden (möglicherweise hibernate.org.apache.* und struts.org.apache.*), um das Problem mit verschiedenen classe Versionen zu lösen.

Andere Tipps

Haben Sie überprüft alle Berechtigungen korrekt sind? Auch könnte eine Idee sein, um sicherzustellen, gibt es eine Neue-Zeile nach der letzten Class-Path Linie, die mir geholfen früher heute aus!


Update: Wenn Tomcat Classpath Erklärungen wie diese nicht unterstützt, das einzige, was in dem Sinne beinhaltet mit Classloader rumgespielt. Persönlich würde ich das nicht tun - es gibt eine ganze Welt der möglichen Schmerzen auf diesem Weg und Sie werden wahrscheinlich haben eine einfachere Zeit ein Upgrade einfach. Leider kann ich nicht denken Sie an eine bessere Antwort!

Haben Sie versucht, die neueste, größte Version von Tomcat, um zu sehen, ob das Problem immer noch besteht? 6 Tomcat ist schon einige Jahre alt, geschweige denn 5.5 oder 5.0 ...

Ich glaube nicht, dass Sie dies tun können. Tomcat sucht nicht in JAR Manifesten CLASSPATH Fragen zu entscheiden. Es ist eine eigene Hierarchie von Klassenlader verwenden zu finden, was er braucht, mit was sie sagt CLASSPATH ist.

Wenn Sie verschiedene Versionen eines JAR für verschiedene Teile Ihrer App wollen, klingen Sie wie ein Mensch, der wirklich braucht zwei konkurrierenden JSRs da draußen , aber ich weiß nicht von irgendwelchen Implementierungen für den Sun-Modul Vorschlag.

Der eine App-Server, die ich kenne, ermöglicht es Ihnen, dies zu tun ist Spring DM-Server . Es ist ein Fork von Tomcat, dass sie zu verbessern.

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