我有一个.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]]
答案 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-cacheC:\glassfish3\glassfish\domains\domain1\osgi-cache
下载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 \
重新启动你的服务器...我希望这会有所帮助。祝你好运