Где разместить модуль-информация.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 ответов
универсальные советы:
- следует читать состояние модульной системы чтобы ознакомиться с JPMS. В качестве альтернативы, посмотрите на этот модуль системы учебник (отказ от ответственности: я автор).
- как описано в ответ на ваш другой вопрос, нет необходимости создавать модули, если вы не хотите.
чтобы ответить на ваши конкретные вопросы:
в декларация модуль (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", но это всего лишь одна или несколько проблем.