使用jlink打包JavaFX独立应用时遇到的模块分析、配置及启动报错问题
jlink打包JavaFX独立应用时遇到的模块分析、配置及启动报错问题
我可以查看我的完整项目仓库,目前我的项目没有使用任何依赖管理器,并且我想保持这个状态。我使用了一个自己用Java编写的库,GUI部分采用JavaFX实现。正如标题所说,我想把我的应用做成独立程序,让用户不需要安装Java就能运行。
我在VSCode中这样生成jar文件:
生成jar后,我可以用以下命令运行应用:
java --module-path %JAVAFX% --add-modules=javafx.controls,javafx.fxml -jar match_three_solver.jar
我尝试运行以下命令来检查需要在jlink命令中包含哪些包:
jdeps -s --module-path %JAVAFX% match_three_solver.jar
但返回了如下错误:
Exception in thread "main" java.lang.module.FindException: Error reading module: match_three_solver.jar at java.base/jdk.internal.module.ModulePath.readModule(ModulePath.java:351) at java.base/jdk.internal.module.ModulePath.scan(ModulePath.java:238) at java.base/jdk.internal.module.ModulePath.scanNextEntry(ModulePath.java:191) at java.base/jdk.internal.module.ModulePath.findAll(ModulePath.java:167) at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:521) at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:607) at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:561) at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:537) at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:50) Caused by: java.lang.module.InvalidModuleDescriptorException: Main.class found in top-level directory (unnamed package not allowed in module) at java.base/jdk.internal.module.ModulePath.toPackageName(ModulePath.java:720) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.zip.ZipFile$EntrySpliterator.tryAdvance(ZipFile.java:573) at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at java.base/jdk.internal.module.ModulePath.jarPackages(ModulePath.java:621) at java.base/jdk.internal.module.ModulePath.lambda$readJar$6(ModulePath.java:653) at java.base/jdk.internal.module.ModuleInfo.doRead(ModuleInfo.java:311) at java.base/jdk.internal.module.ModuleInfo.read(ModuleInfo.java:129) at java.base/jdk.internal.module.ModulePath.readJar(ModulePath.java:652) at java.base/jdk.internal.module.ModulePath.readModule(ModulePath.java:332) ... 8 more
我大概理解这是因为我的jar是非模块化的,所以无法使用jdeps。如果要使用jdeps,我需要在项目中添加module-info.java文件。但无论我把这个文件放在哪里,编译器都会报错,而且还无法识别JavaFX模块:
如果有解决方法(哪怕需要完全重构当前文件夹结构),请告诉我。另外我也想知道,为什么非模块化的jar就不能使用jdeps?
我还尝试直接用以下命令生成独立运行环境:
jlink --module-path ../jmods;lib/javaFX/lib --add-modules javafx.base,javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.web --output jreFX2
然后在这个独立环境中运行jar:
jreFX2\bin\java -jar match_three_solver.jar
但得到了如下错误:
Graphics Device initialization failed for : d3d, sw Error initializing QuantumRenderer: no suitable pipeline found java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found at javafx.graphics@21.0.2/com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:283) at javafx.graphics@21.0.2/com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:253) at javafx.graphics@21.0.2/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:263) at javafx.graphics@21.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:290) at javafx.graphics@21.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:162) at javafx.graphics@21.0.2/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:651) at javafx.graphics@21.0.2/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:409) at javafx.graphics@21.0.2/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1135) Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found at javafx.graphics@21.0.2/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:95) at javafx.graphics@21.0.2/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125) at java.base/java.lang.Thread.run(Thread.java:1583) Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1135) Caused by: java.lang.RuntimeException: No toolkit found at javafx.graphics@21.0.2/com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:275) at javafx.graphics@21.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:290) at javafx.graphics@21.0.2/com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:162) at javafx.graphics@21.0.2/com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:651) at javafx.graphics@21.0.2/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:409) at javafx.graphics@21.0.2/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ... 2 more
任何帮助都将不胜感激,提前谢谢大家。
备注:内容来源于stack exchange,提问作者Dimnik
相关产品推荐
相关产品推荐

