Что делает экспорт-пакет: . Иметь в виду?

Представьте подключаемый модуль Eclipse (соответственно пакет OSGi) с пакетом org.acme.foo.bar.

Можно экспортировать "." например см. следующий фрагмент MANIFEST.MF:

Export-Package: .,
 org.acme.foo.bar

У компилятора нет проблем с этим, поэтому экспорт кажется законным.

Что оно делает? В чем разница со следующим ("." не экспортируется)?

Export-Package: org.acme.foo.bar

person Marteng    schedule 07.02.2018    source источник


Ответы (3)


. — это пакет по умолчанию, но в соответствии с OSGi Core, спецификация выпуска 6 . не является допустимым значением для Export-Package, поскольку имя пакета должно начинаться с буквы:

Экспорт-пакет ::= экспорт ( ',' экспорт)*
экспорт ::= имена-пакетов ( параметр ';' )*
имена-пакетов ::= имя-пакета ( ';' имя-пакета )*
имя-пакета ::= уникальное-имя
уникальное-имя ::= идентификатор ( '.' идентификатор )*
идентификатор ::= jletter jletterordigit *
jletter ::= ‹см. Спецификация языка Java, третье издание для JavaLetter>
jletterordigit ::= ‹см. Спецификация языка Java, третье издание для JavaLetterOrDigit>

Поэтому было бы лучше обойтись без пакета по умолчанию:

Export-Package: org.acme.foo.bar
person howlger    schedule 07.02.2018
comment
Правильно, за исключением того, что это не зависит от используемой OSGi Framework. Экспорт пакета по умолчанию является ошибкой во всех реализациях фреймворка, соответствующих спецификациям. - person Neil Bartlett; 07.02.2018
comment
@NeilBartlett Спасибо за разъяснение. Я отредактировал свой ответ соответственно. Означает ли это, что игнорирование . или несуществующих пакетов и интерпретация . как пакета по умолчанию нарушает спецификацию? Разрешает ли спецификация неэкспортируемый пакет по умолчанию? - person howlger; 07.02.2018
comment
. — недопустимое имя пакета. Пакет по умолчанию не имеет имени и, конечно, не может быть импортирован или экспортирован из пакета. - person BJ Hargrave; 07.02.2018

Хотя проверка Eclipse MANIFEST.MF разрешает '.' это недопустимо в соответствии со спецификацией OSGi. Кажется, это означает пакет по умолчанию, но это неразумно экспортировать.

Похоже, это подтверждается ошибкой Eclipse 366800, в которой сообщалось об использовании '.' как это в плагине org.eclipse.datatools.sqltools.parsers.sql.query. Ошибка была принята как ошибка, и '.' удаленный.

person greg-449    schedule 07.02.2018
comment
. является пакетом по умолчанию (которого следует избегать) и в упомянутой ошибке добавлено по ошибке к подключаемому модулю/комплекту, не содержащему пакет по умолчанию. Вы уверены, что спецификация OSGi не позволяет указать пакет по умолчанию в качестве экспортируемого пакета? - person howlger; 07.02.2018
comment
Итак, похоже, это специфично для Eclipse и не имеет особого смысла. - person greg-449; 07.02.2018
comment
Я не думаю, что . относится к Eclipse (например, см. - person howlger; 07.02.2018

Не удалось найти его в спецификации OSGi (V6).

Пробовал пример в Eclipse (Oygen.2). Создал два плагина (они же бандлы), один "поставщик", другой "потребитель". Провайдер экспортирует пакет по умолчанию и в этом пакете содержит общедоступный класс A.

=> Невозможно получить доступ к A из подключаемого модуля «поставщик». Eclipse предлагает экспортировать пакет ''. Вызов этой опции ничего не меняет. Ошибка компиляции остается.

Я бы рекомендовал не использовать это.

person ingo.mohr    schedule 07.02.2018