Я создаю демонстрационное приложение с JavaFX в IntelliJ, но мне нужно использовать библиотеку под названием JavaFaker. Я использую Gradle в качестве системы сборки, но каждый раз, когда я пытаюсь добавить библиотеку либо как реализацию в файле build.gradle, либо с помощью параметров структуры проекта IntelliJ, файл module.java сообщает об ошибке: модуль не найден. Я уже пробовал добавлять его в модули, но ничего не меняется.
модуль-info.java
module com.example.demo1 {
requires javafx.controls;
requires javafx.fxml;
requires javafaker;
opens com.example.demo1 to javafx.fxml;
exports com.example.demo1;
}
build.gradle
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.10'
id 'org.beryx.jlink' version '2.24.1'
}
group 'com.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
ext {
junitVersion = '5.8.2'
javaFakerVersion = '1.0.2'
}
sourceCompatibility = '17'
targetCompatibility = '17'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
application {
mainModule = 'com.example.demo1'
mainClass = 'com.example.demo1.HelloApplication'
}
javafx {
version = '17.0.1'
modules = ['javafx.controls', 'javafx.fxml']
}
dependencies {
implementation("com.github.javafaker:javafaker:${javaFakerVersion}")
testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
}
test {
useJUnitPlatform()
}
jlink {
imageZip = project.file("${buildDir}/distributions/app-${javafx.platform.classifier}.zip") as RegularFile
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
launcher {
name = 'app'
}
}
jlinkZip {
group = 'distribution'
}
сообщение об ошибке
> Task :HelloApplication.main() FAILED
Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafaker not found, required by com.example.demo1
Ваш скрипт сборки Gradle не определяет зависимость от библиотеки javafaker
.
Я удалил его, так как мой module.info дает мне всплывающую подсказку, в которой говорится: «Неоднозначная ссылка на модуль: javafaker».
Вам определенно нужна библиотека javafaker, объявленная в ваших зависимостях. Положить его обратно.
снова добавил javafaker в файл gradle.
Мой первый подход — добавить реализацию в файл build.gradle, синхронизировать файл gradle и использовать классы библиотеки. Единственная проблема в том, что я не могу импортировать класс, так как IDE говорит мне добавить директиву require в файл module-info.java, но затем говорит, что не может найти модуль. Когда это не удалось, я попытался добавить библиотеку через IDE.
«Пакет com.github.javafaker объявлен в модуле javafaker, но модуль com.example.demo1 не читает его». Это ошибка, которую я получаю, когда не добавляю директиву require в свой модуль. файл info.java
Отредактируйте вопрос, чтобы добавить дополнительную информацию вместо публикации комментариев. Если вы отвечаете на комментарий, вы можете процитировать комментарий в вопросе. Материал намного легче читать и следовать таким образом, и вопрос улучшается.
Некоторое время я пытался заставить это работать с Gradle, но не смог. Я плохо знаю Gradle, но если вы не знаете, я не советую его пробовать.
Использование Maven
Это легко заставить работать с Maven.
Создать новый проект JavaFX
Добавьте зависимость javafaker в ваш pom.xml.
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>1.0.2</version>
</dependency>
Нажмите значок обновления в окне Maven, чтобы повторно импортировать проект Maven в IDE.
Добавьте пункт require для модуля javafaker в ваш module-info.java.
requires javafaker;
Добавьте код для использования javafaker в свое приложение.
У меня нет кода для использования javafaker, поэтому я не мог проверить, будет ли работать последний шаг, но попробуйте. . .
Некоторые проблемы, которые у меня были с Gradle
Глядя на раздел Документация Gradle «Использование библиотек, которые не являются модулями»:
A third case are traditional libraries that provide no module information at all — for example commons-cli:commons-cli:1.4. Gradle puts such libraries on the classpath instead of the module path. The classpath is then treated as one module (the so called unnamed module) by Java.
Это относится к зависимости javafaker, которую вы используете. Он не имеет module-info.java
и не определяет свойство Automatic-Module-Name
в своем файле манифеста (это два других случая в этом разделе). Оба других случая приводят к тому, что Gradle помещает библиотеку в путь к модулю, но в вашем случае это означает, что она находится в пути к классу.
Это проблема, когда вы хотите получить доступ к коду из определенного вами именованного модуля, который у вас есть, потому что вы создали файл module-info.java
.
Ваш модуль может найти только код и ресурсы модулей, которые ему необходимы (которые должны быть в пути к модулю), поэтому вы добавляете requires javafaker
к module-info.java
и получаете следующее при попытке запустить через IDE:
java.lang.module.FindException: Module javafaker not found, required by com.example.demo1
Таким образом, вы удаляете requires javafaker
из module-info.java
, как указано в документации Gradle, на которую я ссылаюсь, и вы получаете следующее при попытке скомпилировать:
Package 'com.github.javafaker' is declared in module 'javafaker', but module 'com.example.demo1' does not read it
Таким образом, вы должны поместить библиотеку в информацию о модуле, чтобы использовать ее, но вы не можете поместить библиотеку в информацию о модуле, потому что Gradle вставляет путь к классам -> словить 22.
Для этого есть обходные пути, такие как предоставление аргументов виртуальной машины, чтобы разрешить доступ к безымянному модулю (который является путем к классам), или, возможно, каким-то образом изменить обработку пути модуля в сборке Gradle и/или IDE (я не знаю, как), но они довольно некрасивые.
С другой стороны, в этом случае Maven действует иначе, чем Gradle, он помещает зависимую библиотеку в путь к модулю, даже если в ней не определены module-info.java
или Automatic-Module-Name
. Это означает, что (для меня) его было намного проще настроить и использовать.
Случайный совет по именованию модулей
Это не ошибка, но обратите внимание: хотя имена модулей с номерами в них теперь разрешены из-за изменения спецификации системы модулей, возможно, лучше не ставить числа в именах модулей на предотвращение путаницы имени модуля и информации о версии.
отредактировано, не могли бы вы помочь сейчас?