osgi: пакет импорта, который частично существует внутри пакета - PullRequest
0 голосов
/ 28 августа 2011

У меня есть пакет X.Y.Z, который существует в 2 комплектах A и B:

bundle A
 package X.Y.Z 
  class Class1

bundle B
 package X.Y.Z 
  class Class2

Пакет B экспортирует пакет X.Y.Z. Пакет A импортирует пакет X.Y.Z и получает исключение, что его собственный класс Class1 не найден. Должно ли это работать?

Я использую Glassfish 3.1 с Феликсом

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

Нет, это не должно работать.Если вы импортируете пакет XYZ, то этот импорт будет использоваться вместо внутреннего содержимого пакета.

В более общем случае, у вас есть проблема, известная как split package .Пакеты должны быть связными и экспортироваться одним пакетом, а не разбиваться на несколько пакетов.Вам следует провести рефакторинг содержимого вашего пакета, чтобы все классы, принадлежащие пакету XYZ, присутствовали в одном пакете.

0 голосов
/ 14 сентября 2011

Опять же, Ниль абсолютно прав.Но иногда производители по какой-либо причине имеют несколько файлов .jar, содержащих одни и те же пакеты.Иногда это делается, когда они хотят предоставить небольшие файлы .jar для незаметных реализаций своего продукта.Примером того, почему это может быть сделано, является наличие у них алгоритма обработки текста для документа EDI, который отличается от алгоритма обработки текста для документа XML.В этом примере они могут выбрать создание двух файлов .jar (версии 1 и 2), содержащих «badlyPlannedImplementation.util», содержащих различные классы реализации.Лично я сталкивался с этим только пару раз, но вопрос в том, как вы справляетесь с этим?

Когда вы сталкиваетесь с проблемой, когда у вас есть два файла .jar, которые экспортируют один и тот же пакет, и выЧтобы получить доступ к обоим классам пакетов, вы используете механизм, называемый «затенение».Затенение - это когда вы берете эти два пакета и собираете их содержимое в другой пакет файлов .jar.Раньше это делалось с помощью плагина maven под названием «maven-shade-plugin», но теперь функциональность является частью плагина maven-bundle.

Сначала создайте новый проект, назовем наш «badlyPlannedImplementationShaded».Затем в вашем проекте создайте файл pom.xml.В своем разделе зависимостей включите зависимости для обоих ваших файлов .jar, которые вы пытаетесь затенять вместе.

Затем добавьте следующее в раздел сборки.

<plugin>
   <groupId>org.apache.felix</groupId>
   <artifactId>maven-bundle-plugin</artifactid>
   <version>2.1.0</version>
   <extensions>true</extensions>
   <configuration>
      <instructions>
         <Bundle-Version>${project.version}</Bundle-Version>
         <Export-Package>
            badlyPlannedImplementation.util;version="1",
            badlyPlannedImplementation.util;version="2"
         </Export-Package>
      </instructions>
   </configuration>
</plugin> 

Выполнение этогосоздаст новый пакет, содержащий пакет утилит, содержащий все классы из двух файлов .jar, которые вы пытались использовать.

Надеюсь, это поможет!

...