Сторонний пакет импортирует и использует любую версию пакета, экспортированного системным пакетом.

У меня есть два сторонних пакета, которые зависят от пакета javax.transaction. Этот пакет экспортируется системным пакетом как версия 0.0.0. Один из пакетов импортирует любую версию пакета и объявляет ее как ограничение использования для экспортируемого пакета. Для другого пакета явно требуется версия 1.1.0. Этот пакет предоставляется другим комплектом.

Для моего собственного пакета требуются оба сторонних пакета. Однако, поскольку системный пакет разрешается первым, сторонний пакет, который принимает любую версию, связывается с версией 0.0.0. В результате возникает конфликт использования пакетов.

Какие есть варианты исправить это?


person Davey Chu    schedule 31.03.2014    source источник


Ответы (2)


Варианты 1:

Добавьте версию в Import-Package в каждом пакете, в который импортируется javax.transaction. Я бы не советовал этого. :)

Вариант 2:

Не импортируйте пакет javax.transaction при делегировании загрузки. Это то, что мы делаем, тоже. Вы можете установить пакеты, которые должны быть импортированы, через системную переменную org.osgi.framework.system.packages. Чтобы увидеть пример, найдите имя в переменной в этот pom файл. Есть пример для феликса и один для равноденствия.

С этой опцией у вас может возникнуть проблема, связанная с тем, что javax.sql зависит от пакета javax.transaction.xa. В этом случае вы можете использовать javax.sql из доступного пакета здесь (версия JDBC 4.0.0). Конечно, вы также должны исключить пакеты javax.sql из делегирования загрузки (в примерах они исключены).

Поскольку javax.transaction.xa используется только в javax.sql, а javax.sql не используется ни в каких других пакетах JDK, эти пакеты можно безопасно отделить и использовать из пакетов.

person Balazs Zsoldos    schedule 31.03.2014

По сути, у вас есть два пакета (системный пакет и какой-то другой пакет), которые экспортируют этот пакет. Если содержимое пакета одинаково в обоих случаях, самое простое решение — предоставить его только один раз. Поскольку для одного из ваших потребительских пакетов требуется как минимум версия 1.1.0, вам следует либо убедиться, что вы экспортируете по крайней мере эту версию, либо изменить своего потребителя, чтобы он принимал любую версию.

Таким образом, вы можете либо удалить «другой пакет», который предоставляет пакет (или изменить его, если он предоставляет больше, чем просто этот пакет), либо вы можете изменить список пакетов, экспортируемых фреймворком. Для этого в спецификации есть свойство "org.osgi.framework.system.packages", в котором перечислены все эти пакеты, поэтому вы можете создать новый список, исключающий этот пакет.

Как говорит Балаш, я бы воздержался от делегирования загрузки, но, судя по вашему описанию, вы его не использовали.

person Marcel Offermans    schedule 01.04.2014
comment
Вы знаете, где я могу установить это свойство для Tycho? Кроме того, есть ли способ настроить его для Tycho и Eclipse из одного места? - person Davey Chu; 01.04.2014
comment
Попробуйте установить его как системное свойство. Я не знаком с Tycho (я использую Bndtools для разработки OSGi в Eclipse), но в целом, если вы можете найти способ установить системные свойства, это сработает. - person Marcel Offermans; 04.04.2014