"Module not found, required by" 当使用 javafx 通过 gradle 实现 Maven 库时?

"Module not found, required by" when implementing maven library via gradle using javafx?

我在 Intellij 2021.3 中使用 gradle 7.3.1 构建 JavaFX 应用程序。我需要后端部分依赖外部库。

这是想法预建的完整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.github.zukarusan'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

ext {
    junitVersion = '5.8.1'
}

sourceCompatibility = '11'
targetCompatibility = '11'

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

application {
    mainModule = 'com.github.zukarusan.app'
    mainClass = 'com.github.zukarusan.app.MainApplication'
}

javafx {
    version = '11.0.2'
    modules = ['javafx.controls', 'javafx.fxml']
}

dependencies {
    implementation('org.controlsfx:controlsfx:11.1.0')
    implementation('com.dlsc.formsfx:formsfx-core:11.3.2') {
        exclude(group: 'org.openjfx')
    }
    implementation('org.kordamp.ikonli:ikonli-javafx:12.2.0')
    implementation('org.kordamp.bootstrapfx:bootstrapfx-core:0.4.0')

    implementation('com.github.wendykierp:JTransforms:3.1') // THIS IS THE EXTERNAL LIBRARY I ADDED

    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")
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = 'app'
    }
}

jlinkZip {
    group = 'distribution'
}

然后我更新了module-info.java

module com.github.zukarusan.app {
    requires javafx.controls;
    requires javafx.fxml;
    requires org.controlsfx.controls;
    requires com.dlsc.formsfx;
    requires org.kordamp.ikonli.javafx;
    requires org.kordamp.bootstrapfx.core;
    requires java.desktop;

    requires JTransforms; // UPDATED

    exports com.github.zukarusan.app.controller;
    exports com.github.zukarusan.app.model;
    exports com.github.zukarusan.app;
    opens com.github.zukarusan.app.controller to javafx.fxml;
}

在我更新之前 module-info ,应用程序启动得很好,并显示一个 javafx window 应用程序。 但是,在我更新之后, java.lang.FindException 被抛出。导致以下错误:

> Task :MainApplication.main() FAILED
Error occurred during initialization of boot layer
java.lang.module.FindException: Module JTransforms not found, required by com.github.zukarusan.app

我必须手动下载模块吗?或我错过的任何步骤?


请赐教。 :'(

在评论@jewelsea的指导下,我终于解决了这个问题。

几天后,我发现我在模块化 java 项目中导入的库被视为 未命名模块 (如果我错了请纠正我)。到目前为止,据我了解,像 JTransforms 这样的库可能属于传统库,它们没有像 Java 9 中那样涵盖模块化功能。这意味着 jar 库没有 Automatic-Module-Name 在至少在其清单元数据中。见 gradle documentation.

也就是说,我将有另一种使用成绩插件的方法extra-java-module-info and found a somewhat similar case in this

最终,我在build.gradle

中添加了以下脚本
plugins {
    ... // other plugins

    id 'de.jjohannes.extra-java-module-info' version '0.11'
}

extraJavaModuleInfo {
    module("JTransforms-3.1.jar", "JTransforms", "3.1") {
        exports("org.jtransforms")
    }
}

然后点击那个同步按钮。就这些!

干杯!再次感谢@jewelsea。