2014-07-17 25 views
7

Sto sviluppando un'applicazione GWT in Eclipse e utilizzo jdom2 per leggere alcuni file di proprietà xml personalizzati.ClassCastException: impossibile eseguire il cast di org.apache.xerces.parsers.XIncludeAwareParserConfiguration su org.apache.xerces.xni.parser.XMLParserConfiguration

In seguito a un recente aggiornamento, la mia applicazione ora non riesce con l'errore sopra riportato quando si tenta di leggere il file xml. L'analisi dello stack rilevante è:

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) 

occupando del problema suggerisce che l'errore può sorgere quando esistono versioni incompatibili delle Xerces vasi nel classpath.

gwt-dev-2.6.1.jar contiene i pacchetti xerces e la mia impressione è che questa ultima versione di gwt-dev ha fornito in bundle una versione che è incompatibile. Tuttavia, jdom2.0.5, la versione corrente, viene rilasciato con la versione 2.11 di Xerces che sembra essere l'ultima rilasciata da Apache. Mettere questi vasi sul mio percorso di classe non sembra risolvere i problemi; In precedenza ho potuto fare affidamento sulle versioni di gwt-dev.

Sono piuttosto ottimista riguardo questo e notevolmente fuori dalla mia zona di comfort.

+0

Provare a rimuovere GWT dal progetto, quindi aggiungerlo di nuovo. Inoltre, assicurati di non avere giare duplicati (vecchi e nuovi) nella tua cartella WEB-INF/lib. –

risposta

0

L'ordine dei vasi sul classpath è importante. Hai provato ad aggiungere il jar Xerces 2.11 all'inizio del classpath in modo che venga caricato prima?

0

Non litigare con Maven: se le cose non vengono usate insieme, dovrebbero andare in moduli Maven separati. Nel tuo caso, JDom è (probabilmente) usato sul lato server, che non ha bisogno di gwt-dev. Quindi la soluzione è dividere il progetto in diversi moduli Maven: uno per il lato client che dipende da GWT e uno per il lato server che non lo fa (o forse su gwt-servlet se si utilizza GWT-RPC, o su requestfactory-server se si utilizza RequestFactory).

Detto questo, anche con un singolo progetto, se si dispone di gwt-dev nel proprio classpath in fase di esecuzione, si verifica un errore nel POM.

... a meno che non si leggano i file XML in fase di compilazione?

3

Nel mio caso ho risolto questo problema aggiungendo alle entità bootstrap (scheda Percorso di classe nella configurazione di esecuzione) due voci /xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar e/xerces /xercesImpl/2.11.0/xercesImpl-2.11.0.jar dal mio repository di Maven locale

0

Nel mio caso questo è stato risolto eliminando la directory xerces nella mia cache locale di sbt (repository locale di Maven se si utilizza Maven), e ricostruire il progetto.

2

Ho avuto la stessa eccezione quando ho aggiornato il mio progetto da GWT 2.7 a GWT 2.8. Non ho idea del motivo per cui non ho avuto questo problema con GWT 2.7 (forse una diversa posizione nel file .classpath del progetto Eclipse potrebbe influenzarlo).

La ragione di tale eccezione era che prima con tale codice come:

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

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

le implementazioni da JDK pacchetto com.sun.org.apache.xerces.internal.jaxp è stato utilizzato, ma dopo l'aggiornamento a GWT2 .8 la mia app ha scelto xerces da gwt-dev.jar. ho trovato la correzione per che secondo Javadoc e link here alle proprietà di sistema utilizzate

-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

Questo è un po 'tardi, ma dopo aver letto attraverso le risposte che ha trovato un modo per aggirare il problema.Invece di costruire la tua fabbrica di documenti con il normale DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); potresti usare i parametri in newInstance per scegliere in modo specifico. In questo modo non devi aggiungere parametri JVM come la risposta di Svarog sopra, e non devi aggiungere o rimuovere librerie. La mia soluzione è la seguente:

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"));