【问题标题】:Unable to deploy .war application to GlassFish 3.1.2无法将 .war 应用程序部署到 GlassFish 3.1.2
【发布时间】:2012-12-19 10:34:16
【问题描述】:

我有一个 .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:提供程序 com.sun.xml.bind.ContextFactory_1_0_1 无法实例化:javax.xml.bind.JAXBException - 有关联的例外: [java.lang.NoSuchFieldError: theInstance]
- 有关联的例外: [javax.xml.bind.JAXBException - 有关联的例外: [java.lang.NoSuchFieldError: theInstance]]

【问题讨论】:

  • 也许您正在创建库冲突。作为战争的一部分,您部署了哪些库?
  • 如果您谈论项目的依赖关系,其中有很多:JDBC 的东西、日志记录 API、JAXB、PDF、JSF、AXIS、COMMONS 和其他东西。您是否认为项目和服务器提供的依赖项之间可能存在某种冲突?如何检查?
  • 您是否包装了不同版本的 JAXB,然后使用 glassfish ?

标签: java deployment glassfish war


【解决方案1】:

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".

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

【讨论】:

  • 顺便说一句,我发现,将 delegate="false" 设置为类加载器选项对于多模块应用程序可能是危险的,但我不明白为什么。我已经用客户端 .net 应用程序测试了我的应用程序链,一切正常(包括 Web 服务)。您能否更准确地解释一下,因为我在 Oracle GlassFish Docs 页面上找到了以下记录:-“仅对于不与任何其他模块交互的 Web 模块,将其设置为 false 是安全的。”谢谢。
  • 但是,我必须找到方法将我非常旧的网络应用程序部署到 glassfish,而不会影响可能也部署到 GlassFish 的其他应用程序(即使对于域也无法使用覆盖标准机制)。
【解决方案2】:

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

【讨论】:

  • 您能否更准确地说明,可以排除哪些 JAXB jar?我有四个:jaxb-api、jaxb-impl、jaxb-libs 和 jaxb-xjc。
  • 仍然有同样的异常。
  • 顺便说一句,Instance方法是类javax.xml.bind.DatatypeConverter的方法
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    此说明适用于 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缓存

    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\

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

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 2013-05-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多