weblogic 部署问题定位与解决

weblogic 部署问题定位与解决,第1张

weblogic 部署问题定位与解决

weblogic 做为商用中间件在(EJB、jndi 数据源、日志管理、内存管理、资源配置管理...)  是一些开源免费小型容器无法望其项背的。


weblogic 最早由 weblogic Inc. 开发,后并入 BEA  公司,最终 BEA 公司又并入 Oracle 公司。


weblogic 是用于开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java 应用服务器。


因此 weblogic 一般做为项目上线发布和部署的服务器,而本地研发时大多会选用 Tomcat/Jetty.... 小型容器。


这样难免会出现问题,本地运行良好的 web 程序,部署在 weblogic 时会出现这样或那样的问题。


绝大一部分问题都是因为 weblogic 依赖的 jar 与项目中的 jar 冲突(相同 jar 不同版本)或 weblogic 不支持项目 jar 所导致的。


当部署 weblogic 出现问题时(自己总结三板斧):

1. 确认公司使用的 weblogic 版本并翻阅官网对应 weblogic 版本所支持的标准;

2. 对照 weblogic 出错日志确定冲突 jar 或确定该 webloigc 不支持的 jar;

3. 对于出现冲突的 jar 在项目 WEB-INFO 目录下添加 weblogic.xml 配置文件,其中申明要预先加载的项目 jar;

4. 对于出现该 webloigc 版本不支持的 jar,升级 weblogic 版本,或降低项目使用的 jar 版本。


1. 确定 weblogic 版本并查看相应支持的标准

知已知彼才能百战不殆,因 weblogic 小版本较多且版本之间差异较大。


查看 weblogic 版本有很多方法,最直接方式是询问安装 weblogic 的同事,或者登录到 linux 像下面这样。


获悉部署的版本后,去瞅瞅 oracle weblogic 官网,那里的文档资料是最全面也是最权威的。


http://www.oracle.com/technetwork/middleware/weblogic/documentation/index.html

找到对应版本点 view Library 跳转进去,里面是整个版本的概览,咱们的关注点应该是该  weblogic 版本支持的标准。


里面有详细的该 weblogic 支持的 java、web Service、一些杂七杂八的标准,比如 JDK、EL、Servlet、JAX-RS、JAX-WS....

2. 定位问题

有了上述具体的支持标准,配合部署报错的具体类和方法,就可以对症下药。


下面列举部署 weblogic 时常见的几个报错异常(还有很多遇到在补充):

01) java.lang.UnsupportedClassVersionError:  Unsupported major.minor version 51.0

weblogic Jdk 版本与项目 jdk 版本不一致

02) request.getRealPath() 为 null

servlet-api.jar 本地和 weblogic 有差异,使用类加载 Thread.currentThread().getContextClassLoader() 获取相对路径;

(classpath 下找不到 .doc 和 .exe ?可以读取配置文件?)将资源放置到 WEB-INF 下;

03) ClassNotFoundException:org.hibernate.hql.ast.HqlToken

weblogic 已依赖较早版本的 antlr.jar

04) 统一配置 tomcat 和 weblogic 上的数据源

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/user" />

05) java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory

移除项目 xml-apis.jar 或 jaxp-api.jar

06)weblogic NoClassDefFoundError: Could not initialize class sun.awt.X11Graphi

修改 startWebLogic.sh export JAVA_OPTIONS=-Djava.awt.headless=true

07)weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB cannot be cast to oracle.sql.CLOB

使用 weblogic JNDI 数据源读取 clob 字段时出现的强转错误:http://blog.csdn.net/arvinrong/article/details/22732219

08) java.lang.NoSuchMethodError: com.google.common.collect.Lists.reverse(Ljava/util/List;)Ljava/util/List

weblogic 依赖的 guava 版本较低(包含14.0.1 及以下)

09)WebLogic下使用 URL.openConnection 获取连接返回 SOAPHttpsURLConnection 而不是 HttpsURLConnection

在实例化 URL 对象是指定JDK Handler new URL(null, urlStr, new sun.net.www.protocol.http.Handler.Handler())

10)java.lang.LinkageError: loader constraint violation: when resolving method'XXXXX(XXXX)V'

weblogic 类加载器和 JVM 类加载器加载了不同 Jar 的相同类导致冲突(删除XXX所在jar):http://www.lxway.com/981865964.htm

11)java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider

weblogic 依赖的 hibernate-validator 版本较低(包含 4.3.2.Final 及以下)

12)java.lang.AbstractMethodError: org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;

升级 hibernate-validator 版本

13)java.lang.RuntimeException: Invalid schema document passed to AbstractDataBinding.addSchemaDocument, not in W3C schema namespace: schema

com.sun.xml.bind.jaxb-impl 与 weblogic JDK jar 冲突,排除该 jar

14)weblogic 解析 web.xml 时不支持通配符,类似于这种:spring-mvc*.xml

3. 解决方法

解决此类问题的方式大体有三种,遇到部署问题时也可以自己都实践一下。


a. 删除 weblogic 下冲突 jar 文件夹:

(1)删除 /bea/weblogic12.1.3/server/lib/weblogic.jar中的冲突的文件夹;

(2)copy 冲突的 XXX.ja r到 /bea/weblogic12.1.3/server/lib, 重启weblogic。


b.  通过修改启动脚本来优先加载某些 jar

(1)将冲突的 jar 包拷贝到 ${DOMAIN_HOME}/lib 目录下。


(2)${DOMAIN_HOME}/bin 下找到 startWeblogic.sh 文件用文本编辑器将其打开,并在里面加入如下内容:

export first_classpath=${DOMAIN_HOME}/lib/xxxx.jar
SAVE_CLASSPATH="${first_classpath}:${CLASSPATH}"

c. 在应用中通过 weblogic .xml 的配置,优先加载应用的 jar

因 weblogic 版本不用,weblogic 的配置项会有差异,不要盲目从网上 copy。


官网版本描述(其他版本将1213换一下即可):http://docs.oracle.com/middleware/1213/wls/WBAPP/weblogic_xml.htm#WBAPP571

关注其中的 prefer-application-resources/prefer-application-packages(预先加载应用对应 jar ) 节点的配置:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<container-descriptor>
<prefer-web-inf-classes>false</prefer-web-inf-classes>
<prefer-application-packages>
<package-name>预先加载项目 lib 中的包名,支持通配符</package-name>
<package-name>com.sun.faces.*</package-name>
<package-name>com.bea.faces.*</package-name>
</prefer-application-packages>
</container-descriptor>
</weblogic-web-app>

解决方案 a/b/c 中, c 方案无异是最优解,做为生产环境的 weblogic 可能会部署多个应用,不太可能让你随便重启。


方案 a,b 会破坏 weblogic 的整体性,可能导致其他部署在 weblogic 上的应用出现问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/586929.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存