Java 在WebLogic中运行时,ClassNotFoundException(HqlToken)
我有一个.war文件,用于在Jetty中正常运行的应用程序 我试图将应用程序移植到WebLogic中运行,但在启动时,我遇到以下异常:Java 在WebLogic中运行时,ClassNotFoundException(HqlToken),java,hibernate,orm,weblogic,Java,Hibernate,Orm,Weblogic,我有一个.war文件,用于在Jetty中正常运行的应用程序 我试图将应用程序移植到WebLogic中运行,但在启动时,我遇到以下异常: ERROR:Foo - Error in named query: findBar org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [from Bar] at org.hibernate.hql.ast.HqlLexer.panic(
ERROR:Foo - Error in named query: findBar
org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [from Bar]
at org.hibernate.hql.ast.HqlLexer.panic(HqlLexer.java:80)
at antlr.CharScanner.setTokenObjectClass(CharScanner.java:340)
at org.hibernate.hql.ast.HqlLexer.setTokenObjectClass(HqlLexer.java:54)
at antlr.CharScanner.<init>(CharScanner.java:51)
at antlr.CharScanner.<init>(CharScanner.java:60)
at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:56)
at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:53)
at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:50)
...
ERROR:Foo-命名查询中的错误:findBar
org.hibernate.QueryException:ClassNotFoundException:org.hibernate.hql.ast.HqlToken[来自工具栏]
位于org.hibernate.hql.ast.HqlLexer.panic(HqlLexer.java:80)
位于antlr.CharScanner.setTokenObjectClass(CharScanner.java:340)
位于org.hibernate.hql.ast.HqlLexer.setTokenObjectClass(HqlLexer.java:54)
在antlr.CharScanner.(CharScanner.java:51)
在antlr.CharScanner.(CharScanner.java:60)
位于org.hibernate.hql.antlr.HqlBaseLexer。(HqlBaseLexer.java:56)
位于org.hibernate.hql.antlr.HqlBaseLexer。(HqlBaseLexer.java:53)
位于org.hibernate.hql.antlr.HqlBaseLexer.(HqlBaseLexer.java:50)
...
解决这个问题的最好方法是什么
我使用的是Hibernate 3.3.1.GA和WebLogic 10.3.2.0。WebLogic有自己的ANTLR版本,这会导致您面临的问题。使用web应用程序解决此问题的一种方法是将
weblogic.xml
中的首选web inf类
元素设置为true
<weblogic-web-app>
....
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
....
</weblogic-web-app>
....
真的
....
weblogic.xml
进入WEB-INF
如果您有像我这样的EAR项目,那么您需要将此元素添加到weblogic EAR部署描述符[weblogic application.xml]
<wls:prefer-application-packages>
<wls:package-name>antlr.*</wls:package-name>
</wls:prefer-application-packages>
antlr*
我有一个EAR,所以我必须添加一个文件META-INF/weblogic-application.xml
该文件本身非常简单,适用于Oracle WebLogic 11g,也称WebLogic Server 10.3.x:
antlr*
我想在weblogic 11g(weblogic Server 10.3.5)上部署WAR文件。通常,在web应用程序中,将有web.xml。为了让Weblogic获取web.xml中提到的类,我们需要在web-INF/Weblogic.xml中包含一个文件。下面是代码
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<context-root>ProjectName</context-root>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
项目名称
真的
这为我解决了这个问题,我能够在weblogic上部署这场战争。请从weblogic控制台启用web存档选项。我认为
战争的最佳解决方案是:
创建文件webapp\WEB-INF\weblogic.xml
,并放入文本
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>false</prefer-web-inf-classes>
<prefer-application-packages>
<package-name>antlr.*</package-name>
</prefer-application-packages>
</container-descriptor>
</weblogic-web-app>
假的
antlr*
对于那些尝试上述方法在weblogic application.xml
描述符中将antlr
名称空间声明为“首选应用程序包”并且仍然存在相同问题的人,您可以尝试直接用项目的库覆盖开始脚本中weblogic域的类路径:
为此,请执行以下步骤:
1.)在Weblogic域主页中找到文件bin/startweblog。[sh | cmd]
2.)找到写有set SAVE\u CLASSPATH=
3.)替换为此(在windows上,相应地适应mac/*nix)
4.)保存,(重新)启动您的weblogic域并祈祷
注:如果您的域中有多个已部署的人工制品,那么这可能不是一个好主意。此外,在某些情况下,可能只能从WEB-INF/lib文件夹中选择相关的jar文件。当然,如果您使用maven,您将需要在其他地方托管这些库
此解决方案还适用于从eclipse服务器视图中启动的Weblogic服务器,因为Oracle Weblogic适配器使用命令行脚本启动服务器。+1。。我只是想知道为什么“true”不是设置的默认值?@Bozho不确定javaee规范是怎么说的,但在我看来,父级优先策略似乎是合乎逻辑的。这就解决了这个问题。它导致了一个单独的ClassCastException,按照本文中的建议进行修复:酷!它解决了我的问题。我也认为这是最好的解决办法。将
设置为true,使用weblogic可以获得大量重复lib的错误。例如“java.lang.LinkageError…XPath具有不同的类对象”
set CLASSPATH=C:\SomeProject\WebContent\WEB-INF\lib\*;%SAVE_CLASSPATH%
rem set CLASSPATH=%SAVE_CLASSPATH%
set SAVE_CLASSPATH=