транзитивные зависимости в Eclipse Plugin-Project с Java 9

Кажется, что в моем Eclipse Oxygen 3 транзитивные зависимости не разрешены в Plugin-Projects. Рассмотрим следующий проект, в котором A зависит исключительно от B, а B зависит от C: Минимальный проект с транзитивными зависимостями Хотя запуск A в JDK 1.8 проходит нормально (как и ожидалось), в JDK 9 я получаю хорошо известный

Exception in thread "main" java.lang.NoClassDefFoundError: c/C
    at b.B.<init>(B.java:9)
    at a.A.main(A.java:8)
Caused by: java.lang.ClassNotFoundException: c.C
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
    ... 2 more

Я знаю, я не объявлял никаких модулей, но я думал, что их опускание просто сохраняет проект как есть, даже в JDK 9. Когда я импортирую проект C непосредственно в A MANIFEST.MF, тогда все работает как в JDK 1.8. Так как же запустить проекты, если это возможно, без объявления модулей?


person Madjosz    schedule 25.03.2018    source источник
comment
Это не похоже на загрузчики классов Eclipse/OSGi. Вы должны использовать «Запуск от имени › Приложение Eclipse» для запуска кода подключаемого модуля.   -  person greg-449    schedule 25.03.2018
comment
Правильно, я запускаю этот проект с помощью Run As -> Java Application, которое выполняется с помощью jdk9\bin\javaw.exe. Но в jdk1.8 зависимости были разрешены правильно. Как я могу запустить этот микропроект как приложение Eclipse?   -  person Madjosz    schedule 25.03.2018
comment
Я не уверен, что понимаю цель: вы хотите запустить эту программу с OSGi или без него? При использовании OSGi ответ относительно реэкспорта должен делать это. В противном случае, есть ли у вас какие-либо записи в пути сборки, кроме зависимостей подключаемых модулей? Появляются ли записи в разделе Classpath или Modulepath? Как выглядит конфиг запуска?   -  person Stephan Herrmann    schedule 27.03.2018
comment
Мы использовали Eclipse Plugin-Projects как своего рода модульную систему до JDK 9 для управления зависимостями наших проектов, но сами проекты планируется запускать без OSGi. Они создаются с использованием функции Eclipse Export as -> Runnable JAR, где OSGi разрешает нам зависимости. Зависимости отображаются в пути к классам в разделе «Зависимости подключаемых модулей». Специальных конфигураций запуска нет, только конфигурация по умолчанию, которая создается Eclipse при запуске от имени -> Приложение Java.   -  person Madjosz    schedule 27.03.2018
comment
Это ошибка в Eclipse: bugs.eclipse.org/bugs/show_bug.cgi ?id=534884   -  person isnot2bad    schedule 02.08.2018


Ответы (1)


Вы можете изменить файл MANIFEST.MF в проекте B, чтобы повторно экспортировать его зависимость в проект C:

  • откройте MANIFEST.MF из проекта B в MANIFEST-Editor
  • переключитесь на вкладку «Зависимости»
  • выберите зависимость от проекта C и нажмите "Свойства..."
  • выберите «Реэкспортировать эту зависимость»

Имейте в виду, что это изменение также сделает классы из проекта C доступными в проекте A, создавая явную зависимость от A до C при использовании этих классов.

person benez    schedule 26.03.2018
comment
Хотя это работает, это просто обходной путь, который плохо работает для больших проектов с несколькими пакетами. Поскольку транзитивные зависимости работают при выполнении с Java 8, похоже, это какая-то ошибка затмения!? - person isnot2bad; 02.08.2018