簡體   English   中英

找不到http://www.w3.org/2001/XMLSchema的工廠

[英]Unable to find a factory for http://www.w3.org/2001/XMLSchema

我的以下代碼有一些煩人的問題,在切換到Java 1.7之前還可以正常工作

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 (sun.misc.Launcher$AppClassLoader@5e3a78ad) 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” (可能無法找到它)。

為什么會有這種差異? 似乎有什么問題嗎?

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

我通過使用線程上下文類加載器(通常縮寫為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項目,以獲取更多詳細信息。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM