Portlet.jar 上的类装入器冲突



我收到错误:

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。

最新更新