2014-07-17 7 views
7

Ich bin eine GWT-Anwendung in Eclipse entwickeln und verwenden jdom2 einige benutzerdefinierte XML-Property-Dateien zu lesen.Classcast: org.apache.xerces.parsers.XIncludeAwareParserConfiguration kann nicht auf org.apache.xerces.xni.parser.XMLParserConfiguration gegossen werden

Nach einem letzten Update schlägt meine Anwendung jetzt mit dem obigen Fehler beim Versuch, die XML-Datei zu lesen. Der entsprechende Stack-Trace ist:

org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration 
org.apache.xerces.parsers.SAXParser.<init>(Unknown Source) 
org.apache.xerces.parsers.SAXParser.<init>(Unknown Source) 
org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.<init>(Unknown Source) 
org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source) 
org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(Unknown Source) 
org.jdom2.input.sax.XMLReaders.createXMLReader(XMLReaders.java:165) 
org.jdom2.input.SAXBuilder.createParser(SAXBuilder.java:871) 
org.jdom2.input.SAXBuilder.buildEngine(SAXBuilder.java:854) 
org.jdom2.input.SAXBuilder.getEngine(SAXBuilder.java:904) 
org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1116) 
uk.co.platosys.db.jdbc.DatabaseProperties.loadProperties(DatabaseProperties.java:78) 

sucht dieses Problem schlägt vor, dass der Fehler auftreten können, wenn inkompatible Versionen der xerces Gläser auf dem Classpath existieren.

gwt-dev-2.6.1.jar enthält die Xerces-Pakete und meine Vermutung ist, dass diese neueste Version von gwt-dev eine Version enthält, die nicht kompatibel ist. Jdom2.0.5, die aktuelle Version, wird jedoch mit der Version 2.11 von Xerces veröffentlicht, die anscheinend die neueste Version von Apache ist. Diese Gläser auf meinen Klassenpfad zu legen, scheint die Dinge nicht zu lösen; Ich konnte mich bisher auf die Versionen in gwt-dev verlassen.

Ich bin ziemlich am Ende meiner Meinung darüber und erheblich außerhalb meiner Komfortzone.

+0

Versuchen Sie, GWT aus Ihrem Projekt zu entfernen, und fügen Sie es dann zurück. Stellen Sie außerdem sicher, dass Sie keine doppelten (alten und neuen) JAR-Dateien in Ihrem WEB-INF/lib-Ordner haben. –

Antwort

0

Die Reihenfolge der Gläser im Klassenpfad ist von Bedeutung. Haben Sie versucht, das Xerces 2.11-Jar am Anfang des Klassenpfads hinzuzufügen, damit es zuerst geladen wird?

0

Kämpfen Sie nicht mit Maven: Wenn Dinge nicht zusammen verwendet werden, sollten sie in separaten Maven-Modulen gehen. In Ihrem Fall wird JDom (wahrscheinlich) auf der Serverseite verwendet, die gwt-dev nicht benötigt. Die Lösung besteht also darin, Ihr Projekt in mehrere Maven-Module aufzuteilen: Eines für die Client-Seite, das von GWT abhängt, und eines für die Server-Seite, das nicht (oder möglicherweise auf gwt-servlet, wenn Sie GWT-RPC verwenden) auf Anfragefactory-Server, wenn Sie RequestFactory verwenden).

Das heißt, sogar wenn Sie mit einem einzigen Projekt gwt-dev in Ihrem Klassenpfad zur Laufzeit haben, dann haben Sie etwas falsch in Ihrem POM.

... es sei denn, Sie lesen Ihre XML-Dateien zum Zeitpunkt der Erstellung?

3

In meinem Fall habe ich dieses Problem gelöst, indem ich Bootstrap-Instanzen (Classpath-Registerkarte in der Laufkonfiguration) zwei Einträge /xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar und/xerces hinzugefügt habe /xercesImpl/2.11.0/xercesImpl-2.11.0.jar von meinem lokalen maven-Repository

0

in meinem Fall durch Löschen des xerces Verzeichnis in meinem lokalen sbt Cache (lokale maven-Repository verwenden maven, wenn Sie), aufgelöst wurde und Wiederaufbau des Projekts.

2

Ich hatte die selbe Ausnahme, als ich mein Projekt von GWT 2.7 auf GWT 2.8 aufwertete. Ich habe keine Ahnung, warum ich dieses Problem mit GWT 2.7 nicht hatte (möglicherweise könnte sich dies auf eine andere Position der .classpath-Datei des Eclipse-Projekts auswirken).

Der Grund für diese Ausnahme war, dass vor mit einem solchen Code wie:

DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance(); 
DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder(); 
baseLayoutXmlDocument = newDocumentBuilder.parse(baseLayoutSvgInputStream); 

SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 

die Implementierungen von JDK Paket com.sun.org.apache.xerces.internal.jaxp verwendet wurde, aber nach dem Upgrade auf GWT2 .8 Meine App wählte die Xerces aus gwt-dev.jar. fand ich die Lösung für den nach Javadoc und link here gewöhnungsSystemEigenschaften

-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl 
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl 
0

Dies ist ein bisschen spät, aber durch die Antworten nach der Lektüre habe ich einen Weg, um dieses Problem zu arbeiten finden.Anstatt Ihre Dokument-Factory mit dem normalen DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); zu erstellen, könnten Sie die Parameter in newInstance gezielt auswählen. Auf diese Weise müssen Sie keine JVM-Parameter wie die obige Antwort von Svarog hinzufügen, und Sie müssen keine Bibliotheken hinzufügen oder entfernen. Meine Lösung ist wie folgt:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", this.getClass().getClassLoader()); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(new FileInputStream("path/to/file.xml")); 
Verwandte Themen