2016-01-11 6 views
0

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

Когда я пытаюсь включить ресурс, используя 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 дает мне следующий вывод (сокращенный, имя поставщика заменяется акме)

[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 
[...] 

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

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

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

+0

Это правда, что вы не можете импортировать пакет по умолчанию в OSGi. Но должно быть хорошо иметь классы из пакета по умолчанию внутри вашего пакета. –

+0

@NeilBartlett Возможно, но bnd не может создать пакет из данной банки, в результате чего появляется сообщение об ошибке выше. –

+0

Похоже, что класс - это пакет по умолчанию, указанный в API других пакетов. Отсюда сообщение об ошибке. –

ответ

1

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

-fixupmessages: "The default package " 
+0

Этот параметр подавляет сообщение об ошибке и позволяет мне создать пакет. Однако использование библиотеки приводит к исключению в некоторых случаях («com/acme/util/a.a (I) Ljava/lang/String; @ 44: if_icmpge. Ожидаемый фрейм стека в этом месте.»). Я не знаю, связано ли это с отсутствующим классом в пакете по умолчанию или с результатом неудовлетворенной зависимости. –

+2

Глядя на сообщение, это маловероятно, но не невозможно ... Но если у вас есть дерьмовая библиотека, у вас есть дерьмовые проблемы ... :-( –

+0

Поставщик использует обфускацию кода для частей своей библиотеки. Указанная ошибка, похоже, возникает, когда вызывается обфускационный код. Я связался с продавцом, чтобы просмотреть его продукт. –