部署到 weblogic 时出现 Java LinkageError

标签 java maven weblogic axis linkageerror

我正在开发一个大型应用程序,我刚刚在 axis 的帮助下添加了一个由 eclipse 生成的新 Web 服务。 该应用程序在我的开发环境(应用程序由 jetty 托管)中运行良好,但现在我在 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 接口(interface)。
  • 我的 Weblogic 提供了接口(interface): javax.xml.rpc.Service
  • 由于它们位于不同的路径(应用程序和 weblogic),它们由不同的类加载器加载

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

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

额外信息:

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

编辑: 我的项目中有一个 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...

最佳答案

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

回顾:

使用

weblogic-web-app/container-descriptor

不适合我:

prefer-web-inf-classes = true

已经设置并且将其更改为更喜欢应用程序包只会导致更多麻烦,因为该项目已经依赖于更喜欢的类配置。

解决方案:

我用了findjar在哪个 jar 里查找我的 QName resides并将这些 jar 放在我的内存中。

然后通过使用

mvn dependency:tree

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

我注意到有两个名称中带有“stax”的依赖项。一个“官方”stax jar(xmlbeans 的子依赖项)和一个来自 genronimo(公理的子依赖项)。所以我做了一些研究,发现 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>

希望对您有所帮助:)

关于部署到 weblogic 时出现 Java LinkageError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33419002/

相关文章:

java - Spring - 缺少必需的库 - hibernate3-3.2.3.GA.jar

maven - 有没有办法使用 Nexus 同步存储库?

java - 如何将入站和出站 SOAP 处理程序相互关联

java - Swing:当 JTree 更新时间过长并卡住其他 GUI 元素时该怎么办?

java - 在 java 的奇怪约会

java - PDF人群 'Missing artifact'

java - 支持 JAX-RS 2.0 和 WebLogic 12C

java - 在 WebLogic 上运行具有 SSL 安全性的 JAX-WS 服务

java - 用JDK1.7编译,在JRE 1.8中运行 : possible to install security patches?

java - 安装SDX 麻烦org.apache.cocoon.ResourceNotFoundException : No pipeline matched request: index. html