Смешанная модульная и немодульная разработка в 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.