Как добавить org.eclipse.swt (и другие зависимости плагина) в качестве автоматического модуля Java9?

Чтобы иметь возможность использовать мой плагин Eclipse «treezCore» также в качестве модуля Java9, я создал module-info.java в своей папке src.

Кроме того, я переместил зависимости подключаемых модулей из пути к классам в путь к модулям. Я вижу модуль "org.eclipse.swt.3.106.1.v20170926" в зависимостях плагина:

введите здесь описание изображения

Однако я не могу сослаться на этот модуль в моем модуле-info.java. Я пытался

require  org.eclipse.swt.3.106.1.v20170926;
require  org.eclipse.swt;
require  swt;

Ни один из этих вариантов не сработал. Файл jar \plugins\org.eclipse.swt_3.106.1.v20170926-0519.jar, используемый Eclipse, не содержит определения модуля и

jar --file org.eclipse.swt_3.106.1.v20170926-0519.jar -d

говорит, что дескриптор модуля не может быть получен. Также см

Не удалось получить дескриптор модуля для автоматически сгенерированные имена модулей в Java 9?

введите здесь описание изображения

Если я загружу более новую версию swt.jar из

http://download.eclipse.org/eclipse/downloads/drops4/R-4.7.1a-201710090410/download.php?dropFile=swt-4.7.1a-win32-win32-x86_64.zip< /а>

Я получаю следующий вывод, который выглядит многообещающе:

swt automatic
requires java.base mandated
contains org.eclipse.swt
contains org.eclipse.swt.accessibility
contains org.eclipse.swt.awt
contains org.eclipse.swt.browser
contains org.eclipse.swt.custom
contains org.eclipse.swt.dnd
contains org.eclipse.swt.events
contains org.eclipse.swt.graphics
contains org.eclipse.swt.internal
contains org.eclipse.swt.internal.gdip
contains org.eclipse.swt.internal.image
contains org.eclipse.swt.internal.mozilla
contains org.eclipse.swt.internal.mozilla.init
contains org.eclipse.swt.internal.ole.win32
contains org.eclipse.swt.internal.opengl.win32
contains org.eclipse.swt.internal.webkit
contains org.eclipse.swt.internal.win32
contains org.eclipse.swt.layout
contains org.eclipse.swt.ole.win32
contains org.eclipse.swt.opengl
contains org.eclipse.swt.printing
contains org.eclipse.swt.program
contains org.eclipse.swt.widgets

Я также завишу от org.eclipse.jface и не смог найти для него отдельную загрузку.

=> Мне действительно нужно ждать новой версии Eclipse, в которой используются новые версии плагинов, включая определения модулей?

Или я могу как-то ссылаться на старую версию swt из папки плагинов, даже если она не включает определение модуля? Я искал простой способ определить псевдоним или резервную зависимость, например.

requires ../plugins/org.eclipse.swt_3.106.1.v20170926-0519.jar as 'org.eclipse.swt'

or

requires org.eclipse.swt fallback ../plugins/org.eclipse.swt_3.106.1.v20170926-0519.jar 

но module-info.java, похоже, не поддерживает такой синтаксис.

У меня есть около 20 зависимостей плагинов, и я не хочу вручную загружать каждую из них (если это возможно) и включать их как внешний файл jar. Я также не хочу взламывать отдельные файлы манифеста/jar в папке плагина Eclipse. Есть много файлов jar, которые мне нужно изменить, и обновление Eclipse сломает этот хак.

Я использую Eclipse для разработчиков RCP и RAP, версия: Oxygen.1a Release (4.7.1a), идентификатор сборки: 20171005-1200.

Изменить

При использовании Версия: Photon Milestone 4 (4.8.0M4) Идентификатор сборки: 20171214-1849 ошибка в module-info.java исчезает при использовании

требуется org.eclipse.swt;

и наличие зависимостей подключаемых модулей в пути к модулям.

Однако мой импорт еще не работает, см. Следующее изображение. Если я перенесу зависимости подключаемых модулей из Modulepath в Classpath, импорт будет работать, но ошибка в module-info.java появится снова.

Я создал минимальный пример в

https://github.com/stefaneidelloth/Java9EclipsePluginExample/tree/master/MyPlugin

и я подал отчет об ошибке в

https://bugs.eclipse.org/bugs/show_bug.cgi?id=529089

введите здесь описание изображения

Связанные вопросы:


person Stefan    schedule 12.12.2017    source источник
comment
jar --file org.eclipse.swt.3.106.1.v20170926.jar -d ничего не раскрывает?   -  person Alan Bateman    schedule 12.12.2017
comment
Нет. Невозможно определить дескриптор модуля. Недопустимое имя модуля: «3» не является идентификатором Java. Поэтому я предполагаю, что список явно включенных модулей неверен.   -  person Stefan    schedule 12.12.2017
comment
Спасибо за ссылку. Если я вас правильно понимаю, мне нужно дождаться новой версии Eclipse, так как я не являюсь владельцем org.eclipse.swt и не могу (не хочу) изменять его.   -  person Stefan    schedule 12.12.2017
comment
@Stefan Правда, если вы не можете (не хотите) изменить банку, которую пытаетесь использовать.   -  person Naman    schedule 13.12.2017


Ответы (1)


То, что вы наблюдаете, отслеживается в ошибке 525660, которая начинается с наблюдения, что все существующие (OSGi) артефакты Eclipse не работают как автоматические модули, потому что Java 9 не может получить допустимое имя модуля из имен файлов jar формы org.eclipse.swt_3.106.1.v20170926-0519.jar.

Поскольку это было обнаружено слишком поздно, чтобы требовать улучшения алгоритма автоматического получения имени модуля, это можно исправить только путем добавления заголовков Automatic-Module-Name в манифесты будущих выпусков.

Этот заголовок присутствует, начиная с Photon M4, как можно увидеть в org.eclipse.swt_3.107.0.v20171205-0742.jar, содержащий:

Имя автоматического модуля: org.eclipse.swt

person Stephan Herrmann    schedule 13.12.2017
comment
Photon Milestone 4 (4.8.0M4) пока не включает автоматическое имя модуля для всех плагинов. Например, имя автоматического модуля не работает для org.eclipse.ui_3.109.100.v20171116-2149.jar, где я хотел бы использовать org.eclipse.ui.forms.widgets.FormToolkit. - person Stefan; 19.12.2017
comment
Использование org.eclipse.swt в качестве зависимости от модуля, на первый взгляд, работает, потому что ошибка в module-info.java исчезает. Однако мой импорт пока не работает. Например, в нем говорится, что тип org.eclipse.swt.SWT недоступен для «импорта org.eclipse.swt.SWT;» Правила доступа к банке разрешают доступ к org/eclipse/swt/*. Файл jar org.eclipse.swt_3.107.1.v20171205-0742.jar отображается как немодульный — не модифицируемый в разделе «Зависимости подключаемых модулей» в пути к модулям. - person Stefan; 19.12.2017
comment
Видеть swt как Is not modular здесь кажется основной причиной. Не могли бы вы сообщить об ошибке в PDE (и связать ее здесь)? Я также могу представить некоторую путаницу, возникающую из-за того, что отсутствие Automatic-Module-Name в некоторых плагинах дает противоречивую комбинацию. - person Stephan Herrmann; 19.12.2017
comment
Кстати: старый access rules и Java 9 недоступны - это непересекающиеся понятия. - person Stephan Herrmann; 19.12.2017
comment
Я создал минимальный пример и зарегистрировал ошибку, см. обновленный вопрос. - person Stefan; 21.12.2017
comment
Вопрос решился? Кажется, я не могу заставить его работать без добавления зависимости для конкретной платформы (что не сработает, если я хочу, чтобы он создавал сборки для всех платформ) - person barteks2x; 25.04.2020
comment
@bartex2x, о какой проблеме вы спрашиваете? Ошибка bugs.eclipse.org/525660 была исправлена ​​в 2017 году. - person Stephan Herrmann; 25.04.2020
comment
@StephanHerrmann Проблема, с которой я столкнулся, заключается в том, что мне нужно добавить SWT для конкретной платформы в зависимости модуля. Что не сработает, если я создаю банки для всех платформ, например, в gradle. На данный момент я просто отказался от идеи использования модулей java 9 здесь. - person barteks2x; 26.04.2020
comment
@barteks2x, это другой вопрос, чем первоначальная проблема доступности. У вас могут быть проблемы с сопоставлением osgi-фрагментов с модулями? Звучит как подходящий дополнительный вопрос. - person Stephan Herrmann; 27.04.2020
comment
@StephanHerrmann Проблема в том, что если я добавлю только общий org.eclipse.swt, фактические классы swt все равно будут недоступны. Я могу добавить любую отдельную платформу, но для меня это нецелесообразно. Это очень похоже на проблему редактирования вопроса, которая также, по-видимому, помечена как исправленная, и они, похоже, ожидают, что разработчики укажут точную платформу в зависимостях модулей. - person barteks2x; 27.04.2020
comment
@barteks2x этот вопрос касается правильного доступа eclipse к пакетам osgi в контексте JPMS. Эта проблема была решена. То, что вы наблюдаете, является неотъемлемым различием между OSGi (у которого есть фрагменты) и JPMS (где вам, возможно, придется использовать полный рот --patch-module и т. д.). Во-первых, это вопрос инструментов, а во-вторых, вопрос архитектуры и платформ с разными возможностями. - person Stephan Herrmann; 28.04.2020