Java 在WebLogic中运行时,ClassNotFoundException(HqlToken)

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(

我有一个.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(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=