Felix: невозможно добавить пакет расширений в JDK 9

После перехода на JDK 9+ наш OSGi-контейнер, построенный на основе apache Felix, перестал устанавливать пакет расширений. Сообщение об ошибке:

Caused by: org.osgi.framework.BundleException: Could not create bundle object.
    at org.apache.felix.framework.Felix.installBundle(Felix.java:3095)
    ...
Caused by: java.lang.UnsupportedOperationException: Unable to add extension bundle.
    at org.apache.felix.framework.ExtensionManager.addExtensionBundle(ExtensionManager.java:439)
    at org.apache.felix.framework.Felix.installBundle(Felix.java:3061)
    ...

Наша версия Felix — 5.6.10, которая в настоящее время является последней доступной. Соответствующая часть манифеста пакета:

Created-By: Apache Maven Bundle Plugin
Fragment-Host: system.bundle; extension:=framework
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=9.0))"
Tool: Bnd-3.5.0.201709291849

person gjoranv    schedule 22.06.2018    source источник


Ответы (1)


Отладка показала, что загрузчик классов, используемый для установки расширения, был перемещен в именованный модуль в JDK 9. Поэтому пакет загрузчика классов должен быть открыт для всех безымянных модулей, чтобы он был доступен из среды Felix.

Он работает после добавления следующего параметра командной строки:

--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED

Для модульных тестов с maven-surefire-plugin используйте:

 <configuration>
     <argLine>
         --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED
     </argLine>
 </configuration>

Похоже, что решение было зарегистрировано Феликсом ExtensionManager, но не добавлен в сообщение об исключении, поэтому сообщение не было найдено в моих собственных журналах:

        m_logger.log(bundle, Logger.LOG_WARNING,
            "Unable to add extension bundle - Maybe ClassLoader is not supported " +
                    "(on java9, try --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED)?");
person gjoranv    schedule 22.06.2018
comment
Похоже, что код Felix взламывает закрытый метод appendToClassPathForInstrumentation, определенный загрузчиком класса приложения. Этот метод предназначен для использования реализацией агента java.instrument, он никогда не должен использоваться напрямую кодом вне JDK. Надеюсь, Феликсу была отправлена ​​ошибка. - person Alan Bateman; 23.06.2018
comment
@AlanBateman Проект Felix действительно знает об этой проблеме и работает над ней. - person Neil Bartlett; 28.06.2018
comment
@NeilBartlett Есть ли проблема Jira, за которой мы можем следить? - person gjoranv; 28.06.2018
comment
@NeilBartlett FELIX-5727 был исправлен для версии 5.6.10, которую мы используем. Означает ли это, что обходной путь с использованием «добавить-открывает» является постоянным? - person gjoranv; 29.06.2018
comment
@gjoranv Да, я думаю, это означает, что для поддержки пакетов расширений OSGi Framework всегда может потребоваться add-opens при работе на Java 9+. Я всегда думал, что Framework Extensions были хакерской частью спецификации и побуждали людей искать альтернативные решения. - person Neil Bartlett; 02.07.2018