由于在WebSphere 8.5.5应用程序容器中升级到hibernate 4.2.8而导致的ClassCastExceptions

时间:2014-01-03 16:32:44

标签: java hibernate websphere classloader javassist

我们最近将hibernate从4.0.1升级到4.2.8.Final

Hibernate.4.2.8.Final取决于javassist-3.18.1-GA。不幸的是,websphere 8.5.5并没有附带最新的javassist,但它不是我的问题。我试图强制websphere采取我的javassist jar,但我失败了(由于某种原因,它总是从${WAS_INSTALL_ROOT}/plugins加载)。

我尝试了什么?

  • 在websphere控制台和WEB-INF / lib中首先加载本地类加载器(父级最后一个)的类包含最新的javassist jar。但申请不起作用
  • 将最新的javassit jar放入${WAS_INSTALL_ROOT}/lib/ext但不使用
  • 添加了共享库并在应用程序中引用但没有运气。
  • 如果我在${WAS_INSTALL_ROOT}/plugins中替换javassist.jar,那么应用程序就开始工作了,但这不是一个好的解决方案,因为其他Web应用程序可能依赖于旧的javassist

我的问题

如何在Websphere 8.5.5中使用(或注入或引用)最新的javassist jar?

#blog让我很快就能解决问题。

7 个答案:

答案 0 :(得分:2)

你把父母放在哪里,在控制台的哪个窗口?

因为控制台中有两个位置将父级放在最后,一个位于应用程序级别,另一个位于WAR级别,这是您要选择的位置。

将“每个WAR文件的类加载器”放入应用程序中,我相信从您选择该选项的屏幕内部,单击WAR并将WAR级别的类加载器策略设置为父级最后一个:

我认为路径是这样的(现在没有控制台):

申请 - >企业应用 - > application_instance - >网络模块 - > Web Module_instance

查看this,看看有两个地方可以设置类加载器策略,如果您找到了设置并且是否有效,请告诉我,否则会抛出新错误。

有时当我们切换设置时,我们会发现新的错误,因为其他的jar从服务器读取而不是WAR,例如bean验证错误等。如果你得到一个不同的错误,非javassist相关,可能是由于你总是可以在一个新问题上发帖。

答案 1 :(得分:2)

这可以通过将新版本的javaassist添加为共享库来解决。详细信息如下所述 [http://www-01.ibm.com/support/docview.wss?uid=swg27006159#usingserver][1]

应该针对在服务器配置中定义的新类加载器分配共享库。此类加载器的类加载策略应为PARENT_LAST

答案 2 :(得分:0)

将WAR类加载器策略更改为模块。

答案 3 :(得分:0)

问题的解决方案是PARENT_LAST,但我在应用程序设置页面(应用程序 - >应用程序类型 - > WebSphere企业应用程序 - > * application_name * - >类加载和更新检测)中进行了更改。

不幸的是,这不是放置PARENT_LAST选项的正确位置。因为我的应用程序是web模块(准确的war文件;))我会在{Applications - > Application Types - > WebSphere enterprise applications - > * Application_Name * - > Manage Modules中添加PARENT_LAST选项 - > 模块名称 - >类加载器顺序)。在我看到 jhadesdev 评论并特别是the link之前,我不知道这个选项。

@jhadesdev再次感谢。我总结了所有内容HERE

答案 4 :(得分:0)

当你的应用程序结构相当简单时,我认为使用war(孤立/父级最后一个类加载器)的实验可能会成功。在我的情况下,我们以完整的耳朵形式打包并且我们使用瘦小的战争 - 意味着实际的模块包含jpa / hibernate实体是一个完整的ejb-jar并且包装在耳朵顶层。我不确定如果这个模块(不是websphere专家)我可以轻松地使用类加载器

我的第二个问题是理想情况下,我希望在打包期间执行所有这些异乎寻常的类加载器策略设置,而不是在部署管理操作之后(意味着管理员在Websphere的面板中执行某些操作)。这种基于文件的方式存在,但它太复杂和丑陋的iMho,我责怪Websphere。

答案 5 :(得分:0)

这里有一个关于如何在WAS中更新javassist的小指南。这是使用WAS 8.0.0.1测试的。 WAS_HOME / plugins中的javassist.jar必须由来自http://search.maven.org/remotecontent?filepath=org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar的jar替换 保留旧的备份。 在Windows机器上调用WAS_HOME / profiles / PROFILE_NAME / bin / osgiCfgInit.sh,然后调用WAS_HOME / profiles / PROFILE_NAME / bin / clearClassCache.sh或* .bat文件。

感谢这篇文章,我发现了如何做到这一点:http://ramirezag.wordpress.com/2014/02/27/hibernate-4-2-8-and-websphere-8-5-5-1-issues/

答案 6 :(得分:0)

我们正在使用WAS 8.5.5和Hibernate 4.3.5,并且遇到了同样的问题。 将Java Assist添加为共享库确实对我们有用。

请注意,必须使用隔离的类加载器

创建共享库