好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

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

后台报了这个错:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

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了。

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

?

1

2

3

4

5

6

7

8

9

10

11

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的配置:

?

1

2

3

4

5

6

7

8

9

10

11

12

<?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文件却没有被加载进来。

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

原文链接:http://HdhCmsTestcnblogs测试数据/sunshine6/p/10301372.html

查看更多关于关于weblogic部署Java项目的包冲突问题的解决的详细内容...

  阅读:13次