Java 部署到 weblogic 时出现 LinkageError
Java LinkageError while deploying to weblogic
我正在开发一个大型应用程序,我刚刚在 axis 的帮助下添加了一个由 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 依赖项包含 class: org.apache.axis.client.Service,它遵循 javax.xml.rpc.Service 接口。
- 我的Weblogic提供了接口:
javax.xml.rpc.Service
- 由于它们位于不同的路径(应用程序和 weblogic),它们由不同的 classloader
加载
第一个问题:我的观察是否正确?
第二个问题:我可以do/try解决这个问题吗?
补充信息:
- 使用 Maven。
- 为了确保 Weblogic 加载的所有依赖项在我们的开发环境中也可用,我们添加了 wlsfullclient.jar 作为依赖项(仅在我们的开发环境中)。
- 由于我们的 weblogic 服务器被很多项目使用,我不能只将 Axis jar 添加到 weblogic 路径。
- 我在 Stack 上发现了一个类似的问题:How to deal with LinkageErrors in Java?。
- 虽然我对 Alex Miller 的回复很感兴趣,但我对他们的解决方案并不清楚,特别是:"That may mean removing it from the classpath and loading as a plugin"。
- 这适用于应用程序端还是网络逻辑端?
- 如果需要更多信息,我很乐意提供。
编辑:
我的项目中有一个 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...
您可以通过将 prefer-web-inf-类 添加到 WAR 文件中的 weblogic.xml 来告诉 WebLogic 使用您的应用程序 类。
<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>
prefer-web-inf-classes
意味着应用程序中打包的内容始终优先于 WebLogic 的设置,这可能是好事也可能不是好事。
好的,我解决了这个问题。我发现了相互冲突的依赖项;
回顾:
使用
weblogic-web-app/container-descriptor
不适合我:
prefer-web-inf-classes = true
已经设置并将其更改为首选应用程序包只会导致更多麻烦,因为该项目已经依赖于首选 类 配置。
解决方案:
我用过 findjar for looking up in which jar's my QName resides 并将这些罐子放在我的记忆中。
然后使用
mvn dependency:tree
我得到了项目的所有依赖项和子依赖项(不会 post 因为 POM 很大)。
我注意到有两个名称中带有 'stax' 的依赖项。一个 'official' stax jar(xmlbeans 的子依赖)和一个来自 genronimo(axiom 的子依赖)。所以我做了一些研究,发现 geronimo stax 是原始 stax jar 上的 implementation/adaption,因此两者都包含 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>
希望对您有所帮助:)
我正在开发一个大型应用程序,我刚刚在 axis 的帮助下添加了一个由 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 依赖项包含 class: org.apache.axis.client.Service,它遵循 javax.xml.rpc.Service 接口。
- 我的Weblogic提供了接口: javax.xml.rpc.Service
- 由于它们位于不同的路径(应用程序和 weblogic),它们由不同的 classloader 加载
第一个问题:我的观察是否正确?
第二个问题:我可以do/try解决这个问题吗?
补充信息:
- 使用 Maven。
- 为了确保 Weblogic 加载的所有依赖项在我们的开发环境中也可用,我们添加了 wlsfullclient.jar 作为依赖项(仅在我们的开发环境中)。
- 由于我们的 weblogic 服务器被很多项目使用,我不能只将 Axis jar 添加到 weblogic 路径。
- 我在 Stack 上发现了一个类似的问题:How to deal with LinkageErrors in Java?。
- 虽然我对 Alex Miller 的回复很感兴趣,但我对他们的解决方案并不清楚,特别是:"That may mean removing it from the classpath and loading as a plugin"。
- 这适用于应用程序端还是网络逻辑端?
- 虽然我对 Alex Miller 的回复很感兴趣,但我对他们的解决方案并不清楚,特别是:"That may mean removing it from the classpath and loading as a plugin"。
- 如果需要更多信息,我很乐意提供。
编辑: 我的项目中有一个 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...
您可以通过将 prefer-web-inf-类 添加到 WAR 文件中的 weblogic.xml 来告诉 WebLogic 使用您的应用程序 类。
<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>
prefer-web-inf-classes
意味着应用程序中打包的内容始终优先于 WebLogic 的设置,这可能是好事也可能不是好事。
好的,我解决了这个问题。我发现了相互冲突的依赖项;
回顾:
使用
weblogic-web-app/container-descriptor
不适合我:
prefer-web-inf-classes = true
已经设置并将其更改为首选应用程序包只会导致更多麻烦,因为该项目已经依赖于首选 类 配置。
解决方案:
我用过 findjar for looking up in which jar's my QName resides 并将这些罐子放在我的记忆中。
然后使用
mvn dependency:tree
我得到了项目的所有依赖项和子依赖项(不会 post 因为 POM 很大)。
我注意到有两个名称中带有 'stax' 的依赖项。一个 'official' stax jar(xmlbeans 的子依赖)和一个来自 genronimo(axiom 的子依赖)。所以我做了一些研究,发现 geronimo stax 是原始 stax jar 上的 implementation/adaption,因此两者都包含 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>
希望对您有所帮助:)