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

JavaFX打包Jar后无法加载org.kordamp.materialdesign2图标

解决JavaFX 18+jlink打包后无法加载Ikonli MaterialDesign2图标的问题

以下是针对你遇到问题的具体排查和解决步骤:

1. 修正Module-Info配置

确保你的模块声明中不仅引入依赖,还声明使用Ikonli的服务接口:

module your.module.name {
    requires javafx.controls;
    requires org.kordamp.ikonli.core;
    requires org.kordamp.javafx.iconli;
    requires org.kordamp.materialdesign2;

    // 声明使用IkonHandler服务,让ServiceLoader能找到对应的实现类
    uses org.kordamp.ikonli.IkonHandler;

    // 导出主类所在包(确保JavaFX能反射加载主类)
    opens your.main.package to javafx.graphics;
}

注意:依赖模块名应为org.kordamp.javafx.iconli而非org.kordamp.javafx,请根据实际依赖确认

2. 给jlink添加--bind-services参数

jlink默认不会自动包含服务提供者,需要通过该参数让它自动绑定所有模块化的服务实现:

  • 如果用IntelliJ配置jlink:在"Create Runtime Image"配置的"Arguments"中添加--bind-services
  • 如果用命令行:
    jlink --module-path $MODULE_PATH --add-modules your.module.name --bind-services --output target/image
    

这个参数会确保org.kordamp.materialdesign2中的图标服务提供者被包含到镜像中。

3. 检查Shadow Jar配置(若使用)

如果用Shadow Jar打包,必须配置合并服务文件,避免META-INF/services下的文件被覆盖:

Gradle 配置示例:

plugins {
    id 'java'
    id 'org.openjfx.javafxplugin' version '0.0.13'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

shadowJar {
    mergeServiceFiles() // 关键:合并所有服务文件
    manifest {
        attributes 'Main-Class': 'your.main.class.FullClassName'
    }
}

Maven 配置示例:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>your.main.class.FullClassName</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

4. 验证服务文件是否存在

打开生成的Jar或jlink镜像中的META-INF/services/org.kordamp.ikonli.IkonHandler文件,确认其中包含:

org.kordamp.ikonli.materialdesign2.MaterialDesign2IkonHandler

如果没有这一行,说明打包过程中服务文件被遗漏,需要检查依赖是否正确引入,或打包工具是否正确处理了服务文件。

5. 版本兼容性检查

确保Ikonli的版本与JavaFX 18兼容,建议使用Ikonli 12.3.0及以上版本,避免因版本不匹配导致的服务加载问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:05:09