2010-11-16 2 views
2

Я пишу комплект OSGI, используя пакет javax.script, и у меня есть некоторые проблемы с получением Felix для правильной загрузки пакета. При попытке запустить пакет я получаю:Felix не нравится javax.script

Не удалось запустить пуск для org.plugin.script.plugin-scripter [2]: org.osgi.framework.BundleException: неразрешенное ограничение в пакете 2: пакет; (package = javax.script)

, который, я думаю, происходит, когда мы пытаемся ссылаться на пакет, который неправильно загружен в комплект. Я вполне уверен, что это связано с тем, что javax.script поставляется только в JDK, начиная с 1.6, и по какой-то причине Maven строит что-то другое. До сих пор я:

a. Установите необходимый импорт в моем Maven POM для Felix по:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <Export-Package>org.plugin.script</Export-Package> 
      <Private-Package>org.plugin.script.*</Private-Package> 
      <Bundle-Activator>org.plugin.script.ScripterPlugin</Bundle-Activator> 
      <Import-Package>!*,javax.script,org.osgi.framework;version="1.3.0",javax.naming,javax.naming.spi</Import-Package> 
      <Embed-Dependency>!org.apache.felix*;scope=compile|runtime;inline=false</Embed-Dependency> 
      <Embed-Transitive>true</Embed-Transitive> 
      <Embed-Directory>dependency</Embed-Directory> 
      <Embed-StripGroup>true</Embed-StripGroup> 
      <_failok>true</_failok> 
     </instructions> 
    </configuration> 
</plugin> 

b. Установите компилятор Maven в 1.6, так как это самое раннее мы получаем javax.script

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.0.2</version> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
    </configuration> 
</plugin> 

c. Даже не уверен, что это имеет значение, но я установил свойства рамки Felix (в их config.properties) на 1.6.0 и включил экспорт javax.script. TBH Я не уверен в этом, но решил, что я сделаю снимок.

org.osgi.framework.system.packages=org.osgi.framework; version=1.3.0, \ 
    [lots of stuff in between] 
    javax.script; \ 
    version="1.6.0" 

Still nadda tho. Что еще я пропустил?

+0

Просто случайный намек - похоже, что ошибка возникает при попытке загрузить пакет, так что вы проверили, что ваша платформа * выполнения * является Java 1.6? –

+0

@Stephen Спасибо за подсказку, но это было первое подозрение. Я фактически удалил все версии, кроме 1.6, поэтому я не думаю, что это так. – Michael

+0

А новые разработки. В манифесте сообщается, что пакет javax.script был в Export-Package (в рамках использования :) и Import-Package, но * также * в Ignore-Package, который является странным, потому что я никогда не устанавливал его как таковой. – Michael

ответ

0

Я бы померил, чтобы убедиться, что bundle экспортирует этот пакет. Я думаю, что вы можете использовать такие команды, как «заголовки», в зависимости от вашей среды (Felix, Equinox и т. Д.). Если вы фактически экспортируете его с где-то, тогда я бы попытался сузить его до определенной версии.

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

2
<Import-Package>!*,javax.script,org.osgi.framework;version="1.3.0",javax.naming,javax.naming.spi</Import-Package> 

Как правило, вы хотите, чтобы bnd импортировал все, что вам нужно. Здесь вы говорите, что ничего не импортируете (т. Е. «! *»). Порядок здесь важен. Поскольку * соответствует чему-либо, ваш пакет ничего не импортирует. Попробуйте полностью удалить Import-Package (который по умолчанию будет импортировать все) и посмотреть, что произойдет.

+0

Спасибо за крик. ! * на самом деле было сделано, чтобы я мог сохранить размер пакета. Понял, что было бы лучше для меня явно указать индивидуальный импорт вместо того, чтобы bnd захватить все и сделать банку ожирением. В любом случае я все еще столкнулся с исключением нерешенных ограничений. Манифест (после удаления Import-Package) выглядит отлично ТБЙ: Manifest-Version: 1,0 Экспорт-пакет: org.plugin.script; использует: = "javax.script, и т.д. и т.п." Import-Package: javax .script и т. д. и т. д. Начнем с ума меньше: P – Michael

+1

Некоторые интересные заблуждения здесь. Оператор Import-Package ничего не делает для размера вашего пакета, который контролируется операторами Private-Package и Export-Package.Bnd не «захватывает все» ... он захватывает именно то, что вы использовали в своем Java-коде, и ничего больше. Поэтому, переопределяя это с помощью! *, Вы на самом деле говорите: «Не импортируйте эти пакеты, ДАЖЕ, ЧТО мой код использует их». –

+1

Что касается неразрешенной ошибки ограничения ... это просто означает, что нет другого пакета, экспортирующего пакет, который вам нужен. Если вы работаете на Java 6, то «системный пакет» * должен * экспортировать этот пакет, потому что он является частью стандартных библиотек на Java 6. Если вы работаете на Java 5 или ранее, вам нужен отдельный пакет, который экспортирует этот пакет , –

Смежные вопросы