Java 9 Runtime Exception вызывает org.glassfish.jersey.server.ResourceConfig
Мое приложение прекрасно работает с java 1.8 (и более ранними версиями), однако когда я перестроил приложение для использования java 9, я получил следующую трассировку стека. Причина обновления в том, что мне нужно использовать новый ProcessHandle.current()
, которого нет в более ранних версиях.
c:\>java -jar ./build/bin/DataMover.jar
DataMover Service: starting...
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: org/glassfish/jersey/server/ResourceConfig
at dataMoverServerPackage.Main.main(Unknown Source)
... 5 more
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.server.ResourceConfig
at java.base/java.net.URLClassLoader.findClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more
Для тех, кому интересно, вот вывод версии Java.
c:\>java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
Вот соответствующая функция main().
public static void main(String[] args)
{
try
{
...
final ResourceConfig resourceConfig = new ResourceConfig(DataMoverServerResource.class);
Я провел исследование и прочитал, что большая разница между Java 6,7,8 и Java 9 заключается в модулях. В частности, более ранние версии Java включали Java EE JDK, тогда как Java 9 включает в себя модуль java.se, а не EE. Как я читал, все классы com.sun.* Недоступны в Java 9. Эти фрагменты информации могут иметь или не иметь отношение к делу. Я не знаю внутреннюю структуру API jersey.server, только некоторые статьи говорили об этом.
Я использую банку в загрузчике банок, поэтому вещи из джерси находятся в базовой банке.
Я разрываюсь между внутренней проблемой зависимости от Джерси или фляги трикотажа. Загрузчик кажется счастливым, но не работает позже java.base/jdk.internal
, который говорит мне, что модуль может отсутствовать.
Если бы был внутренний модуль, такой как java.xml.bind, как я читал в одном посте, который включен в Java EE, то трассировка исключений указала бы на это, и я бы знал, что добавить этот модуль, используя --add-module
вариант Java, такой как --add-module java.xml.bind
, но это не тот случай, по крайней мере, с этим модулем.
Вот ссылка на одну, возможно, соответствующую статью. Может быть java.net
это проблема, так же, как at javax.xml.bind
в нижней части стека трассировки в этом вопросе была основная причина. Я сбрасывал со счетов ext
Папка ответит на этот вопрос, так как этот вопрос относится к 1.8, что у меня работает, и у меня есть jar-in-jar. Я отмечаю вопрос здесь, потому что он продолжает появляться в поисках. Этот вопрос тоже не актуален, хотя и похож. Список можно продолжить.
Я использую Eclipse, но собираю, используя ant. Библиотеки вещей из Джерси находятся в моей папке Maven .m2. Я щелкнул правой кнопкой мыши по своему проекту и выбрал Maven > Обновить. Это на 2,7.
Я наткнулся на этот сайт, который рассказывает о миграции на Java 9. На сайте я прочитал, что если вы добавите java.se.ee
, у вас будет доступ ко всем модулям Java EE. Эта рекомендация не удалась, тот же результат. Команда, которую я попробовал, была:
java --add-modules java.se.ee -jar ./build/bin/DataMover.jar
Я проверил SO и довольно много других сайтов, но пока пусто. Мысли?