关于weblogic部署Java项目的包冲突问题的解决

我们可能会用各种应用服务部署我们的Java应用,比如Tomcat、WAS、weblogic等。Tomcat和WAS可能会比较少遇到一些奇怪的问题,但是用weblogic部署项目则经常遇到一些比如包冲突问题,路径问题等奇怪但又常见的问题。

今天我就讲讲关于weblogic部署Java项目包冲突的问题。下面我举个例子:

当我在weblogic部署Java项目之后,启动没报任何错,没有异常。但是当我操作某个功能的时候页面就报错了:

后台报了这个错:

Root cause of ServletException.
java.lang.LinkageError: loader constraint violation: loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader)
previously initiated loading for a different type with name "javax/xml/namespace/QName"
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
  at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:343)
  at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:302)
  at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
  at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64)
  at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:49)
  at java.lang.Class.getDeclaredMethods0(Native Method)
  at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
  at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
  at java.lang.Class.getMethod0(Class.java:3018)
  at java.lang.Class.getMethod(Class.java:1784)
  at org.apache.xmlbeans.XmlBeans.buildMethod(XmlBeans.java:174)
  at org.apache.xmlbeans.XmlBeans.buildNoArgMethod(XmlBeans.java:190)
  at org.apache.xmlbeans.XmlBeans.buildGetContextTypeLoaderMethod(XmlBeans.java:200)
  at org.apache.xmlbeans.XmlBeans.<clinit>(XmlBeans.java:126)
  at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook$Factory.newInstance(Unknown Source)
  at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:290)
  at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:170)
  at com.kayak.web.base.util.export.ExportExcelXSSF.export(ExportExcelXSSF.java:893)
  at com.kayak.web.base.action.ExportExcelAction.exportExcel(ExportExcelAction.java:318)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
  at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
  at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
  at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
  at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
  at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
  at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
  at com.kayak.web.user.filter.LoginCertifyFilter.doFilter(LoginCertifyFilter.java:125)
  at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
  at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
  at com.kayak.web.base.filter.LocalRequestFilter.doFilter(LocalRequestFilter.java:28)
  at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
  at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
  at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60)
  at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3748)
  at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714)
  at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
  at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
  at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283)
  at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)
  at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1499)
  at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)
  at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

错误内容很长,但是要学会辨认,我刚开始就被一大堆错误误导了。关键的都是下面的这个:

loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader)
previously initiated loading for a different type with name "javax/xml/namespace/QName"

大概意思就是“加载器之前启动的时候加载了名字叫javax/xml/namespace/QName的其他类型的类”。其实转换一下就是,在启动的时候加载了一个javax/xml/namespace/QName类,我们现在要用的功能需要一个类也叫javax/xml/namespace/QName,但是这个不是我们真正想要的class。

从上面的意思可以知道,这就是有两个相同包包路径和类名称的class,但是有一个想要的却没有,只有一个我们并不想要的class。了解weblogic部署的同学都知道,weblogic加载了一个相同的class就不会在加载其他一样的class了。

当我再操作一次的之后又报另一个错(部分错误内容):

Root cause of ServletException.
java.lang.NoClassDefFoundError: Could not initialize class org.apache.xmlbeans.XmlBeans
  at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook$Factory.newInstance(Unknown Source)
  at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:290)
  at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:170)
  at com.kayak.web.base.util.export.ExportExcelXSSF.export(ExportExcelXSSF.java:893)
  at com.kayak.web.base.action.ExportExcelAction.exportExcel(ExportExcelAction.java:318)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)

就是说不能初始化classorg.apache.xmlbeans.XmlBeans。但是我们不要被这个所误导,关键还是在于上面的javax/xml/namespace/QName ,就是因为这个冲突了所以才会导致后面的问题发生。

我用 jfind.jar 在项目下的lib目录下搜索发现在axis-jaxrpc-1.4.jar下有javax/xml/namespace/QName.class文件。因为在jdk下的 rt.jar 下面也有javax/xml/namespace/QName.class所以就会有两个一样的class文件。

后面我发现在项目的 WEB-INF 下面有个weblogic.xml 文件,里面就有一些关于weblogic的配置:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app>
  <container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>
  <charset-params>
    <input-charset>
      <resource-path>/*</resource-path>
      <java-charset-name>UTF-8</java-charset-name>
    </input-charset>
  </charset-params>
</weblogic-web-app>

这个配置文件里的第4行配置就是只先加载项目里的class文件,再加载weblogic的class,也就是因为这个配置而导致了项目里的axis-jaxrpc-1.4.jar下有javax/xml/namespace/QName.class,jdk下的rt.jar 下面也有javax/xml/namespace/QName.class却没有加载到,但是后者才是程序所需要的。

因此,我就尝试把weblogic.xml的第4行配置 改成 false,重新打war包,重新部署,然后发现问题解决了。

接着我又换了一种尝试,就是weblogic.xml的第4行配置依然是true ,但是我把项目里那个冲突的class所在的包 axis-jaxrpc-1.4.jar 删了,也重新打包部署,也没有问题了。所以到此就把问题给解决了

总结:

1. 在weblogic中部署Java应用时,经常遇到包冲突问题,其实首先可以通过修改weblogic.xml配置来解决,另一种方式就是通过jfind.jar 找出冲突的class所在的包,直接把这个包删了,可以解决。

2. 包冲突问题都可以通过上面的两种方式解决,还有就是 有时候可能会包找不到某个class文件,其实很有可能就是因为class文件冲突,以及先后加载的顺序问题,导致我们项目中真正需要的class文件却没有被加载进来。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 关于weblogic部署Java项目的包冲突问题的解决

    我们可能会用各种应用服务部署我们的Java应用,比如Tomcat.WAS.weblogic等.Tomcat和WAS可能会比较少遇到一些奇怪的问题,但是用weblogic部署项目则经常遇到一些比如包冲突问题,路径问题等奇怪但又常见的问题. 今天我就讲讲关于weblogic部署Java项目包冲突的问题.下面我举个例子: 当我在weblogic部署Java项目之后,启动没报任何错,没有异常.但是当我操作某个功能的时候页面就报错了: 后台报了这个错: Root cause of ServletExcep

  • Jenkins+Maven+SVN自动化部署java项目

    安装Jenkins 提示:首先Jenkins安装方式有2中,一种是yum安装,另一种是使用war的方式进行安装(war就需要安装tomcat) 官方文档:https://pkg.jenkins.io/redhat/ 如果我们想使用war包的方式可以直接下载war包 Jenkins访问地址:localhost:8080/jenkins 新版本的jenkins为了保证安全,在安装之后有一个锁,需要设置密码之后才可以解锁 我们选择推荐安装即可 安装插件中 设置管理员账号密码 登陆jenkins 安装m

  • k8s部署java项目的实现

    下载jar的包 [root@master test]# wget https://dl.halo.run/release/halo-1.4.16.jar [root@master ~]# ls anaconda-ks.cfg flannel.yml halo-1.4.16.jar init [root@master ~]# 编写Dockerfile并制作镜像 [root@master ~]# mkdir -p test/files [root@master ~]# mv halo-1.4.16.

  • Docker部署java项目的详细步骤(利用Dockerfile方式)

    目录 前言 1. 首先找一个你熟悉的目录下创建一个目录upload(这个目录可以随便),并把java的linux和jar包上传进去 2. 创建一个名为 Dockerfile文件 3. 以上命令配置完成后,即可输入命令进行build,然后回车 4 . 启动该容器 5. 访问地址 总结 前言 如何将java项目部署到Docker中呢,这里以一个springboot为例 以下命令全部都是以linux为基础的 1. 首先找一个你熟悉的目录下创建一个目录upload(这个目录可以随便),并把java的li

  • 手动部署java项目到k8s中的实现

    目录 前言 1. 生成Demo项目 2. 配置Docker环境 3. 配置k8s 3.1 编写deploy.yaml文件 3.2 启动调度 4. 验证 4.1 查看pod 4.2 访问系统 5. k8s配置文件参数详解 前言 Java项目在开发调试的过程中都需要进行各种环境的安装部署,在之前我们使用虚拟机部署时都是通过在机器上执行命令或者配置Jekins脚本自动化部署.但在容器环境下进行高可用的进行项目的安装部署就需要使用容器化技术跟k8s的调度执行了. 一般在正式环境下我们都会有以下几部分构成

  • java项目jar包与jdk的版本不兼容的问题解决

    这篇文章主要介绍了java项目jar包与jdk的版本不兼容的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在我们搭建框架或者引入jar包是,总是会因为版本不统一导致版本兼容问题,而且错误还不好找, 今天就遇到了一个问题Unsupported major.minor version 52.0并记录下解决方案 错误原因: 我当时使用的是jdk7,因为公司是传统行业,所以jdk的版本不是很到,而我现在需要搭建一套新的项目框架,我引入了一些最

  • 完美解决android 项目jar包冲突的问题

    大家在做开发中竟然需要用到一些三方库 或者 需要集成三方的SDK开发包,尤其是项目特别庞大的时候,引用的三方的东西特别多,那么肯定会碰到一些jar包冲突的情况. 常见的情况有以下几种 1.项目自己引用jar包重复 2.项目中jar包和三方SDK 3.三方sdk之间都含有相同类 4.打包时候出现编译错误,出现冲突 1.项目自己引用jar包重复 com.android.dex.DexException: Multiple dex files define Landroid/support/v4/ac

  • docker安装tomcat并部署Springboot项目war包的方法

    说来也简单,直接上教程吧,博主 1.首先在启动docker service docker start 2.拉取tomcat镜像. docker pull tomcat:8-jdk8 如果不加后面的8-jdk8  标签的话,会默认拉取latest,也就是最新的官方版本 3.安装完成后,做作容器,并启动tomcat docker run --name tomcat -p 8080:8080 如果正常安装后访问ip+端口出现404情况,进入tomcat目录,把原有webapps目录删除,并把webap

  • 使用docker部署java项目运行环境的实现步骤

    目录 一.环境准备 二.配置网络 三.开放端口 四.安装jdk 五.安装docker 六.运行环境搭建 五.启动java项目 一.环境准备 1. CentOS-7-x86_64-DVD-2003.iso2. docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm3. emqx-4.2.6.tar4. influxdb-1.7-alpine.tar5. mysql-5.7.tar6. reids-6-alpine.tar7. xshell (连接centos7)8

  • Java项目Guava包 HashMultimap使用及注意事项

    目录 1. 数据模型介绍 2. 简单使用介绍 2.1 容器创建 2.2 添加元素 2.3 移除元素 2.4 替换元素 2.5 获取元素及遍历 2.6 输出所有的key 2.7 输出所有的value 3. 小结 今天给大家介绍一个相对基础的知识点 HashMultmap: guava基本上可以说是java开发项目中,大概率会引入的包,今天介绍的主角是一个特殊的容器 -- HashMultmap,可以简单的将它的数据结构理解为Map<K, Set<V>> 那么为什么会突然想到介绍一下它

随机推荐