Смешанная модульная и немодульная разработка в Eclipse с использованием Java 11 - PullRequest
1 голос
/ 11 апреля 2019

Прошло много времени с тех пор, как я занимаюсь программированием на Java, и я с удивлением возвращаюсь к нему, когда весь ландшафт мне незнаком после пост-проекта.

У меня проблемы с использованием Eclipse (2018-09, 4.9.0) стандартный проект Java со смешанной модульной и немодульной средой.В частности, я пытаюсь объединить JavaFX 11 (модульный) и Apache POI 4.1 (немодульный) с помощью платформы Eclipse (базовый проект Java без Gradle или Maven).

В моем модуле-info.java у меня естьниже,

module myapp {
        requires javafx.base;
        requires javafx.graphics;
        requires javafx.fxml;
        requires javafx.controls;
        requires javafx.web;

        exports myapp.gui;

        opens myapp.gui to javafx.fxml;
}

Я нахожу, что везде, где у меня есть код Apache POI, я получаю следующую ошибку в Eclipse

The import cannot be resolved

Добавление следующего в module-info.java с использованием автоматическогомодуль, созданный для Apache POI, например,

        requires poi;

В Eclipse выдает предупреждение о том, что автоматический модуль нестабилен, который, похоже, распознан, но продолжает выдавать ошибку, которая не может быть устранена.

Iтакже попытался поместить основной файл jar POI в classpath, в отличие от module-path, но безрезультатно.

Код, использующий Apache POI в отрыве от UI, работает.Я просто должен отказаться от использования module-info.java, который, как я полагаю, переводит проект в какой-то унаследованный режим разработки без модульности?

Может кто-нибудь дать мне указатель на то, что я делаю неправильно, и направлятьмне настроить проект со смешанными модульными и немодулярными библиотеками?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Ваш код инкапсулирован в модуле, если у вас есть файл module-info.java в пакете по умолчанию. Для использования чего-либо из JAR внутри модуля ,

  • JAR должен находиться на Modulepath и
  • модуль должен быть явно объявлен как обязательный в module-info.java: requires <module_name>;.

В противном случае операторы импорта не могут быть разрешены.Ничего из элементов Classpath не доступно из модуля;и ничего на Modulepath без requires ... in module-info.java нельзя использовать в модуле.Следовательно, в вашем случае не будет работать без requires poi; (и без библиотеки POI на Modulepath ).

"Имя автоматического модуля '...' нестабильно" предупреждение - это только подсказка , что POI JAR не построен как модуль, но используется как модуль.На самом деле это означает, что если вы переименуете файл JAR, имя модуля также может измениться, и вам придется адаптировать файл module-info.java.Технически, POI JAR не содержит ни файла module-info.class, ни файла META-INF/MANIFEST.MF со строкой Automatic-Module-Name: ....Таким образом, имя модуля poi является производным от имени файла JAR. «Имя автоматического модуля '...' нестабильно» предупреждение можно отключить в Project> Свойства: Java Compiler> Ошибки / предупреждения в Module section.

Подводя итог, у вас нет смешанных модульных и немодулярных зависимостей.Вместо этого устаревшие JAR-файлы автоматически становятся модулями, получая имя модуля из имени файла.В этом случае Eclipse по умолчанию предупреждает вас, что приложение может быть повреждено простым изменением имени файла этого JAR-файла.

0 голосов
/ 12 апреля 2019

Итак, как оказалось. Я сделал глупость В библиотеке POI есть 5 взаимозависимых jar-файлов, которые вызвали ошибку «Не удалось разрешить импорт»

Как только я включил все 5 файлов в module-info.java, проект скомпилирован.

        requires poi.excelant;
        requires poi.ooxml;
        requires poi.ooxml.schemas;
        requires poi.scratchpad;
        requires poi;

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

Спасибо всем за то, что прочитали и подтвердили, что я ничего не сделал, чтобы сломать Затмение.

...