You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java模块化报错排查:main模块与javafx包的冲突问题

问题:Java模块化开发中JavaFX包冲突报错

在Java模块化开发时遇到以下报错:

  • 初始报错:Module main contains package javafx.fxml, module javafx.fxml exports package javafx.fxml to main
  • 调整module-info.java后,又出现类似报错:Module main contains package javafx.beans.value, module javafx.base exports package javafx.beans.value to main

推测是模块重复导入,但无法定位问题位置。

初始module-info.java配置

module main {
    requires org.apache.logging.log4j;
    requires javafx.controls;
    requires javafx.fxml;
    requires java.sql;
}

build.gradle配置

plugins {
    id 'java'
    id 'application'
    id 'org.javamodularity.moduleplugin' version '1.8.12'
    id 'org.openjfx.javafxplugin' version '0.0.13'
    id 'org.beryx.jlink' version '2.25.0'
}

group 'org'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}
	ext {
    junitVersion = '5.10.0'
}

sourceCompatibility = '21'
targetCompatibility = '21'

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

application {
    mainModule = 'main'
    mainClass = 'main.HelloApplication'
}

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

dependencies {
    implementation('org.controlsfx:controlsfx:11.1.2')

    implementation('com.dlsc.formsfx:formsfx-core:11.6.0') {
        exclude(group: 'org.openjfx')
    }
    implementation('net.synedra:validatorfx:0.4.0') {
        exclude(group: 'org.openjfx')
    }
    implementation('org.kordamp.bootstrapfx:bootstrapfx-core:0.4.0')

    implementation 'org.apache.logging.log4j:log4j-core:2.22.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.22.0'

    testImplementation platform('org.junit:junit-bom:5.9.1')
    testImplementation 'org.junit.jupiter:junit-jupiter'

    runtimeOnly 'com.mysql:mysql-connector-j:8.3.0'
}

test {
    useJUnitPlatform()
}

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    manifest {
        attributes('Main-Class': 'main.HelloApplication', 'Multi-Release': 'true')
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

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 main {
    requires org.apache.logging.log4j;
    requires javafx.controls;
    requires javafx.fxml;
    requires java.sql;
    requires org.controlsfx.controls;
    requires com.dlsc.formsfx;
    requires org.kordamp.bootstrapfx.core;

    exports main;
    exports main.model;
    exports main.repository;
    exports main.service;
    exports main.controller;

    opens main;
    opens main.model;
    opens main.repository;
    opens main.service;
    opens main.controller;
}

调整后仍出现类似JavaFX相关包冲突报错,需要定位并解决问题。


定位与解决方案

核心原因

报错本质是你的main模块中存在JavaFX官方模块已声明的包(如javafx.fxml、javafx.beans.value)。Java模块化系统要求同一个包只能归属一个模块,若项目源码目录中误创建了这些JavaFX自带的包结构,就会触发冲突。

解决步骤

  1. 检查并清理源码结构

    • 打开项目源码目录(默认src/main/java),排查是否存在javafx.fxml、javafx.beans.value这类包目录。
    • 若存在,直接删除这些目录及内部文件——这些包属于JavaFX官方模块,无需在自身项目中重复定义。
  2. 清理构建缓存

    • 执行Gradle清理命令:./gradlew clean(Windows系统用gradlew.bat clean),清除历史构建缓存。
    • 重新执行构建:./gradlew build,验证报错是否消失。
  3. 调整Jar任务配置
    当前jar任务中通过from { configurations.runtimeClasspath.collect(...)}将所有依赖包内容解压后打包到自身Jar中,可能导致JavaFX包混入模块。若无需构建fat jar,建议注释该部分代码:

    jar {
        duplicatesStrategy = DuplicatesStrategy.EXCLUDE
        manifest {
            attributes('Main-Class': 'main.HelloApplication', 'Multi-Release': 'true')
        }
        // 注释以下代码,避免依赖包内容混入自身模块Jar
        // from {
        //     configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
        // }
    }
    

    若需要构建可执行fat jar,建议使用shadow等专用插件,避免手动解压依赖引发包冲突。

  4. 验证模块依赖配置
    你的module-info.java配置无问题,无需额外修改——确保未重复声明JavaFX模块即可。

内容的提问来源于stack exchange,提问作者robi503

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:44:55