我正在开发一个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.jar
。 jsf-impl.jar
包含在Java Build Path中。
如何解决这个问题,因为我无法改变PortletFacesContextFactoryImpl
来源并使用错误的类移动.jar?
答案 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时都会删除它们。