Wie verwalte ich den ClassPath in WebSphere
Ich habe ein problem mit meinem web-Modul classpath in Websphere v6.1.
In meinem WEB-INF/lib habe ich eine ziemlich große Anzahl von jar-Dateien, die Sie einschließen xercesImpl.jar und xmlparserv2.jar. Ich brauche beide Gläser zu präsentieren, aber Sie scheinen confict mit einander. Konkret wird jedes Glas enthält einen META-INF/services Verzeichnis, so dass, wenn wir versuchen, eine Instanz der DocumentBuilderFactory über JAXP, die Instanz, die wir bekommen, hängt von der Reihenfolge, in der diese zwei Gläser erscheinen in den classpath.
Ich immer verwenden wollen, die xerces Instanz der DocumentBuildFactory, so dass ich schieben wollen xercesImpl.jar auf der Vorderseite des classpath. Ich habe versucht, dies zu tun durch die Angabe einer Klasse-Pfad-Abschnitt in der Manifest-Datei, die für die war-Datei, aber die Klasse Pfad, den ich tatsächlich in meinem WAR Modul-Compound-CLass-Loader in sehr merkwürdig. Ich scheine zu bekommen, ein paar standard-Sachen, die legt auf, gefolgt von den Inhalt der WEB-INF lib in alphabetischer Reihenfolge, gefolgt von den classpath angegeben, die durch die Manifest-Datei.
Wenn ich nicht setzen eine manifest-Datei in den Krieg an alle, ich bekomme die standard-Sachen, gefolgt von den Inhalt der WEB-INF/lib, sondern in beliebiger Reihenfolge.
Was bin ich? Gibt es einen Weg, in dem ich das einstellen kann Klasse Weg zu sein, genau das, was ich will?
Dave
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, WebSphere, du meinst die regelmäßigen J2EE-Application-Server (und nicht sowas wie Community Edition, WebSphere ist eine Marke angewendet, um eine Reihe von IBM-Produkten).
Denke ich, dass Ihre Möglichkeiten begrenzt sind. Da die Abhängigkeiten sehen Recht explizit, ich würde lieber einen programmatischen Ansatz, statt sich auf die Launen der classpath (wie das erstellen von Fabrik-Instanzen explizit anstatt sich auf den SPI).
Wenn das nicht eine option, möchten Sie vielleicht, zu betrachten, indem Sie eines Ihrer Abhängigkeiten ein EAR-Projekt Dienstprogramm JAR und konfigurieren MODUL zum laden von Klassen mit einem PARENT_LAST zum laden von Klassen-Politik auf den KRIEG. Dies kann konfiguriert werden, über den browser die admin-Konsole (oder über die RAD Werkzeuge, wenn Sie es verwenden).
Andere Sache, ich würde schauen, das WAR Shared Libraries Funktion (unter Umgebung in der browser-admin-Konsole). Diese können im Zusammenhang mit Server oder Anwendungen. Der Nachteil ist, dass dies erfordert weitere Konfiguration.
In der IBM Websphere Application Server 6.1, web-Module haben einen eigenen class loader, die sind in der Regel in der PARENT_FIRST-Modus. Dies bedeutet, dass der web-Modul-Klassen-Lader versuchen zu delegieren, Klasse laden der parent class loader, vor dem laden die neuen Klassen.
Wenn Sie wollen, haben die Xerces-Klassen geladen werden, bevor der XML-parser v2 (ich gehe davon aus, dass Oracle XML-parser v2) Klassen, dann die Xerces-Klassen geladen werden, die von einem übergeordneten Klassenladeprogramm - in diesem Fall vorzugsweise die application class loader. Diese kann getan werden, indem man die Xerces-jar in das Stammverzeichnis der EAR-Datei (falls Sie eine haben) oder bereiten Sie die EAR-Datei mit xerces.jar und Ihre war-Datei in das Stammverzeichnis. Die xmlparserv2 jar sollte dann in WEB-INF\lib.
Könnte man auch versuchen, die Schaffung eines Xerces gemeinsam genutzten Bibliothek für die Verwendung durch Ihre Anwendung.
Finden Sie weitere Informationen zu diesem in der IBM WebSphere Application Server V6.1: System-Management und-Konfiguration. Details finden Sie in Kapitel 12.
Wie Wählt JAXP Parser
Wundern Sie sich vielleicht, dem parser das Programm tatsächlich nutzt. JAXP, nachdem alle, ist ziemlich parser-unabhängig. Die Antwort hängt davon ab, welche Parser installiert sind, in Ihrer Klasse Weg und wie bestimmte system-Eigenschaften festgelegt werden. Die Standardeinstellung ist die Verwendung der Klasse mit dem Namen der
javax.xml.parsers.DocumentBuilderFactory
system-Eigenschaft. Zum Beispiel, wenn Sie wollen, stellen Sie sicher, dass Xerces verwendet, um Dokumente analysieren, dann würden Sie laufen JAXPChecker wie diese:Wenn die
javax.xml.parsers.DocumentBuilderFactory
Eigenschaft nicht gesetzt ist, dann JAXP sieht in der lib/jaxp.Eigenschaften properties-Datei in das JRE-Verzeichnis, um zu bestimmen, einen Standardwert für diejavax.xml.parsers.DocumentBuilderFactory
system-Eigenschaft. Wenn Sie wollen, um konsequent auf eine bestimmte DOM-parser, zum Beispielgnu.xml.dom.JAXPFactory
fügen Sie die folgende Zeile in die Datei:Wenn dies nicht gelingt, suchen Sie einen parser, neben JAXP sucht einen
META-INF/services/javax.xml.parsers.DocumentBuilderFactory
- Datei, in der alle JAR-Dateien zur Verfügung, um die Laufzeit zu finden, der name der konkretenDocumentBuilderFactory
Unterklasse.Schließlich, wenn das fehlschlägt, dann
DocumentBuilderFactory.newInstance()
gibt eine Standard-Klasse, in der Regel der parser vom Hersteller, die auch die JAXP-Klassen. Zum Beispiel, die JDK-JAXP-Klassen wählenorg.apache.crimson.jaxp.DocumentBuilderFactoryImpl
standardmäßig aber die Ælfred JAXP-Klassen wählengnu.xml.dom.JAXPFactory
statt.Sie können auch versuchen, die Einstellung der system-property zu bevorzugen, die eine Umsetzung.
z.B. zu bevorzugen xmlparserv2 dom-parser, set
javax.xml.Parser.DocumentBuilderFactory=oracle.xml.jaxp.JXDocumentBuilderFactory