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

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

У меня проблемы с использованием стандартного Java-проекта Eclipse (2018-09, 4.9.0) со смешанной модульной и немодульной средой. В частности, я пытаюсь объединить 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 выдает предупреждение, указывающее, что автоматический модуль нестабилен, который, кажется, распознан, но продолжает выдавать ошибку, которая не может быть устранена.

Я также попытался поместить основной файл jar POI в путь к классу, в отличие от пути к модулю, но безрезультатно.

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

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

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

2 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам