论坛首页 Java企业应用论坛

经验共享:解决一个weblogic的jar包冲突问题

浏览 43275 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-27  
j2ee应用是在tomcat环境下开发和测试的,没问题,移植到WebLogic Server( 版本: 10.3.5.0)之下,大部分功能都正常,就是附件同步有问题
,报找不到 org.apache.commons.net.XXX.yyy(),但是此文件明明在 WEB-INF/lib 下面,以为是部署缓存问题,删除了部署,部署了又删除,还是搞不定,郁闷的一米。

后来一想,可能是jar包冲突问题,于是单独把jar包拷贝到weblogic的domain下/app/weblogic/Oracle/Middleware/user_projects/domains/jjjc_domain/lib下,重启weblogic后,他会自动把jar加载到classpath里,

<2011-10-27 下午08时15分29秒 GMT+08:00> <Notice> <WebLogicServer> <BEA-000395> <Following extensions directory contents added to the end of the classpath:
/app/weblogic/Oracle/Middleware/user_projects/domains/jjjc_domain/lib/commons-net-3.0.1.jar>

再试,还是不管用。再想,可能不是和domain的包冲突,可能就是和weblogic的全局包冲突,于是find

[weblogic@jjjc1 ~]$ cd Oracle/Middleware/
[weblogic@jjjc1 Middleware]$ find . -name *net*.jar

在众多的结果里挑选了一下,确定目标就是
./modules/com.bea.core.apache.commons.net_1.0.0.0_1-4-1.jar

调包前备份老jar,以免宕机
[weblogic@jjjc1 Middleware]$ mv ./modules/com.bea.core.apache.commons.net_1.0.0.0_1-4-1.jar  .
[weblogic@jjjc1 Middleware]$ mv ./user_projects/domains/jjjc_domain/lib/commons-net-3.0.1.jar ./modules/

重启weblogic,重新部署app,一切如想象中的OK。

记得五六年前,折腾websphere6的时候,也遇到过类似的问题,看来经验还是值钱的。

题外话:commons-net包,最新的都3.0版本了,为啥weblogic还在用1.0的包,咋不与时俱进呢????
   发表时间:2011-10-28  
29人已阅读,没人回帖,不厚道啊
0 请登录后投票
   发表时间:2011-10-28  
解决JarHell,试试JIOPi吧,远比OSGi轻量级的JarHell解决方案
0 请登录后投票
   发表时间:2011-10-28  
longware 写道
29人已阅读,没人回帖,不厚道啊


weblogic和websphere这样的商用服务器应该自行修改服务器启动脚本指定相应的JAVA_HOME和CLASSPATH。所以你的问题是你自己没有进行最佳实践造成的。
0 请登录后投票
   发表时间:2011-10-28  
downpour 写道
longware 写道
29人已阅读,没人回帖,不厚道啊


weblogic和websphere这样的商用服务器应该自行修改服务器启动脚本指定相应的JAVA_HOME和CLASSPATH。所以你的问题是你自己没有进行最佳实践造成的。


谢谢提醒,又多一个方法,一般只改启动脚本的JAVA_OPTIONS和USER_MEM_ARGS,很少去改CLASSPATH。

即使改了CLASSPATH,也有可能会出现和系统自带的CLASSPATH冲突的jar包的。
0 请登录后投票
   发表时间:2011-10-29  
longware 写道

谢谢提醒,又多一个方法,一般只改启动脚本的JAVA_OPTIONS和USER_MEM_ARGS,很少去改CLASSPATH。

即使改了CLASSPATH,也有可能会出现和系统自带的CLASSPATH冲突的jar包的。


你都自己设置CLASSPATH了,还会出现JAR冲突?看来你对Java中最基本的Library加载机制都不了解。基础知识啊!!!

downpour 写道

安装完JDK后,需要正确配置Java运行时必须的环境变量值,它们是:JAVA_HOME、CLASSPATH和PATH。无论是什么操作系统,都能够支持多个JDK版本的共存,读者可以根据应用程序的实际需求对不同的JDK版本进行管理。

正确管理JDK版本的方式,是在JVM运行时指定JDK版本对应的环境变量。为了方便起见,我们往往为操作系统本身指定一个系统级别的环境变量。

Java语言对于运行环境的管理比较宽松,在一个操作系统中可以同时运行多个Java程序的进程,每个Java进程所依赖的JRE版本也可以各不相同。当某一个Java进程启动时,操作系统会依次按照Java启动进程的当前目录、当前目录的父目录、PATH值中所指定的目录进行JRE寻址,找到第一个返回的JRE版本并运行。因此,一个简单而有效的指定JRE寻址的方式是在启动Java进程的脚本中通过指定当前运行程序的PATH值来定制特定版本的JRE的执行环境,从而达到对不同版本的JRE进行管理的目的。

JRE管理和CLASSPATH的加载顺序问题是Java开发中最为基本的问题,它牵涉到的是一个Java程序所依赖的最为基本的底层环境的配置。尤其是当一个应用程序运行在一个高级的商业应用服务器如Websphere或Weblogic之上时,我们应该密切关注程序的JRE运行参数和版本以及CLASSPATH的加载顺序(先加载优先原则),因为这些商业应用服务器往往有自定义的JRE管理机制和CLASSPATH的加载方式,而这两大内容,也将直接决定Web应用的运行特征。


所以,Weblogic和Websphere的启动脚本中所指定的CLASSPATH顺序决定了JAR包的加载次序。如果你要优先加载你应用程序中的JAR包,你不得不重新编写CLASSPATH,把应用程序中的JAR包写到Weblogic默认的JAR包之前以获得更大的优先级。
0 请登录后投票
   发表时间:2011-10-29  


downpour 写道



所以,Weblogic和Websphere的启动脚本中所指定的CLASSPATH顺序决定了JAR包的加载次序。如果你要优先加载你应用程序中的JAR包,你不得不重新编写CLASSPATH,把应用程序中的JAR包写到Weblogic默认的JAR包之前以获得更大的优先级。



谢谢downpour,理解又加深了!
0 请登录后投票
   发表时间:2011-10-30  
Weblogic上没有地方指定类装载顺序?Websphere上有的,可以自己设置先加载项目中的类定义
0 请登录后投票
   发表时间:2011-10-30  
估计我同学的那个问题就是它~~~~~~~~~~~~~~~~~
0 请登录后投票
   发表时间:2011-10-31  
在应用的weblogic.xml里设置prefer-web-inf-classes为true就可以指定应用的包优先了。
或者weblogic 9以后的ear包可以在weblogic-application.xml用prefer-application-packages指定具体哪些包优先。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics