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
相关产品推荐
相关产品推荐

