我正在问这个问题,所以我可以自己回答这个问题,因为它让我疯了两天,没有其他人应该像我一样受苦。
在部署我的耳朵时,我得到这样的例外:
Exception while invoking class org.glassfish.appclient.server.core.AppClientServerApplication start method
org.jvnet.hk2.component.ComponentException: injection failed on org.glassfish.appclient.server.core.jws.JavaWebStartInfo.dch with class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
at org.jvnet.hk2.component.InjectionManager.error_injectionException(InjectionManager.java:284)
at org.jvnet.hk2.component.InjectionManager.inject(InjectionManager.java:161)
at org.jvnet.hk2.component.InjectionManager.inject(InjectionManager.java:93)
.
.
Caused by: org.jvnet.hk2.component.ComponentException: Failed to create class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
.
.
Caused by: java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V
.
.
或有时像这样:
Exception while loading the app : injection failed on org.glassfish.appclient.server.core.jws.JavaWebStartInfo.dch with class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
org.jvnet.hk2.component.ComponentException: Failed to create class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
at com.sun.hk2.component.ConstructorCreator.create(ConstructorCreator.java:71)
at com.sun.hk2.component.AbstractCreatorImpl.get(AbstractCreatorImpl.java:80)
.
.
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
这个错误令人费解,因为在一台计算机上运行良好的ear文件可能无法在另一台计算机上部署,并且服务器似乎会被问题“感染”并拒绝部署之前运行良好的耳朵。清除缓存和生成的文件并不会使它消失。
答案 0 :(得分:3)
经过几个小时的摆弄它我认为我有答案 - 问题是由于ear lib文件夹中包含xerxes-impl jar文件引起的。我怀疑通过一些类加载怪异它正在取代服务器自己的xml解析器。这解决了奇怪的感染问题,因为类路径问题在服务器重新启动之前不会消失。问题可能会出现在任何xml解析器中,但我没有检查过。
要解决关闭glassfish的问题,请确保您正在部署的耳朵中没有xerces,然后重新启动glassfish并部署新的干净耳朵文件。它应该工作。它对我有用。如果做不到这一点,我认为你唯一的办法是献血。
答案 1 :(得分:1)
JDK定义 javax.xml.parsers.DocumentBuilderFactory 接口并提供默认实现。服务提供者可以通过设置系统属性“javax.xml.parsers.DocumentBuilderFactory”来替换实现类。当您部署xerces时,它使用此属性来提供它自己的实现。
javax.xml.parsers.DocumentBuilderFactory 的片段:
public static DocumentBuilderFactory newInstance() {
try {
return (DocumentBuilderFactory) FactoryFinder.find(
/* The default property name according to the JAXP spec */
"javax.xml.parsers.DocumentBuilderFactory",
/* The fallback implementation class name */
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
} catch (FactoryFinder.ConfigurationError e) {
throw new FactoryConfigurationError(e.getException(),
e.getMessage());
}
}
这一切也适用于 javax.xml.parsers.SAXParserFactory 。
选择解析器实现
如果未指定其他工厂类,则使用默认的SAXParserFactory类。要使用来自其他制造商的解析器,您可以更改指向它的环境>变量的值。您可以从命令行执行此操作:
java -Djavax.xml.parsers.SAXParserFactory = yourFactoryHere [...]
您指定的工厂名称必须是完全限定的类名(包括所有包前缀>)。有关更多信息,请参阅> SAXParserFactory类的newInstance()方法中的文档。
http://docs.oracle.com/javase/tutorial/jaxp/sax/validation.html