无法将.war应用程序部署到GlassFish 3.1.2

时间:2012-12-19 10:34:17

标签: java deployment glassfish war

我有一个.war应用程序模块,可以成功部署,无需任何奇怪的更改和服务器调整。但是,我无法将此应用程序部署到GF 3.1.2:服务器抛出异常:

  

java.lang.Exception:java.lang.IllegalStateException:ContainerBase.addChild:start:org.apache.catalina.LifecycleException:org.apache.catalina.LifecycleException:java.lang.NoSuchFieldError:theInstance

我做错了什么?有人建议我吗?是否有成功部署.war模块的其他设置?

提前多多感谢。

UPD

更准确的日志条目:

  

javax.xml.bind.JAXBException:无法实例化Provider com.sun.xml.bind.ContextFactory_1_0_1:javax.xml.bind.JAXBException     - 链接异常:   [java.lang.NoSuchFieldError:theInstance]
    - 链接异常:   [javax.xml.bind.JAXBException     - 链接异常:   [java.lang.NoSuchFieldError:theInstance]]

4 个答案:

答案 0 :(得分:3)

Sounds like a class loader issue.

您需要在GlassFish JAXB jar之前使用您的WEB-INF / lib JAXB jar。 或者更改您的应用程序以使用GlassFish 3.1.2捆绑的版本。

Servlet规范说Web应用程序在委托父代之前应该使用本地类加载器。我认为GlassFish默认委托给Web应用程序的父类加载器。在web.xml或glassfish-web.xml中使用<class-loader delegate="false"/>

请注意,如果不起作用,可能还有其他方法可以修改GlassFish中的类加载器。

在部署到许多应用程序服务器期间,此类问题很常见。 我过去5年多来每天都使用GlassFish,并经常看到这一点。 最近在CloudBees上部署到JBoss时遇到了类似的问题,并相应地修改了部署描述符。

Googling "glassfish prefer web-inf/lib jars".

回复以下评论 EJB接口必须驻留在Web模块和EJB模块共享的类路径层次结构中。如果WEB-INF / lib中有EJB接口jar,EJB模块类路径上有EJB接口jar的另一个副本,则在Web应用程序中注入/定位EJB时会出现ClassCastException。我认为WebServices有同样的问题。尽管EAR共享EJB接口jar应该可以解决这个问题。注意可能还有其他我不知道的问题

答案 1 :(得分:1)

您不应该将JAXB jar与您的应用程序捆绑在一起 - Glassfish已经拥有它们,这似乎导致了冲突(顺便说一下,我最近一直在挖掘JAXB代码,theInstance是静态的一部分由MarshallerImpl

定义的类

答案 2 :(得分:0)

您应该将所有jar文件放入运行时服务器lib ...

答案 3 :(得分:0)

此说明适用于GlassFish 3.1.2 问题是来自JAXB 2.2.5的运行时类不能与JAXB 1代码向后编译。 这个问题已通过JAXB 2.2.6修复,但是,它不是最新的GlassFish版本。因此,要么等到下一次GlassFish升级,要么手动完成。

这是我的表现, 我从GlassFish模块中删除了2个bundle文件

C:\glassfish3\glassfish\modules\jaxb-osgi.jar
C:\glassfish3\glassfish\modules\endorsed\jaxb-api-osgi.jar

删除

中的所有子文件夹以清除osgi-cache
C:\glassfish3\glassfish\domains\domain1\osgi-cache

ORACLE JAXB

下载JAXB 2.2.6

将zip文件解压缩到临时位置[C:\ Java \ jaxb-ri-2.2.6 \ jaxb-ri-2.2.6 \ osgi]

将C:\ Java \ jaxb-ri-2.2.6 \ jaxb-ri-2.2.6 \ osgi \ jaxb-osgi.jar复制到C:\ glassfish3 \ glassfish \ modules \

将C:\ Java \ jaxb-ri-2.2.6 \ jaxb-ri-2.2.6 \ osgi \ jaxb-api-osgi.jar复制到C:\ glassfish3 \ glassfish \ modules \ endorsed \

重新启动你的服务器...我希望这会有所帮助。祝你好运