weblogic报java.lang.ClassCastException之解决

本文介绍了在WebLogic中管理多个Domain时遇到的权限问题及解决方案。特别关注如何避免使用root用户启动导致的后续问题,以及如何通过正确的权限设置确保不同Domain间的独立运行。
大多数情况下,我们会对weblogic的domain新建立一个用户,从而用该用户来管理domain,避免多个domain之间出现加载jvm,加载jar包,加载war,加载so文件等死锁或者重复加载异常。

我们现在weblogic922上就建立了两个domain,用weblogic922_1,weblogic922_2去管理,并将
/usr/local/bea2/user_projects/domains/base_domain1
/usr/local/bea2/user_projects/domains/base_domain2

的权限分别设置为weblogic922_1与weblogic922_2所属,该命令如下:

chown -R weblogic922_1:root ./base_domain1
chown -R weblogic922_2:root ./base_domain2

如果在启动weblogic的时候忘记切换用户用root启动一次后,再次用weblogic922_x启动,就会出现如下错误:

<Aug 7, 2008 3:19:24 PM CST> <Critical> <EmbeddedLDAP> <BEA-171522> <An error occurred while initializing the Embedded LDAP Server. The exception thown is java.lang.ClassCastException: com.octetstring.vde.backend.BackendRoot. This may indicate a problem with the data files for the Embedded LDAP Server. If the problem is with the data files and it can not be corrected, backups of previous versions of the data files exist in ./servers/AdminServer/data/ldap/backup.>
<Aug 7, 2008 3:19:24 PM CST> <Critical> <WebLogicServer> <BEA-000362> <Server failed. Reason:

There are 1 nested errors:

java.lang.ClassCastException: com.octetstring.vde.backend.BackendRoot
at weblogic.ldap.EmbeddedLDAP.start(EmbeddedLDAP.java:273)
at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)

上面的错误原因主要是在用root用户启动weblogic的时候会在base_domain里产生root权限的文件,或者用root权限的文件覆盖了原来存在的weblogic922_x所属文件,当再次切换到weblogic922_x用户后,启动的时候就会出现权限问题,所以报告上面的错误。

解决办法:

在root用户下,执行:

chown -R weblogic922_1:root ./base_domain

再次切换到weblogic_922下启动就没有问题了。


[color=gray]如果您觉得本文对您有益,请点击博文后的google广告,对作者表示支持,谢谢![/color]
<think>好的,我现在需要解决用户在WebLogic启动时遇到的java.lang.ClassCastException异常,具体错误信息是org.apache.struts.action.ActionForward。用户还提供了四个引用内容,我需要结合这些信息来分析问题。 首先,用户的问题是关于WebLogic启动时出现的类转换异常,涉及Struts的ActionForward类。根据引用[1],用户提到了配置Struts的PrepareFilter和ExecuteFilter时出现的ClassNotFound错误,但当前问题不是找不到类,而是类转换异常,可能涉及不同类加载器加载了同一个类的问题。 接下来,引用[3]提到Struts的架构,说明Struts使用MVC模式,并包含Controller Servlet、Action对象等。这可能涉及到Struts的类在应用中的加载情况。 引用[4]中的ClassCastException属于运行时异常,通常发生在试图将对象强制转换为不是其实例的子类时。可能的原因包括不同类加载器加载了同一个类,导致JVM认为它们是不同的类实例。 结合WebLogic的特性,WebLogic使用自己的类加载器,并且默认情况下优先加载应用内的类,这可能导致不同模块(如应用和服务器)加载同一个类,从而引发类转换异常。例如,应用可能打包了Struts的库,而服务器也可能有相同库,导致两个不同的类加载器加载了同一个类,进而转换失败。 解决方案可能包括检查类路径冲突,确保Struts相关库的版本一致性,调整类加载策略,比如优先加载应用类或设置类加载顺序。另外,检查web.xml和weblogic.xml的配置,确保没有重复加载或错误配置。 还需要考虑用户提到的PrepareFilter和ExecuteFilter配置是否正确,是否有遗漏的依赖,如Catalina的类,但根据错误信息,用户的问题可能更多是类加载冲突而非缺失类。 最后,可能需要建议用户检查依赖冲突,使用工具如mvn dependency:tree分析依赖,排除重复的struts库,或者调整类加载策略为parent-last,让应用优先加载自己的类。</think>### WebLogicjava.lang.ClassCastException: ActionForward异常分析与解决方案 #### 问题原因分析 1. **类加载器冲突** WebLogic的类加载机制默认采用`parent-first`策略,即优先从父级类加载器(如服务器自身库)加载类。如果应用内包含与服务器库**相同类但版本不同**(例如不同版本的`struts-core.jar`),可能导致同一个类被不同类加载器加载,JVM会将其视为“不同类”,从而触发`ClassCastException`[^1][^3]。 2. **依赖库版本不一致** - 应用引用的Struts库版本与WebLogic内置库冲突。 - 依赖传递导致多个版本的Struts相关类混用(如`action`模块与`core`模块版本不兼容)。 3. **配置问题** - `web.xml`或`weblogic.xml`中类加载策略未正确配置。 - Struts过滤器链(如`StrutsPrepareFilter`)配置错误,引发类加载顺序异常[^1]。 --- #### 具体解决步骤 1. **检查依赖冲突** - 通过Maven/Gradle命令(如`mvn dependency:tree`)分析依赖树,确认是否存在多版本Struts库。 - 手动排除冲突依赖: ```xml <!-- Maven示例:排除冲突的struts-core --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.30</version> <exclusions> <exclusion> <groupId>org.apache.struts</groupId> <artifactId>struts-core</artifactId> </exclusion> </exclusions> </dependency> ``` 2. **调整WebLogic类加载策略** 在`WEB-INF/weblogic.xml`中设置为`parent-last`模式,使应用优先使用自身库: ```xml <container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor> ``` 3. **统一Struts库版本** - 确保所有Struts模块(如`struts-core`、`struts-taglib`)版本一致。 - 示例使用兼容性较好的版本: ```xml <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.30</version> </dependency> ``` 4. **清理WebLogic缓存** 重启前删除临时文件: ```bash rm -rf $DOMAIN_HOME/servers/${SERVER_NAME}/tmp/* rm -rf $DOMAIN_HOME/servers/${SERVER_NAME}/cache/* ``` --- #### 验证方案 1. 部署修复后的应用,观察启动日志是否仍有`ClassCastException`。 2. 使用JVM参数`-verbose:class`输出类加载信息,确认`ActionForward`类来源: ```bash # 在WebLogic启动脚本中添加 JAVA_OPTIONS="-verbose:class" ``` --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值