osgi: импортировать пакет, который частично существует внутри пакета

У меня есть пакет XYZ, который существует в двух пакетах A и B:

bundle A
 package X.Y.Z 
  class Class1

bundle B
 package X.Y.Z 
  class Class2

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

Я использую стеклянную рыбу 3.1 с феликсом.


person lili    schedule 28.08.2011    source источник
comment
Какие пакеты экспортирует и импортирует пакет A, а какой пакет B экспортирует и импортирует?   -  person seh    schedule 28.08.2011


Ответы (2)


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

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

person Neil Bartlett    schedule 29.08.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> 

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

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

person Mike Van    schedule 14.09.2011