3

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

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

我做错了什么?有人建议我吗?我应该执行任何其他设置来成功部署 .war 模块吗?

提前非常感谢。

UPD

更精确的日志条目:

javax.xml.bind.JAXBException:提供程序 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

4 回答 4

3

听起来像一个类加载器问题。

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

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

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

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

谷歌搜索“glassfish 更喜欢 web-inf/lib jars”。

对下面的 psed 注释的响应 EJB 接口必须位于 Web 模块和 EJB 模块共享的类路径层次结构中。如果您在 WEB-INF/lib 中有一个 EJB 接口 jar,并且在 EJB 模块类路径上有另一个 EJB 接口 jar 副本,那么在您的 Web 应用程序中注入/定位 EJB 时,您会收到 ClassCastException。我假设 WebServices 有同样的问题。虽然通过 EAR 共享 EJB 接口 jar 应该可以解决这个问题。请注意,可能还有其他我不知道的问题

于 2012-12-30T02:10:01.653 回答
1

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

于 2012-12-24T12:11:23.817 回答
0

您应该将所有 jar 文件放到运行时服务器库中...

于 2012-12-29T14:47:48.183 回答
0

此指令适用于 GlassFish 3.1.2 问题是来自 JAXB 2.2.5 的运行时类不能使用 JAXB 1 代码向后编译。此问题已在 JAXB 2.2.6 中得到修复,但是,它不在最新的 GlassFish 版本中。因此,要么等到下一次 GlassFish 升级,要么手动进行。

我是这样做的,我从 GlassFish 模块中删除了 2 个捆绑文件

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\

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

于 2013-03-26T16:54:10.883 回答