2014-04-22 16 views
0

我在用下面的代碼,直到切換到Java 1.7無法找到一個工廠http://www.w3.org/2001/XMLSchema

import javax.xml.validation.SchemaFactory; 
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

運行效果不錯的一些惱人的問題從與-Djaxp.debug = 1 Netbeans的,下面的錯誤被拋出:

上面文檔片斷代碼是一個OSGi包

JAXP: using thread context class loader ([email protected]) for search 
JAXP: Looking up system property 'javax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema' 
JAXP: The property is undefined. 
JAXP: found null in $java.home/jaxp.properties 
JAXP: no META-INF/services/javax.xml.validation.SchemaFactory file was found 
JAXP: attempting to use the platform default XML Schema validator 
JAXP: instanciating org.apache.xerces.jaxp.validation.XMLSchemaFactory 
JAXP: failed to instanciate org.apache.xerces.jaxp.validation.XMLSchemaFactory 
java.lang.ClassNotFoundException: org.apache.xerces.jaxp.validation.XMLSchemaFactory 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
at javax.xml.validation.SchemaFactoryFinder.createInstance(Unknown Source) 
at javax.xml.validation.SchemaFactoryFinder._newFactory(Unknown Source) 
at javax.xml.validation.SchemaFactoryFinder.newFactory(Unknown Source) 
at javax.xml.validation.SchemaFactory.newInstance(Unknown Source) 
JAXP: unable to find a factory for http://www.w3.org/2001/XMLSchema 
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: http://www.w3.org/2001/XMLSchema 

我也僅與工廠實例製成一個小的Java應用程序的一部分

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

工廠是「com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory」實例,同時在我的包也嘗試實例「org.apache.xerces.jaxp .validation.XMLSchemaFactory「(可能無法找到它)。

爲什麼這種差異? 什麼似乎是問題,任何ideea?

回答

0

這項工作對我來說在JRE 7:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = factory.newSchema(new SAXSource(new InputSource(new ByteArrayInputStream(xsd.getBytes())))); 
Validator validator = schema.newValidator(); 

validator.validate(new SAXSource(new InputSource(new ByteArrayInputStream(xml.getBytes())))); 
System.out.println("Validated !"); 
0

我得到這個通過使用線程上下文類加載器(通常縮寫TCCL)工作。這裏的代碼:

ClassLoader original = Thread.currentThread().getContextClassLoader(); 
try { 
    Thread.currentThread().setContextClassLoader(ClassWithinYourBundle.class.getClassLoader()); 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
} finally { 
    Thread.currentThread().setContextClassLoader(original); 
} 

適當地更換ClassWithinYourBundle

這是GitHub Project瞭解更多詳情。

有關TCCL的更多信息,請參閱:https://articles.qos.ch/classloader.html

相關問題