在Glassfish 3.1.2上部署包含Application Client的ear会抛出异常

时间:2012-05-12 11:37:27

标签: java glassfish glassfish-3 ear application-client

我正在问这个问题,所以我可以自己回答这个问题,因为它让我疯了两天,没有其他人应该像我一样受苦。

在部署我的耳朵时,我得到这样的例外:


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文件可能无法在另一台计算机上部署,并且服务器似乎会被问题“感染”并拒绝部署之前运行良好的耳朵。清除缓存和生成的文件并不会使它消失。

2 个答案:

答案 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