Феликсу не нравится javax.script

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

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

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

а. Установите необходимый импорт в моем 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>

б. Установите для компилятора 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>

в. Даже не уверен, имеет ли это значение, но я установил для свойств фреймворка 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"

Все еще надда. Что еще я пропустил?


person Michael    schedule 16.11.2010    source источник
comment
Просто случайный намек — похоже, что ошибка возникает, когда вы пытаетесь загрузить пакет, поэтому вы проверили, что ваша платформа execution — это Java 1.6?   -  person Stephen C    schedule 17.11.2010
comment
@Stephen Спасибо за подсказку, но это было первое подозрение. Я на самом деле удалил все версии, кроме 1.6, так что я не думаю, что это все.   -  person Michael    schedule 17.11.2010
comment
Ах, новые разработки. Манифест говорит мне, что пакет javax.script был в пакете экспорта (в разделе «использует:») и пакете импорта, но также в пакете игнорирования, что странно, потому что я никогда не устанавливал его как такой.   -  person Michael    schedule 17.11.2010


Ответы (2)


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

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

person Richard S. Hall    schedule 17.11.2010
comment
Спасибо за крик. !* на самом деле было сделано, чтобы я мог уменьшить размер пакета. Я решил, что для меня было бы лучше явно указать отдельные импорты вместо того, чтобы bnd хватал все и делал банку толстой. В любом случае я все еще столкнулся с неразрешенным исключением ограничения. Манифест (после удаления Import-Package) выглядит нормально: Manifest-Version: 1.0 Export-Package: org.plugin.script;uses:=javax.script и т. д. и т. д. Import-Package: javax.script и т. д. и т. д. Начиная с в целом имеет меньше смысла :P - person Michael; 17.11.2010
comment
Здесь есть несколько интересных заблуждений. Оператор Import-Package ничего не делает с размером вашего пакета, который контролируется операторами Private-Package и Export-Package. Bnd не захватывает все... он захватывает именно то, что вы использовали в своем Java-коде, и ничего более. Таким образом, переопределяя его с помощью !*, вы на самом деле говорите, что не импортируете эти пакеты, ДАЖЕ ХОТЯ мой код их использует. - person Neil Bartlett; 18.11.2010
comment
Что касается неразрешенной ошибки ограничения... это просто означает, что нет другого пакета, экспортирующего пакет, который нужен вашему пакету. Если вы используете Java 6, системный пакет должен экспортировать этот пакет, поскольку он является частью стандартных библиотек Java 6. Если вы используете Java 5 или более раннюю версию, вам нужен отдельный пакет, который экспортирует этот пакет. - person Neil Bartlett; 18.11.2010
comment
@Neil Спасибо за исправление. Огромное заблуждение, и я могу подтвердить, что ваши наблюдения верны. Есть ли какая-либо конфигурация Felix, которую мне нужно установить, чтобы она явно работала на Java 6? - person Michael; 18.11.2010

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

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

person javamonkey79    schedule 16.11.2010