【问题标题】:WebSphere 7 org.apache.axis2.deployment.WarBasedAxisConfigurator <init> org.apache.commons.fileupload.FileUploadExceptionWebSphere 7 org.apache.axis2.deployment.WarBasedAxisConfigurator <init> org.apache.commons.fileupload.FileUploadException
【发布时间】:2017-12-26 20:11:34
【问题描述】:

这是一个奇怪的问题。我有一个现有 JEE 项目,并且已经在 WebSphere 7 上生产。它是一个多模块 EAR 文件。它有 2 个 WAR 和 1 个共享 Java 项目。其中大部分是基于 Spring 4 的,但我们有一些使用 axis2 (1.5.4) 托管的 Web 服务。此项目使用 Maven。它确实使用了带有 warClassloaderPolicy="SINGLE" 和类加载器模式="PARENT_LAST" 的 WebSphere deployment.xml(在 EAR 中)。这控制此 EAR 的类加载器策略。 Java 项目和 WAR 所依赖的所有 jar 文件都存储在 EAR 级别,并通过清单文件在模块级别进行引用。这一切都很好,已经有好几年了。

经过这么多年,现在我试图将这个项目转换为 Maven 项目。最初,我像往常一样保留了 deployment.xml 文件设置。但是有了这些设置,我得到了:

java.lang.VerifyError at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl "org.springframework.oxm.jaxb.Jaxb2Marshaller".

在这个网站上进行了多次谷歌搜索并尝试了 50,000 种方法后,我尝试了一种方法,该方法适用于 大多数 应用程序。我将类加载器模式切换为“PARENT_FIRST”,突然间,专门使用 Spring 4 的 WAR 工作了。它启动没有错误,我能够运行它。

但是,托管axis2 Web服务的另一个WAR开始出现错误:

org.apache.axis2.deployment.WarBasedAxisConfigurator <init> org.apache.commons.fileupload.FileUploadException....Caused by: java.lang.NoClassDefFoundError: org.apache.commons.fileupload.FileUploadException....Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileUploadException

这个类 (org.apache.commons.fileupload.FileUploadException) 在 compileruntime 类路径中。在 eclipse 中,我可以在 m2e eclipse 插件从 POM 文件创建的“Maven Dependencies”库中看到它。我还可以在 WebSphere 运行时模块类路径检查器中看到这个 jar(它在那里显示了 3 次!在每个 WAR 下一次,一次在 Maven 存储库位置的列表中。)

需要注意的一点是,我已经为项目配置了一个父 POM,其中大部分依赖项在父 POM 中声明,然后为每个模块继承。在 EAR 项目中,POM 使用 skinnyWars=true 的 maven-ear-plugin。然而,当 m2e eclipse 插件将 EAR 部署到本地 WebSphere 服务器时,似乎不遵守 skinnyWars 指令(这很明显,因为我看到这些 jars 出现在类路径中 3 次)。但是当我使用 Maven 构建创建 EAR 时,EAR 会正确显示,每个 jar 只会在 EAR 中显示一次。

这是我最后的希望,在这里发布一些东西,看看是否有人有想法可以尝试,否则我想不出其他可以尝试的东西。

谢谢...

【问题讨论】:

    标签: spring eclipse maven axis2 websphere-7


    【解决方案1】:

    除了方便之外,您是否需要为所有 WAR 模块使用单个类加载器运行的特殊原因?如果没有,您可以重新设计应用程序,以允许您在 Spring WAR 中运行 PARENT_FIRST 并在 Axis2 WAR 中运行 PARENT_LAST。

    如果由于某种原因这不是一个选项,阻力最小的路径可能是返回到 PARENT_LAST 并从应用程序或模块中删除一些库。如果您使用 PARENT_LAST 运行并且在应用程序中有一个也存在于服务器中的库,则通常会发生 VerifyError - 在这种情况下,异常看起来像是来自 JAXB,因此您可能想看看是否只是删除 JAXB (也许还有 JAXP,如果存在,因为它被 JAXB 大量使用)从应用程序中解决了默认设置的问题。

    您还可以坚持使用 PARENT_FIRST 并将 Axis2 jar 移动到具有隔离类加载器的共享库,该类加载器与应用程序相关联。一个独立的共享库将只生成共享库 PARENT_LAST 中的内容,因此您可以避免 VerifyError 并仍然获得 Axis2 的 PARENT_LAST。 PARENT_FIRST 案例中的问题似乎是因为您正在获取 WebSphere 的 Axis2 副本,但不知何故从您的应用程序副本中插入了一个依赖项 - 失败的类加载发生在服务器级加载程序中,因此它看不到复制到您的应用中。

    【讨论】:

    • 嗨,贾里德,感谢您的帮助。单个类加载器没有特别的原因。事实上,进入 WAS 管理控制台并将 WAR 类加载器策略修改为 '应用程序中每个 WAR 文件的类加载器'(模块),然后为具有 Axis2 并设置的 WAR '管理模块'类加载顺序为“...本地类加载器优先”并在 OMContainer.getChildrenWithName 上得到验证错误。我会看看你关于 PARENT_LAST 和删除库的建议。我之前确实尝试过一些。我认为需要 JAXB 4 Spring mod 关于库,我不希望太
    • JAXB 可能曾经需要,但现在它已经成为 Java EE/SE 的一部分,因此您通常不需要自带。
    • 现在,我删除了axis2-jaxws通过传递依赖引入的jaxb实现。现在得到 java.lang.ClassCastException: com.ibm.xml.xlxp2.jaxb.JAXBContextImpl incompatible with javax.xml.bind.JAXBContext
    • 应用中还有 JAXB API 吗?没有实现就不能包含 API。
    • 好吧,现在我已经删除了 JAXB API 并得到“javax.xml.namespace.QName 没有无参数默认构造函数”这个问题与以下位置有关:在 javax.xml .namespace.QName at public javax.xml.bind.JAXBElement .ObjectFactory.createQName(javax.xml.namespace.QName) at .ObjectFactory" 我将尝试用谷歌搜索该消息。 ..
    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多