Как добавить поддержку кода GraalVM Polyglot (Java running Javascript) в модуле OSGi (Karaf) - PullRequest
1 голос
/ 25 марта 2020

Моя цель:

Я создаю « плагин » для Apache Unomi, который, похоже, является довольно стандартным набором сервисов Karaf / OSGi. В рамках этого я хотел бы иметь возможность выполнять Javascript (и в конечном итоге Nodejs) из моего кода Java, и лучшим вариантом для продвижения вперед, похоже, является GraalVM (меня не интересует использование что-нибудь наследство, как Nashorn / Rhino). Моя текущая работа в процессе в этом PR на моем форке Unomi.

Моя проблема:

Я не могу заставить работать код GraalVM Polyglot внутри модуль Karaf. Добавление зависимостей Maven завершается неудачно во время выполнения, и ручное добавление класса (который должен обеспечить среда выполнения GraalVM) в мой конфигурационный файл фреймворка приводит к ошибке об отсутствии дополнительных языков.

What I ' Пока сделано:

Я успешно установил GraalVM для JDK 11 (OS X Catalina)

% java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02)
OpenJDK 64-Bit Server VM GraalVM CE 20.0.0 (build 11.0.6+9-jvmci-20.0-b02, mixed mode, sharing)

Я ссылался на учебник GraalVM для Maven в JDK 11 и добавили следующие в pom моего плагина на основе примера:

        <dependency>
            <groupId>org.graalvm.sdk</groupId>
            <artifactId>graal-sdk</artifactId>
            <version>20.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.graalvm.js</groupId>
            <artifactId>js</artifactId>
            <version>20.0.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.graalvm.js</groupId>
            <artifactId>js-scriptengine</artifactId>
            <version>20.0.0</version>
        </dependency>

Я также добавил пример кода для GraalVM документация для моего плагина:

Context polyglot = Context.create();
Value array = polyglot.eval("js", "[1,2,42,4]");
int result = array.getArrayElement(2).asInt();

Что происходит (не работает):

На этом этапе моя сборка Maven завершается без ошибок. Однако, когда я запускаю Karaf, я сразу же получаю сообщение об ошибке ( full output ):

Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=unomi-router-karaf-feature; type=karaf.feature; version="[1.5.0.SNAPSHOT,1.5.0.SNAPSHOT]"; filter:="(&(osgi.identity=unomi-router-karaf-feature)(type=karaf.feature)(version>=1.5.0.SNAPSHOT)(version<=1.5.0.SNAPSHOT))" [caused by: Unable to resolve unomi-router-karaf-feature/1.5.0.SNAPSHOT: missing requirement [unomi-router-karaf-feature/1.5.0.SNAPSHOT] osgi.identity; osgi.identity=org.apache.unomi.router-rest; type=osgi.bundle; version="[1.5.0.SNAPSHOT,1.5.0.SNAPSHOT]"; resolution:=mandatory [caused by: Unable to resolve org.apache.unomi.router-rest/1.5.0.SNAPSHOT: missing requirement [org.apache.unomi.router-rest/1.5.0.SNAPSHOT] osgi.service; effective:=active; filter:="(&(objectClass=org.apache.unomi.router.api.services.ImportExportConfigurationService)(configDiscriminator=IMPORT))" [caused by: Unable to resolve org.apache.unomi.router-service/1.5.0.SNAPSHOT: missing requirement [org.apache.unomi.router-service/1.5.0.SNAPSHOT] osgi.wiring.package; filter:="(&(osgi.wiring.package=org.apache.unomi.persistence.spi)(version>=1.5.0)(!(version>=2.0.0)))" [caused by: Unable to resolve org.apache.unomi.persistence-spi/1.5.0.SNAPSHOT: missing requirement [org.apache.unomi.persistence-spi/1.5.0.SNAPSHOT] osgi.identity; osgi.identity="root#unomi-kar-1.5.0.SNAPSHOT"; type=karaf.subsystem; version="[0,0.0.0]"; resolution:=mandatory [caused by: Unable to resolve root#unomi-kar-1.5.0.SNAPSHOT: missing requirement [root#unomi-kar-1.5.0.SNAPSHOT] osgi.identity; osgi.identity=unomi-kar; type=karaf.feature; version="[1.5.0.SNAPSHOT,1.5.0.SNAPSHOT]" [caused by: Unable to resolve unomi-kar/1.5.0.SNAPSHOT: missing requirement [unomi-kar/1.5.0.SNAPSHOT] osgi.identity; osgi.identity=org.apache.unomi.plugins-firstparty; type=osgi.bundle; version="[1.5.0.SNAPSHOT,1.5.0.SNAPSHOT]"; resolution:=mandatory [caused by: Unable to resolve org.apache.unomi.plugins-firstparty/1.5.0.SNAPSHOT: missing requirement [org.apache.unomi.plugins-firstparty/1.5.0.SNAPSHOT] osgi.wiring.package; filter:="(osgi.wiring.package=com.ibm.icu.impl)"]]]]]]]

Если я удаляю три зависимости из pom моего плагина и перестраиваюсь, я могу запустить Karaf без вопрос. Однако, когда я пытаюсь запустить свое действие в своем плагине Unomi, он сразу говорит, что класс gragvm polyglot недоступен (ожидается).

После некоторого поиска в Google, я наткнулся на существующую проблему GitHub и последовало предложение добавить org.graalvm.polyglot к org.osgi.framework.system.packages.extra. Это почти сработало, но теперь, когда я пытаюсь запустить свое действие в своем плагине Unomi, я получаю PolyglotIllegalArgumentException: A language with id 'js' is not installed. Installed languages are: [].. Затем я попытался добавить все классы, которые я пытался, в том числе в приведенном выше примере, таким образом, но он продолжал возвращать то же самое. ошибка.

Я не уверен, куда отсюда go. Я предполагаю, что моя неопытность с Maven укажет на то, что это глупая проблема, хотя после долгих поисков выясняется, что небольшое количество контента, доступного во время работы GraalVM на OSGi, указывает на то, что оно, возможно, не работает - хотя я Должен представить, что это возможно. Я думаю о возможном решении:

  1. Я плохо настроил свой Maven pom, и есть способ решить эту проблему с помощью правильно настроенного pom
  2. Мне нужно указать дополнительные системные пакеты в org.osgi.framework.system.packages.extra за пределами единственного org.graalvm.polyglot, но я не уверен, как двигаться дальше.

Любая помощь за гранью приветствуется!

...