По какой причине вы используете плагин maven-dependency-plugin
?
Если вы увидите, что делает цель unpack-dependencies
, вы заметите, что папки target/classes
содержат более 90 МБ классов, после того как плагин извлекает все зависимости проекта, включая зависимости JavaFX, иобъединяет их все.
И угадайте, что происходит с различными файлами module-info.class
для каждого из различных модулей JavaFX?Преобладает только один, в данном случае тот из javafx.media
.
Итак, вы создали новый модуль в target/classes
!
Он называется javafx.media
, содержит классы вашего проекта и все классы JavaFX, включая все из javafx.base
или javafx.graphics
.
Если вы проверите этот target/classes/module-info.class
файл:
module javafx.media {
requires transitive javafx.base;
requires transitive javafx.graphics;
...
}
this "module ", который уже содержит все классы JavaFX, также потребует снова этих классов из javafx.base
и javafx.graphics
, дублируя их.
Это объясняет ваше сообщение об ошибке:
Error: Module javafx.media contains package javafx.collections,
module javafx.base exports package javafx.collections to javafx.media
Теперь вы можете видеть, что ваш новый модуль javafx.media
содержит много пакетов, которые также экспортируются из javafx.base
в него, и это нарушает разделенный пакет , недопустимый условие:
Один и тот же пакет Java может быть экспортирован только одним модулем Java во время выполнения.Другими словами, у вас не может быть двух (или более) модулей, которые одновременно экспортируют один и тот же пакет.Java VM будет жаловаться при запуске, если вы это сделаете.
Возможные решения
Возможно, вам не нужен maven-dependency-plugin
плагин вообще?Удалите его, если он вам не нужен.
Вы добавляете папку target
со всеми классами JavaFX в путь к модулю:
jdeps --list-deps --module-path /Users/…/target:...
Очевидно, что это неправильно, поскольку папка classes
содержит все классы JavaFX и неправильный дескриптор информации модуля.Это недопустимый модуль, поэтому просто удалите его из пути к модулю.
- Тогда вам не нужно добавлять путь JDK к пути к модулю, что делается по умолчанию.
Таким образом, вы можете просто иметь:
jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
- Затем, когда вы добавляете модули, вам не нужно добавлять
javafx.base
или javafx.graphics
, так какони включены из переходных зависимостей (это также относится к зависимостям, перечисленным в вашей поме).Например, javafx.web .
Таким образом, у вас будет:
jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
-add-modules chaincoder,javafx.fxml,javafx.web
Но учтите, что у вас есть модуль с именем chaincoder
, который уже включает в себя все необходимые модули, так что вы можете иметь только это:
jdeps --list-deps --module-path /Users/…/javafx-sdk-11.0.2/lib
-add-modules chaincoder /Users/…/target/chaincoder4-1.0.jar
Это должно работать.
В заключение, вы можете избавиться от jfxrt.jar
из компилятораПлагин:
<configuration>
<source>11</source>
<target>11</target>
<compilerArguments>
<bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar</bootclasspath>
</compilerArguments>
</configuration>
Так как он больше не существует.У вас есть все классы JavaFX, включенные в зависимости:
<configuration>
<source>11</source>
<target>11</target>
</configuration>