🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
《C语言》 | 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 | 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 | 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 | 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 | 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 | 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
🔧 解决方案详解
方案一:调整 Weblogic 类加载器优先级(推荐)
方案二:修改 Weblogic 服务器启动参数
方案三:修改 Hibernate 查询翻译器(临时方案)
💎 总结与建议
在 Weblogic 10 上部署使用 Hibernate 3 的项目时,经典的ClassNotFoundException: org.hibernate.hql.ast.HqlToken错误确实令人困扰。其根源在于Weblogic 服务器自身已经包含了特定版本的antlr库,这与 Hibernate 3 运行时所依赖的antlr库发生了冲突,导致服务器无法正确加载你项目中的 Hibernate 相关类 。
别担心,这个问题有清晰成熟的解决路径。下图帮你快速了解如何根据你的情况选择最合适的方案:
flowchart TD A[遭遇Hibernate3与<br>Weblogic 10冲突] --> B{如何选择解决方案?} B -- 拥有项目完整控制权<br>希望一劳永逸 --> C[方案一:调整类加载优先级<br>(推荐)] B -- 仅有服务器配置权限<br>或需全局修复 --> D[方案二:修改服务器Classpath] B -- 临时解决或无法修改<br>服务器配置 --> E[方案三:更换Hibernate查询翻译器] C --> F[在项目的weblogic.xml中<br>配置优先加载应用内库] D --> G[修改启动脚本<br>预设加载路径] E --> H[在Hibernate配置文件中<br>指定旧版翻译器] F & G --> I[✅ 从根本上解决冲突<br>(可正常使用Hibernate3所有功能)] H --> J[⚠️ 临时解决或部分功能受限<br>(如批量更新可能失效)]下面详细解释这三种主流的解决方案。
🔧 解决方案详解
方案一:调整 Weblogic 类加载器优先级(推荐)
这是最彻底、最常用的解决方案。它的原理是修改 Weblogic 的类加载顺序,让它优先加载你 Web 应用程序WEB-INF/lib目录下的 JAR 包(即 Hibernate 3 自带的antlr),而不是使用服务器本身的库。
创建或修改配置文件:在你的项目
WEB-INF目录下,找到或创建weblogic.xml文件。配置类加载顺序:在文件中添加以下配置,将
<prefer-web-inf-classes>设置为true。<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"> <container-descriptor> <!-- 关键配置:让Web应用自身的JAR包优先于Weblogic的JAR包加载 --> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor> </weblogic-web-app>重新部署应用:将修改后的应用重新打包并部署到 Weblogic 服务器。
优点:一劳永逸,从根本上解决冲突,且不影响服务器上的其他应用。
注意:如果你的应用还使用了像 Apache CXF 这样的其他框架,此设置可能会引起类似javax/xml/namespace/QName的类冲突。如果出现此问题,可以采用更精细的配置,只针对冲突的包进行设置 :
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"> <container-descriptor> <prefer-web-inf-classes>false</prefer-web-inf-classes> <!-- 精细控制:只优先加载antlr相关的包 --> <prefer-application-packages> <package-name>antlr.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic-web-app>方案二:修改 Weblogic 服务器启动参数
此方法通过修改 Weblogic 域的启动脚本,在服务器启动时最优先加载你指定的、与 Hibernate 3 兼容的antlrJAR 包。
放置JAR包:将你项目中的
antlr-2.x.x.jar(例如antlr-2.7.6rc1.jar)复制到 Weblogic 服务器的server/lib目录下 。修改启动脚本:找到你的 Weblogic 域目录下的
bin/startWebLogic.cmd(Windows)或bin/startWebLogic.sh(Linux)文件。设置预加载路径:在脚本中设置
CLASSPATH的环境变量附近,添加以下语句(请确保JAR包路径和文件名正确):在
set CLASSPATH...这一行之前添加:set PRE_CLASSPATH=%DOMAIN_HOME%\lib\antlr-2.7.6rc1.jar在
set CLASSPATH...这一行之后添加:set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%
重启服务器:重启 Weblogic 服务器使配置生效。
优点:在服务器级别解决问题,部署应用时无需做任何修改。
缺点:会影响到整个服务器上的所有应用,且如果服务器重启脚本被覆盖,配置会失效。
方案三:修改 Hibernate 查询翻译器(临时方案)
如果以上方法都因环境限制无法实现,可以尝试修改 Hibernate 配置,回退到旧版的查询翻译器。
在你的 Hibernate 配置文件(通常是hibernate.cfg.xml或spring的配置中)添加以下属性 :
<!-- 使用Hibernate2的经典查询翻译器 --> <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>重要提醒:这是一个妥协方案。使用ClassicQueryTranslatorFactory可能导致 Hibernate 3 的某些高级 HQL 功能(特别是批量更新和删除语句)无法正常使用 。请确保你的业务逻辑不受影响。
💎 总结与建议
对于这个问题,我推荐的解决顺序是:
首选方案一:通过配置
weblogic.xml来调整类加载优先级。这是最规范、影响范围最小的做法。次选方案二:如果你对服务器有完全控制权,并且希望做一个全局修复,可以采用此方案。
最后考虑方案三:仅作为临时解决方案或在上述方法均不适用时使用。
希望这些详细的步骤能帮助你顺利解决问题!
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙