部署到weblogic时发生Java LinkageError

部署到weblogic时发生Java LinkageError,java,maven,weblogic,axis,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.apac

我正在开发一个大型应用程序,我刚刚在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接口
  • My Weblogic提供了以下界面: javax.xml.rpc.Service
  • 因为它们位于不同的路径(应用程序和weblogic),所以它们由不同的类加载器加载
第一个问题:我的观察结果正确吗

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

额外资料:

  • 使用Maven
  • 为了确保Weblogic加载的所有依赖项在我们的开发环境中也可用,我们添加了wlsfullclient.jar作为依赖项(仅在我们的开发环境中)
  • 由于我们的weblogic服务器被很多项目使用,我不能仅仅将AxisJAR添加到weblogic路径
  • 我在堆栈上发现了类似的问题:。
    • 他们的解决方案对我来说并不清楚,尽管我对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>

您可以告诉WebLogic使用您的应用程序类,方法是将首选web inf类添加到WAR文件中的WebLogic.xml

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

真的

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>

org.apache.commons*
org.apache.log4j*
org.slf4j*

首选web inf类
意味着应用程序中打包的内容始终优先于WebLogic的设置,这可能是好事,也可能不是好事。

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

扼要重述: 使用

weblogic web应用程序/容器描述符

不适合我:

首选web inf类=true

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

解决方案: 我过去常常查找哪个罐子是我的,然后把这些罐子放在我的记忆中

然后用

mvn依赖关系:树

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

我注意到有两个名称中带有“stax”的依赖项。一个“官方”staxjar(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>

org.apache.xmlbeans
xmlbeans
2.5.0
斯塔克斯
斯塔克斯api

希望有帮助:)

谢谢您的回复,布莱恩。问题是我的weblogic.xml中已经有了这个。为什么这不起作用呢?(我已经添加了weblogic.xml的内容和我的文件结构)您是否尝试过使用weblogic类分析工具来查看weblogic从何处获取该类?遗憾的是,我目前无法访问CAT工具,我正在与项目中的负责团队联系,尽管我担心他们不会提供访问权限。是否有其他方法进行类(装入器)分析?谢谢您的回复。我尝试了这个方法,但在从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;错误30-Oct-2015 14:31:04在org.springframework.web.servlet.config.annotationdrivenbendefinitionparser.parse(annotationdrivenbendefinitionparser.java:102)我使用以下weblogic.xml运行它:org.apache.axis.*javax.xml.rpc.*什么版本的weblogic?我们在10.3.6和12.1.x中使用了类似的配置。尝试在没有Bamboo/CI服务器的情况下部署也很好。尝试排除故障时,组合中的工具越少越好。
    <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>