【问题标题】:Classloader conflict on portlet.jarportlet.jar 上的类加载器冲突
【发布时间】:2014-02-04 04:33:24
【问题描述】:

我得到错误:

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 的 Classloader 冲突,根据这些链接加载文件 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 需要它。

那么我该如何解决呢?

【问题讨论】:

    标签: java maven tomcat portlet


    【解决方案1】:

    然后问题是:我需要 portlet.jar 来构建我的战争,但我的战争必须 不包含 portlet.jar,因为这样会出现 ClassLoader 冲突。I 不能从tomcat中删除portlet.jar,因为其他需要 门户网站。

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

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

    【讨论】:

    • 我使用的是 Maven,它运行良好,感谢您的帮助!
    【解决方案2】:

    解决方案是“重命名” jar 中的类。别担心,这并不难。这实际上很容易。但这需要您大约 15 到 45 分钟的时间来学习。

    您需要的工具名为JarJarLinks。它将复制您的 jar,但重命名所有冲突的名称。这里解释的有点过头,不过here就是一个简单的例子。

    提示:如果您不确定冲突到底是什么,还有另一个很棒的工具可以为您生成一份很好的依赖关系报告。它叫做Tattletale

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 2015-03-26
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多