Оберните стороннюю банку, которая импортируется из пакета по умолчанию, с помощью bndtools

Я хочу обернуть стороннюю банку. К сожалению, поставщик поместил один единственный класс (a.class) с одним единственным методом в пакет по умолчанию.

Когда я пытаюсь включить ресурс с помощью Include-Resource: @lib/acme-8.0.jar, это приводит к следующей ошибке:

The default package '.' is not permitted by the Import-Package syntax.
This can be caused by compile errors in Eclipse because Eclipse creates valid class files regardless of compile errors.
The following package(s) import from the default package [com.acme.util]

bnd print -all acme-8.0.jar дает мне следующий вывод (сокращенно, имя поставщика заменено на acme)

[API USES]
.                                        []

com.acme.common                            []

com.acme.acmedrt                             [com.acme.acmedrt.types, com.acme.acmedrt.comm.jobtransport, com.acme.acmedrt.workflow.type
s]

com.acme.acmedrt.impl                        [com.acme.acmedrt, com.acme.acmedrt.types, org.apache.commons.logging, com.acme.acmedrt.imp
l.types, com.acme.acmedrt.comm.jobtransport, com.acme.acmedrt.pool, org.apache.commons.pool, com.acme.acmedrt.workflow.types]

com.acme.acmedrt.impl.types                  [com.acme.acmedrt.types, com.acme.acmedrt, com.acme.acmedrt.impl, org.xml.sax]

com.acme.acmedrt.notification                [com.acme.acmedrt]

com.acme.acmedrt.pool                        [com.acme.acmedrt, com.acme.acmedrt.impl.types, com.acme.acmedrt.impl, com.acme.acmedrt.types,
org.apache.commons.pool, com.acme.acmedrt.workflow.types]

com.acme.acmedrt.types                       [com.acme.acmedrt, com.acme.common]

com.acme.acmedrt.util                        []

com.acme.acmedrt.workflow.types              [com.acme.common]

com.acme.tools                             []

com.acme.util                              []

com.acme.util.xml                          []


[LIST]

  a.class
META-INF
  MANIFEST.MF
com
com <no contents>
com/acme
com/acme <no contents>
com/acme/common
  Enum.class
com/acme/acmedrt
[...]

Если я правильно понимаю этот вывод, несколько пакетов используют пакет по умолчанию. Как это вообще возможно? Насколько я знаю, вы не можете импортировать классы из пакета по умолчанию.

Я уже связался с продавцом с просьбой перенести класс-нарушитель. Скорее всего, он не последует моему предложению.

Есть ли обходной путь для обработки классов в пакете по умолчанию?


person tobias_    schedule 11.01.2016    source источник
comment
Это правда, что вы не можете импортировать пакет по умолчанию в OSGi. Но было бы неплохо иметь классы из пакета по умолчанию внутри вашего пакета.   -  person Neil Bartlett    schedule 13.01.2016
comment
@NeilBartlett Возможно, но bnd не может создать пакет из данной банки, что приводит к приведенному выше сообщению об ошибке.   -  person tobias_    schedule 13.01.2016
comment
Похоже, что класс является пакетом по умолчанию, на который ссылаются в API других пакетов. Отсюда и сообщение об ошибке.   -  person BJ Hargrave    schedule 13.01.2016
comment
@BJHargrave Я согласен. Но, как я уже сказал, у меня нет никакого контроля над сторонней банкой. Есть ли способ позаботиться об этой ошибке и создать пакет без изменения данной банки?   -  person tobias_    schedule 13.01.2016
comment
Если вы не можете переместить класс в именованный пакет, то вы не можете сделать пакет из банки. Пакет без имени (по умолчанию) нельзя экспортировать или импортировать.   -  person BJ Hargrave    schedule 13.01.2016


Ответы (1)


Вы, вероятно, можете обойтись следующим вариантом:

 -fixupmessages: "The default package "
person Peter Kriens    schedule 13.01.2016
comment
Этот параметр подавляет сообщение об ошибке и позволяет мне создать пакет. Однако использование библиотеки в некоторых случаях приводит к исключению (com/acme/util/a.a(I)Ljava/lang/String; @44: if_icmpge. Ожидаемый кадр карты стека в этом месте.). Я не знаю, связано ли это с отсутствующим классом в пакете по умолчанию или результатом неудовлетворенной зависимости. - person tobias_; 13.01.2016
comment
Глядя на сообщение, это маловероятно, но не невозможно... Но если у вас дрянная библиотека, у вас дрянные проблемы... :-( - person Peter Kriens; 18.01.2016
comment
Поставщик использует обфускацию кода для частей своей библиотеки. Упомянутая ошибка, по-видимому, возникает при вызове запутанного кода. Я связался с продавцом, чтобы проверить их продукт. - person tobias_; 11.02.2016