【问题标题】:Java LinkageError while deploying to weblogic部署到 weblogic 时出现 Java LinkageError
【发布时间】:2015-10-29 15:54:57
【问题描述】:

我正在开发一个大型应用程序,我刚刚在轴的帮助下添加了一个由 eclipse 生成的新 Web 服务。 该应用程序在我的开发环境(应用程序由码头托管)中运行良好,但现在我在 weblogic 中运行我的应用程序时遇到了麻烦(需要部署应用程序)。 我得到的错误是:

java.lang.LinkageError: loader constraint violation in interface
itable initialization: when resolving method
"org.apache.axis.client.Service.getServiceName()Ljavax/xml/namespace/QName;"
the class loader (instance of
weblogic/utils/classloaders/ChangeAwareClassLoader) of the current
class, org/apache/axis/client/Service, and the class loader (instance
of sun/misc/Launcher$AppClassLoader) for interface
javax/xml/rpc/Service have different Class objects for the type
getServiceName used in the signature

这个问题已经耽误了几天的开发。 据我在网上了解:

  • 我的 Axis 依赖项包含类:org.apache.axis.client.Service,它遵循 javax.xml.rpc.Service 接口。
  • 我的Weblogic提供了接口: javax.xml.rpc.Service
  • 由于它们位于不同的路径(应用程序和 weblogic)中,它们由不同的类加载器加载

第一个问题:我的观察是否正确?

第二个问题:我可以做什么/尝试解决这个问题?

额外信息:

  • 使用 Maven。
  • 为确保 Weblogic 加载的所有依赖项在我们的开发环境中也可用,我们添加了 wlsfullclient.jar 作为依赖项(仅在我们的开发环境中)。
  • 由于很多项目都在使用我们的 weblogic 服务器,所以我不能只将 Axis jar 添加到 weblogic 路径中。
  • 我在 Stack 上发现了一个类似的问题:How to deal with LinkageErrors in Java?
    • 尽管我对 Alex Miller 的回复很感兴趣,但他们的解决方案对我来说并不清楚,特别是:“这可能意味着将其从类路径中删除并作为插件加载”。
      • 这适用于应用程序端还是 Web 逻辑端?
  • 如果需要更多信息,我很乐意提供。

编辑: 我的项目中有一个 weblogic.xml,内容如下:

<?xml version='1.0' encoding='UTF-8'?>
  <weblogic-web-app >
    <container-descriptor>
      <prefer-web-inf-classes>true</prefer-web-inf-classes>
    </container-descriptor>
  <context-root>auditgui</context-root>
</weblogic-web-app>

我的WAR文件结构如下:

file.war
    |--crossdomain.xml
    |--robots.txt
    |--META-INF
    |   \--MANIFEST.MF
    |--WEB-INF
    |   |--classes
    |   |   |--com
    |   |   |   \--...
    |   |   |--spring
    |   |   |   |--main-context.xml
    |   |   |   \--security-context.xml
    |   |   \--environment-beans.xml
    |   |--lib
    |   |   \--multiplejars.jar
    |   |--spring
    |   |   |--raw-servlet-context.xml
    |   |   |--root-context.xml
    |   |   \--servlet-context.xml
    |   |--web.xml
    |   \--weblogic.xml
    |--css
    |   \--multipleCSSFiles.css
    |--js
    |   \--multipleJSFiles.js...
    |--img
    |   \--muultipleImages.png...
    \--multipleHTMLFiles.html...

【问题讨论】:

    标签: java maven weblogic axis linkageerror


    【解决方案1】:

    好的,我解决了这个问题。我发现了相互冲突的依赖关系;

    回顾:

    使用

    weblogic-web-app/container-descriptor

    对我不起作用:

    prefer-web-inf-classes = true

    已经设置好了,将其更改为首选应用程序包只会造成更多麻烦,因为项目已经依赖于首选类配置。

    解决方案:

    我使用findjar 查找我的QName resides 在哪个罐子里,并将这些罐子放在我的记忆中。

    然后通过使用

    mvn 依赖:树

    我得到了我项目的所有依赖项和子依赖项(不会发布它,因为 POM 很大)。

    我注意到有两个名称中带有“stax”的依赖项。一个“官方”stax jar(xmlbeans 的子依赖项)和一个来自 genronimo(axiom 的子依赖项)。所以我做了一些研究,发现 geronimo stax 是对原始 stax jar 的实现/改编,因此都包含 QName。 我从依赖项列表中删除了原始 stax:

        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>2.5.0</version>
            <!-- Excluding XMLBean's STAX because we want to use axiom/geronimo-stax -->
            <exclusions>
                <exclusion>
                    <groupId>stax</groupId>
                    <artifactId>stax-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    

    希望对你有帮助:)

    【讨论】:

      【解决方案2】:

      您可以通过将 prefer-web-inf-classes 添加到 WAR 文件中的 weblogic.xml 来告诉 WebLogic 使用您的应用程序类。

      <weblogic-web-app>
      <container-descriptor>
      <prefer-web-inf-classes>true</prefer-web-inf-classes>
      </container-descriptor>
      </weblogic-web-app>
      

      【讨论】:

      • 感谢您的回复布赖恩。问题是我的 weblogic.xml 中已经有了它。为什么这不起作用呢? (我已经添加了 weblogic.xml 的内容和我的文件结构)
      • 您是否尝试过使用 WebLogic 类分析工具来查看 WebLogic 究竟在哪里选择了这个类?
      • 遗憾的是,我目前无法访问 CAT 工具,在我们发言时,我正在与我们项目的负责团队联系,但我担心他们不会提供访问权限。是否有另一种方法来进行类(加载器)分析?
      【解决方案3】:

      WebLogic 还允许您指定要从您的应用程序与 WLS 类路径中使用的包:

      <weblogic-web-app>
        <container-descriptor>
          <prefer-application-packages>
            <package-name>org.apache.commons.*</package-name>
            <package-name>org.apache.log4j.*</package-name>
            <package-name>org.slf4j.*</package-name>
          </prefer-application-packages>
        </container-descriptor>
      </weblogic-web-app>
      

      prefer-web-inf-classes 表示应用中打包的内容始终优先于 WebLogic 的设置,这可能是好事,也可能不是好事。

      【讨论】:

      • 感谢您的回复。我试过这个,但这在从我们的 Bamboo 服务器部署时产生了一个错误:error 30-Oct-2015 14:31:04 java.lang.NoSuchMethodError: org.springframework.beans.MutablePropertyValues.add(Ljava/lang/String;Ljava/ lang/Object;)Lorg/springframework/beans/MutablePropertyValues; org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.parse(AnnotationDrivenBeanDefinitionParser.java:102) 的错误 30-Oct-2015 14:31:04
      • 我使用以下 weblogic.xml 运行它:org.apache.axis.*javax. xml.rpc.*
      • 什么版本的 WebLogic?我们对 10.3.6 和 12.1.x 使用类似的配置。尝试在没有 Bamboo/CI 服务器的情况下进行部署也很好。尝试排除故障时使用的工具越少越好。
      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2021-07-29
      • 2017-05-14
      相关资源
      最近更新 更多