portlet.jar上的类加载器冲突

时间:2014-01-15 15:50:12

标签: java maven tomcat portlet

我收到错误:

Caused by: java.lang.ClassCastException: com.xxx.JbossBirtPortlet cannot be cast to  javax.portlet.Portlet
   at org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.start(PortletContainerImpl.java:254)

错误是由于tomcat和我的portlet的类加载器冲突,根据这些链接加载文件portlet.jar: https://community.jboss.org/thread/81246?tstart=0

Deploying a simple Portlet to Liferay - ClassCastException

然后问题: 我需要portlet.jar来构建我的战争,但我的战争不能包含portlet.jar,因为这会产生一个ClassLoader冲突。我无法从tomcat中删除portlet.jar,因为它需要其他portlet。

那么我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

然后问题:我需要portlet.jar来建立我的战争,但我的战争必须   不包含portlet.jar,因为这会产生ClassLoader冲突.I   无法从tomcat中删除portlet.jar,因为它需要其他   的portlet。

正确,如果应用程序服务器提供这些类,则不应在WAR中包含这些类。

如果您正在使用Maven,请将您对portlet API的依赖关系标记为<scope>provided</scope>。它在构建WAR时可用,但不会包含在WAR中。如果你没有使用Maven,RTFM来了解如何使用你的构建工具实现类似的功能。

答案 1 :(得分:0)

解决方案是“重命名”jar中的类。别担心,这不是那么难。这实际上非常简单。但这需要大约15到45分钟的学习时间。

您需要的工具称为JarJarLinks。它会复制你的jar,但所有冲突的名字都会被重命名。这里解释的有点太多,但here是一个简单的例子。

提示:如果您不确定冲突究竟是什么,那么还有另一个很棒的工具可以为您提供一个很好的依赖报告。它被称为Tattletale