2016-11-02 3 views
0

Ich verwende Wildfly 8.2.0 und einige XML Config File Parsing. Die Idee ist, dass ich meine gebündelte xercesImpl.jar verwenden kann, um die JAXP SAXParserFactoryImpl bereitzustellen.ClassNotFound: Xerces SAXParserFactoryImpl bei der Ausführung in Wildfly 8.2

Wenn ich die Logik außerhalb von Wildfly ausführe, bin ich erfolgreich in der Lage, mit dem SAXParserFactoryImpl zu analysieren. Diese Fabrik, indem die Systemeigenschaft gefunden wird:

System.setProperty("javax.xml.parsers.SAXParserFactory", 
        "org.apache.xerces.jaxp.SAXParserFactoryImpl"); 
SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance(); 

Nach meiner EAR bereitstellen, erhalte ich folgende Fehlermeldung:

...: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found. 
.. 
.. 
...: Caused by: java.lang.ClassNotFoundException: org/apache/xerces/jaxp/SAXParserFactoryImpl 
.. 
.. 

Zu wissen, dass Wildfly seine eigene Xerces läuft von Wildfly/modules/system/Schichten /base/org/apache/xerces/main/xercesImpl-2.9.1-jbossas2.jar, habe ich versucht, die folgenden:




[1] Verwendung Wildfl y des xercesImpl-2.9.1-jbossas2.jar ... keine Änderung

(Quelle: Wildfly Dokumentation für Jboss-Deployment-structure.xml)

In jboss-Deployment-structure.xml:

<jboss-deployment-structure> 
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated> 
    <deployment> 
     ... 
    </deployment> 
</jboss-deployment-structure> 

EARContent:

lib/ 
    ...(removed xercesImpl.jar)... 
META-INF/ 
    application.xml // Information about EJB that uses xercesImpl.jar 
    jboss-deployment-structure.xml 



Ignorieren [2] Wildfly des xercesImpl-2.9.1-jbossas2.jar ... keine Änderung

(Quelle: https://developer.jboss.org/thread/259010?start=0&tstart=0)

In jboss-Deployment-structure.xml:

<jboss-deployment-structure> 
    <ear-subdeployments-isolated>true</ear-subdeployments-isolated> 
    <deployment> 
     <exclusions> 
      <module name="org.apache.xerces" /> 
     </exclusions> 
     ... 
    </deployment> 
</jboss-deployment-structure> 

EARContent:

lib/ 
    xercesImpl.jar 
    ...(many more jars)... 
META-INF/ 
    application.xml // Information about EJB that uses xercesImpl.jar 
    jboss-deployment-structure.xml 




[3] umfassen Explizit Wildfly des xerces als Modul ... keine Änderung

(Quelle: https://developer.jboss.org/thread/239969)

In jboss-Deployment-structure.xml:

<jboss-deployment-structure> 
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated> 
    <deployment> 
     <dependencies> 
       <module name="org.apache.xerces" /> 
       ... 
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

EARContent:

lib/ 
    ...(removed xercesImpl.jar)... 
META-INF/ 
    application.xml // Information about EJB that uses xercesImpl.jar 
    jboss-deployment-structure.xml 




[4] Java-Eigenschaft für JAXP Parser deklarieren ...keine Änderung

wenn Wildfly Start:

./standalone.sh -c standalone-full.xml -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl 

im Standalone-full.xml

<system-properties> 
    <property name="javax.xml.parsers.SAXParserFactory" value="org.apache.xerces.jaxp.SAXParserFactoryImpl"/> 
</system-properties> 

(Hinweis: Versucht diese Eigenschaft mit Versuchen [1], [2], [3]

)




[5] Das Hinzufügen Xerces Pfad jboss-deplo tigung-Struktur ... keine Änderung

(Quelle: developer.jboss.org/message/717927#717927)

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1"> 
    <deployment> 
     <dependencies> 
      <system> 
       <paths> 
        <path name="org/apache/xerces/jaxp"/> 
       </paths> 
      </system> 
      ... 
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

Antwort

0

Try Variante 3, aber hinzufügen Export = "true" der Abhängigkeits Ich nehme an, Sie versuchen, javax.xml.parsers.SAXParserFactory.newInstance() von ejb oder war verwenden. Subdeployments sehen keine Abhängigkeitsmodule von ear. Sie müssen explizit exportieren.

0

Das Problem endete damit, dass der Klassenlader des Threads, der das EJB enthielt, das versuchte, SAXParserFactoryImpl zu laden, keinen Zugriff darauf hatte. Um dies zu beheben, musste ich einen Thread finden, der einen Classloader mit SAXParserFactoryImpl-Sichtbarkeit hatte (zufällig auf meiner MDB) und ihn manuell auf die problematische Bean setzen. Ich habe nie herausgefunden, was genau passiert ist, aber das war eine schnelle und schmutzige Arbeit.

0

Nach einer Menge von RND endlich die Lösung gefunden. Hier ist geht:

1) Kopieren Sie Ihre XercesImpl-Xxxjar und fügen Sie ihn in die/jre/lib/ zB: - für mich -> C: \ Programme \ Java \ jdk1.8.0_131 \ jre \ lib 2) Erstellen Sie in der lib einen neuen Ordner "indossiert". 3) Fügen Sie die JAR-Datei in den Ordner "empfohlen" 4) Starten Sie den Server neu und die Xerces-Hölle wird abgeklungen.

Lassen Sie mich wissen, ob die Lösung für Sie funktioniert.

Verwandte Themen