WebSphere门户的portlet中的两个具有相同名称的类

时间:2014-03-20 11:03:14

标签: java classloader conflict

我正在开发一个portlet项目,并遇到了一个问题,即在不同的.jar文件中有两个具有相同名称(包括包)的类。我有com.ibm.ws.webcontainer.jar作为默认的WebSphere库和jsf-impl.jar,这是一些JSF功能所必需的 当PortletFacesContextFactoryImpl类(另一个JSF类)尝试访问com.sun.faces.util.Util.parameterNonNull(Object arg)方法并获得NoSuchMethodError时,问题就出现了。
我尝试将classloader策略设置为PARENT_LAST,这没有任何帮助。我无法从服务器中删除com.ibm.ws.webcontainer.jar,但当我尝试在我的代码中使用Util类时,唯一的选择是来自它的类,而不是来自jsf-impl.jarjsf-impl.jar包含在Java Build Path中。

如何解决这个问题,因为我无法改变PortletFacesContextFactoryImpl来源并使用错误的类移动.jar?

2 个答案:

答案 0 :(得分:1)

Parent Last应该是您的解决方案。 WebSphere Portal默认使用Parent Last部署portlet应用程序,但在WebSphere Application Server集成解决方案控制台(管理控制台)上仔细检查它并不会有什么坏处。

但是,它还取决于您的portlet应用程序设置。我认为这是com.sun.faces.util.Util令你烦恼的事。在我的系统上,此类位于jsf-impl.jar和Application Server Web容器中。为了使其工作,需要将jsf-impl.jar放在portlet应用程序的WEB-INF/lib目录中。要验证这一点,请使用WAS的类加载器视图:管理控制台>疑难解答>类加载器查看器> WebSphere_Portal>应用程序,然后是您的portlet应用程序。它必须从PA开始。切换到表格视图并搜索该课程。

您还提到了 Java Build Path 。这是另一个主题,取决于您的IDE - 假设是Eclipse。检查 Order and Export 选项卡,jsf-impl.jar应放在顶部,以便它取代服务器运行时类路径条目。

答案 1 :(得分:0)

PARENT_LAST类路径设置将对您有所帮助。但是,要完成此设置,您的portlet muste将打包为EAR。如果将portlet打包为war并手动配置类路径设置,则每次部署portlet时都会删除它们。