Где разместить модуль-информация.java с использованием Java 9?

у меня есть приложение OSGI, и у меня есть около 30 пакетов (файлы jar). Сегодня я решил посмотреть как это работает/работает ли он с Java 9.

Итак, я начал свое приложение и получил

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.felix.framework.util.SecureAction (file:/home/.../jar/org.apache.felix.framework-5.4.0.jar) to method java.net.URLClassLoader.addURL(java.net.URL)
WARNING: Please consider reporting this to the maintainers of org.apache.felix.framework.util.SecureAction
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

после некоторого чтения я добавил опцию командной строки

--add-exports java.base/java.net=org.apache.felix.framework 

и создал файловый модуль-info.java со следующим содержимым:

module org.apache.felix.framework { }

и у меня есть два вопроса. Где я должен разместить этот модуль-инфо.java, чтобы jvm прочитал его? Как мне связать это? модуль-информация с org.apache.felix.framework-5.4.0.jar файл / пакет / jar?

если я делаю все неправильно, пожалуйста, покажите мне правильное направление для исправления этой проблемы.

3 ответов


универсальные советы:

чтобы ответить на ваши конкретные вопросы:

в декларация модуль (module-info.java) необходимо перейти в исходный корневой каталог (например,src/main/java). Затем он должен быть среди списка файлов для компиляции, поэтому он превратится в дескриптор модуля (module-info.class). Последний шаг-включить его в список файлов классов, которые упакованы в банку. (Наличие дескриптора модуля в банке превращает его в модульная банку. При размещении на пути модуля JPMS превращает его в модуль.)

если вы в конце концов, вы не хотите создавать модули и предпочитаете, чтобы ваш код запускался в неназванном модуле, вы можете разрешить ему доступ к внутренним API с заполнителем ALL-UNNAMED - в случае вашего предупреждения, что вам нужно открыть этот пакет для отражения:

--add-opens java.base/java.net=ALL-UNNAMED

лучшим решением было бы прекратить использование внутренних API. Поскольку это не ваш код, а ваша зависимость, вы должны искать или открывать проблему с Apache Felix, который просит удалить доступ внутреннего ПРИКЛАДНОЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС.


и Jigsaw быстрый старт это хороший способ начать, если вы начинаете проект на Java-9.

где я должен разместить этот модуль-инфо.java, чтобы jvm прочитал его?

вывод вашего имени modeule из декларации module org.apache.felix.framework { }, вы должны поместить module-info.java файл в каталоге проекта по адресу:

src/org.apache.felix.framework/module-info.java 

как я должен связать этот модуль-информация с орг.апаш.Феликс.рамки-5.4.0.сосуд файл / пакет / банка?

далее скомпилировать модули и упаковать их(привязать модуль-info.класс в каталоге верхнего уровня вашего модульного jar), вы можете использовать javac и jar команды.

примеры команд для вышеизложенного были бы примерно такими :

$ javac --module-path mods -d mods/org.apache.felix.framework \
    src/org.apache.felix.framework/module-info.java src/org.apache.felix.framework/com/apache/felix/framework/Application.java


$ jar --create --file=mlib/org.apache.felix.framework.jar \
    --main-class=com.apache.felix.framework.Application -C mods/com.apache.felix.framework

и далее вы можете выполнить модуль, используя:

$ java -p mlib -m com.apache.felix.framework

кроме системы государственного модуля и документов быстрого запуска, для переноса существующих проекты на Java-9, я бы предложил вам следовать JDK9 руководство по миграции который заявляет четкий шаг мудрый переход, необходимый для адаптации к Java9.


вы должны отправить ошибку Apache Felix, поскольку это код в org.апаш.Феликс.рамки-5.4.0.jar, который делает незаконный доступ и должен быть исправлен. Я сделал быстрый тест с более новой версией 5.6.8 и с --illegal-access=debug и похоже, что у Феликса есть несколько вопросов, которые требуют внимания. Да, вы можете временно устранить конкретное предупреждение выше, открыв java.net пакет для "all-UNNAMED", но это всего лишь одна или несколько проблем.