Tomcat kippt klassen Pfad von Manifest-Datei auswählen
-
06-09-2019 - |
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:
- Mache ich etwas falsch? oder ist es Tomcat?
- Gibt es eine andere Lösung für dieses Problem?
Ich habe bereits versucht, \ geprüft folgende
- Checked für new-line Zeichen am Ende der Datei
- 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
- Versuchte relativ, absoluter Pfad in der Manifest-Datei
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.