JavaFX с модулем ошибки Gradle не найден

Я создаю демонстрационное приложение с 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

JavaFX с модулем ошибки Gradle не найден

JavaFX с модулем ошибки Gradle не найден

отредактировано, не могли бы вы помочь сейчас?

MakeBugsNotWar 21.03.2022 19:17

Ваш скрипт сборки Gradle не определяет зависимость от библиотеки javafaker.

jewelsea 21.03.2022 19:23

Я удалил его, так как мой module.info дает мне всплывающую подсказку, в которой говорится: «Неоднозначная ссылка на модуль: javafaker».

MakeBugsNotWar 21.03.2022 19:25

Вам определенно нужна библиотека javafaker, объявленная в ваших зависимостях. Положить его обратно.

DaveB 21.03.2022 19:29

снова добавил javafaker в файл gradle.

MakeBugsNotWar 21.03.2022 19:31

Мой первый подход — добавить реализацию в файл build.gradle, синхронизировать файл gradle и использовать классы библиотеки. Единственная проблема в том, что я не могу импортировать класс, так как IDE говорит мне добавить директиву require в файл module-info.java, но затем говорит, что не может найти модуль. Когда это не удалось, я попытался добавить библиотеку через IDE.

MakeBugsNotWar 21.03.2022 19:33

«Пакет com.github.javafaker объявлен в модуле javafaker, но модуль com.example.demo1 не читает его». Это ошибка, которую я получаю, когда не добавляю директиву require в свой модуль. файл info.java

MakeBugsNotWar 21.03.2022 19:36

Отредактируйте вопрос, чтобы добавить дополнительную информацию вместо публикации комментариев. Если вы отвечаете на комментарий, вы можете процитировать комментарий в вопросе. Материал намного легче читать и следовать таким образом, и вопрос улучшается.

jewelsea 21.03.2022 20:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Некоторое время я пытался заставить это работать с Gradle, но не смог. Я плохо знаю Gradle, но если вы не знаете, я не советую его пробовать.

Использование Maven

Это легко заставить работать с Maven.

  1. Создать новый проект JavaFX

    • Выберите Maven в качестве системы сборки вместо Gradle.
  2. Добавьте зависимость javafaker в ваш pom.xml.

    <dependency>
        <groupId>com.github.javafaker</groupId>
        <artifactId>javafaker</artifactId>
        <version>1.0.2</version>
    </dependency>
    
  3. Нажмите значок обновления в окне Maven, чтобы повторно импортировать проект Maven в IDE.

  4. Добавьте пункт require для модуля javafaker в ваш module-info.java.

    requires javafaker;
    
  5. Добавьте код для использования 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. Это означает, что (для меня) его было намного проще настроить и использовать.

Случайный совет по именованию модулей

Это не ошибка, но обратите внимание: хотя имена модулей с номерами в них теперь разрешены из-за изменения спецификации системы модулей, возможно, лучше не ставить числа в именах модулей на предотвращение путаницы имени модуля и информации о версии.

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