JLink构建的JavaFX镜像中Logback无法正常工作的解决方法
解决JavaFX jlink镜像中SLF4J找不到logback提供者的问题
问题出在jlink构建的模块化运行时不会自动包含非应用直接依赖的模块,手动复制jar到lib目录无效是因为jlink镜像使用封闭的模块路径,外部jar不会被加载。以下是具体解决步骤:
1. 确保应用模块化并声明依赖
如果你的应用还没有module-info.java,在src/main/java下添加该文件,明确声明对logback和SLF4J的模块依赖:
module com.yourcompany.yourapp { // 依赖JavaFX模块,根据你的应用需求调整 requires javafx.controls; requires javafx.fxml; // 声明logback与SLF4J的模块依赖 requires logback.classic; requires org.slf4j; // 开放FXML所需的包(若使用FXML) opens com.yourcompany.yourapp to javafx.fxml; // 导出主类所在包 exports com.yourcompany.yourapp; // 若logback配置文件在自定义资源包,开放该包给logback以读取配置 opens com.yourcompany.yourapp.resources to logback.classic; // 若配置文件在根resources目录,使用`opens . to logback.classic;` }
2. 配置javafx-maven-plugin的jlink参数
在pom.xml的javafx-maven-plugin中,明确指定jlink需要包含的模块,确保logback相关模块被纳入镜像:
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>com.yourcompany.yourapp.Main</mainClass> <launcher>yourapp</launcher> <jlinkImageName>target/image</jlinkImageName> <!-- 添加logback相关模块到jlink镜像 --> <addModules> <addModule>logback.classic</addModule> <addModule>logback.core</addModule> <addModule>org.slf4j</addModule> </addModules> </configuration> <executions> <execution> <id>run</id> <goals> <goal>run</goal> </goals> </execution> <execution> <id>jlink</id> <goals> <goal>jlink</goal> </goals> </execution> </executions> </plugin>
3. 确保logback配置文件被正确打包
将logback.xml(或logback.groovy)放在src/main/resources目录下,Maven会自动将其打包到模块资源中,jlink构建时会同步包含该文件。
4. 重新构建并运行
执行以下命令清理并构建jlink镜像:
mvn clean javafx:jlink
然后运行镜像中的启动脚本(比如target/image/bin/yourapp),日志功能即可正常工作。
内容的提问来源于stack exchange,提问作者Jardo
相关产品推荐
相关产品推荐

