我收到错误:
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 的类加载器冲突.jar根据以下链接加载文件组件:https://community.jboss.org/thread/81246?tstart=0
将一个简单的 Portlet 部署到 Liferay - ClassCastException
那么问题来了:我需要 Portlet.jar 来构建我的战争,但我的战争不能包含 Portlet.jar,因为这样就会发生类加载器冲突。我不能从 tomcat 中删除 portlet.jar,因为其他 portlet 需要它。
那么我该如何解决这个问题呢?
那么问题来了:我需要Portlet.jar来构建我的战争,但我的战争必须 不包含 Portlet.jar,因为这样就会发生类装入器冲突。我 不能从 Tomcat 中删除 Portlet.jar,因为它需要其他 组件。
正确,如果这些类由应用程序服务器提供,则不应在 WAR 中包含这些类。
如果您使用的是 Maven,请将您对 Portlet API 的依赖关系标记为 <scope>provided</scope>
。 当您的 WAR 建成时,它将可用,但不会包含在 WAR 中。 如果您不使用Maven,RTFM了解如何使用构建工具实现类似的功能。
解决方法是"重命名"jar 内的类。别担心,这并不难。这实际上很容易。但是你需要大约 15 到 45 分钟来学习。
您需要的工具称为JarJarLinks。它将复制您的罐子,但重命名所有冲突的名称。这里解释有点太多了,但这里有一个简单的例子。
提示:如果您不确定冲突到底是什么,还有另一个很棒的工具可以为您制作一份很好的依赖关系报告。它被称为Tattletale。