Как использовать OSGI Embed-Dependency для обычных сторонних JAR-ов - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть система 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

Содержание:

enter image description here Из того, что я вижу, это именно то, что мне было нужно, по крайней мере, этоВот как я это изобразил.

В своем портлете-потребителе я добавил в манифест следующее:

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>

Класс найден, но я закончил сэто:

enter image description here

Так что, по сути, у меня есть класс два раза, один раз в JAR и один раз сглаживается, хотя это вроде как начинает работать.

Есть несколько причин, по которым мне не нравится этот подход:

  1. Я бы предпочел использовать структурированные банки, потому что я считаю, что это чище
  2. Большинство этих файлов содержат файлы конфигурации, которыеможет перекрываться, если я все расплющу
  3. Должен быть способ правильно использовать встроенные банки, так как в противном случае эта функция не существовала бы

Может кто-нибудь помочь, как это правильно использоватьэти встроенные банки в 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 не обрабатываются или что-то подобное.Есть идеи?

1 Ответ

0 голосов
/ 25 сентября 2018

вы можете использовать <_exportcontents> инструкцию для экспорта контента без дублирования, подробнее об этом здесь

Я хотел бы отметить, что создание толстых банок противоречит самой идее OSGiКроме того, это будет кошмаром для поддержания, когда ваш код развивается.

В идеале вы хотели бы иметь отдельный пакет для каждой зависимости.Они должны быть развернуты и обслуживаться отдельно.

...