Websphere 8.0.0.11
Hibernate 4.2.21.Final
我发现了很多关于同样问题的问题,但没有一个问题适合我。
如果我在Websphere中部署应用程序,它可以正常工作。
但是我们定义了一个包含所有第三方库(spring,hibernate,javassist等)的共享库,以便我们的WAR更薄。
这种方式在部署期间,我们将瘦WAR与Websphere共享库相关联。
关键是当我们以这种方式部署应用程序时,会抛出ClassCastException Hibernate exception _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy
。
我已经检查了websphere控制台中加载的jar,并且只能在类路径中看到一个javassist jar(3.18.1-GA)。
为什么会发生这种情况?
更新
我也尝试过使用PARENT_FIRST和PARENT_LAST类加载。
更新2
我刚刚发现Websphere正在加载自己的javassist jar:
URL location = ProxyFactory.class.getProtectionDomain().getCodeSource().getLocation();
logger.info("{}", location);
打印:file:/opt/IBM/WebSphere/AppServer/plugins/javassist.jar
答案 0 :(得分:1)
在尝试了我在S.O.上发现的几乎所有东西之后没有任何成功我决定将Hibernate降级到版本4.1.12.Final 。这是与Websphere 8.x兼容的最大4.x版本。
答案 1 :(得分:0)
问题是Javassist在其生成的代码中留下了痕迹。对于类路径上的Javassist两次,它的类被加载两次。但是,如果它们具有相同的名称,则两种类型只相同和由同一个类加载器加载。在您的情况下,生成的类将其Javassist依赖项解析为由应用程序类加载器加载的类型,同时您的代码将实例强制转换为由Websphere类加载器(或其他方式)加载的Javassist类型。 / p>
您是否在应用程序之间共享任何Hibernate依赖项?尽量不要在应用程序中使用任何与Hibernate相关的共享库来避免这种情况。