У меня есть система Liferay с несколькими портлетами.Большинство из этих портлетов имеют избыточные JAR-файлы, связанные с JSF, поэтому я хотел бы удалить избыточность и создать OSGI-пакет для часто используемых JAR-ов.
Идея состоит в том, что все мои портлетыбудет использовать этот общий пакет в качестве зависимости.
После некоторого прочтения я обнаружил нечто похожее в моем maven pom:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.4</version>
<extensions>true</extensions>
<configuration>
<remoteOBR>true</remoteOBR>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.name}</Bundle-Name>
<Bundle-Vendor>${project.organization.name}</Bundle-Vendor>
<Import-Package>
!sun.reflect,......,*
</Import-Package>
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
И я получил следующий пакет jar:
Мой манифест:
Manifest-Version: 1.0
Bundle-SymbolicName: my-common-bundle
Built-By: pjaloveczki
Bundle-ManifestVersion: 2
Bnd-LastModified: 1537882770915
Embed-Dependency: *;scope=compile|runtime
Import-Package: com.liferay.portal.kernel.exception,com.liferay.portal
.kernel.language,com.liferay.portal.kernel.model,......,org.w3c.dom.styleshe
ets,sun.misc
Tool: Bnd-1.15.0
Bundle-Name: my-common-bundle
Bundle-Version: 1.0.0
Bundle-ClassPath: .,sac-1.3.jar,...all..my..dependecies...,com.liferay.faces.bridge.api-4.1.0.jar
Ignore-Package: net.sf.cglib.proxy,..all..ignored..packages...javax.ejb
Embed-Transitive: true
Created-By: Apache Maven Bundle Plugin
Build-Jdk: 1.8.0_171
Содержание:
Из того, что я вижу, это именно то, что мне было нужно, по крайней мере, этоВот как я это изобразил.
В своем портлете-потребителе я добавил в манифест следующее:
Require-Bundle: my-common-bundle;bundle-version="1.0.0"
Я подумал, что что-то вроде этого должно работать, однако я явно ошибаюсь, как при попыткедля развертывания моего портлета один из классов не найден в общем пакете:
java.lang.ClassNotFoundException: org.richfaces.webapp.ResourceServlet cannot be found by MyPortlet
С другой стороны, если я добавлю в свой общий пакет следующее:
<Export-Package>org.richfaces.webapp</Export-Package>
Класс найден, но я закончил сэто:
Так что, по сути, у меня есть класс два раза, один раз в JAR и один раз сглаживается, хотя это вроде как начинает работать.
Есть несколько причин, по которым мне не нравится этот подход:
- Я бы предпочел использовать структурированные банки, потому что я считаю, что это чище
- Большинство этих файлов содержат файлы конфигурации, которыеможет перекрываться, если я все расплющу
- Должен быть способ правильно использовать встроенные банки, так как в противном случае эта функция не существовала бы
Может кто-нибудь помочь, как это правильно использоватьэти встроенные банки в OSGI без необходимости их выравнивать?
Спасибо!Питер
РЕДАКТИРОВАТЬ:
Кажется, что классы развертываются нормально и решаются после того, как я добавил <_exportcontents>!org.apache.commons.logging,*</_exportcontents>
однако я получаюразличные типы ошибок, которые я не получаю, когда я помещаю свои JAR-файлы в мои портлеты.
Раньше я получал ClassNotFoundErrors и такие, теперь я получаю:
java.lang.NullPointerException
at javax.faces.CurrentThreadToServletContext.getFallbackFactory(CurrentThreadToServletContext.java:79)
at javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:551)
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:283)
at javax.faces.webapp.FacesServlet.init(FacesServlet.java:358)
java.lang.NullPointerException
at javax.portlet.faces.GenericFacesPortlet.getBridgeClassName(GenericFacesPortlet.java:193)
at javax.portlet.faces.GenericFacesPortlet.getBridge(GenericFacesPortlet.java:762)
at javax.portlet.faces.GenericFacesPortlet.init(GenericFacesPortlet.java:448)
at com.liferay.portlet.InvokerPortletImpl.init(InvokerPortletImpl.java:297)
Мне кажетсяклассы загружены, но манифесты JAR не обрабатываются или что-то подобное.Есть идеи?