2014-01-15 4 views
0

я получаю ошибку:Загрузчик классов конфликта на 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) 

ошибка происходит из-за конфликта ClassLoader котом и мой портлет, который загружает файл portlet.jar по этим ссылкам: https://community.jboss.org/thread/81246?tstart=0

Deploying a simple Portlet to Liferay - ClassCastException

Тогда задача: мне нужно portlet.jar строить свою войну, но моя война не должна содержать portlet.jar, потому что тогда возникает ClassLoader conflict.I не может delete portlet.jar из tomcat, потому что это необходимо для других портлетов.

Так как я могу это решить?

ответ

2

Then the problem: I need portlet.jar to build my war but my war must not contain portlet.jar, because then arises a ClassLoader conflict.I can not delete portlet.jar from tomcat, because it is needed to other portlets.

Правильно, вы не должны включать эти классы в свою WAR, если они предоставляются сервером приложений.

Если вы используете Maven, отметьте свою зависимость от API портлета как <scope>provided</scope>. Он будет доступен, когда ваша ВОЙНА будет построена, но не будет включена в WAR. Если вы не используете Maven, RTFM о том, как добиться аналогичной функциональности с помощью инструмента построения.

+0

Я использую Maven, и он отлично работает, спасибо за помощь! –

0

Резолюция заключается в «переименовании» классов внутри банки. Не беспокойтесь, это не так сложно. На самом деле это довольно легко. Но вам потребуется около 15 - 45 минут.

Инструмент, который вам нужен, называется JarJarLinks. Он сделает копию вашей банки, но со всеми перепутанными именами. Здесь слишком много объяснять, но here - простой пример.

Подсказка: если вы не уверены в том, что конфликты в точности, есть еще один отличный инструмент, который сделает хороший отчет о зависимостях для вас. Это называется Tattletale.

Смежные вопросы