我正在尝试将JavaFX项目从8 Java版升级到11版.当我使用"运行"Gradle任务(我遵循Openjfx教程)时,它工作,但是当我构建(使用"jar"Gradle任务)并执行(使用"java -jar")jar文件时,消息"Error :缺少JavaFX运行时组件,并且"运行此应用程序需要".
这是我的build.gradle文件:
group 'Project'
version '1.0'
apply plugin: 'java'
sourceCompatibility = 1.11
repositories {
mavenCentral()
}
def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
platform = 'win'
} else if (currentOS.isLinux()) {
platform = 'linux'
} else if (currentOS.isMacOsX()) {
platform = 'mac'
}
dependencies {
compile "org.openjfx:javafx-base:11:${platform}"
compile "org.openjfx:javafx-graphics:11:${platform}"
compile "org.openjfx:javafx-controls:11:${platform}"
compile "org.openjfx:javafx-fxml:11:${platform}"
}
task run(type: JavaExec) {
classpath sourceSets.main.runtimeClasspath
main = "project.Main"
}
jar {
manifest {
attributes 'Main-Class': 'project.Main'
}
from …
Run Code Online (Sandbox Code Playgroud) Maven允许基于其运行的操作系统系列激活某些构建配置文件,例如:
<profile>
<activation>
<os><family>Windows</family></os>
</activation>
</profile>
Run Code Online (Sandbox Code Playgroud)
围绕这个问题有很多问题:当时允许的值是os.family
多少?他们是否区分大小写?Linux会遇到Unix
吗?还是unix
?等等.
我在哪里可以找到有关允许值的信息 - 或者至少Maven从哪里获取这些值?环境变量?
我有一个Java 8应用程序,它使用JavaFX,主类扩展了 javafx.application.Application.目前,我将它作为胖罐提供,它在Oracle Java 8上运行良好.
现在我希望它能够在OpenJDK 11上运行.要添加JavaFX,我已经将org.openjfx中的工件添加到类路径中,并将它们包含在胖jar中.如果我从命令行启动我的jar,我明白了
Error: JavaFX runtime components are missing, and are required to run this
application
Run Code Online (Sandbox Code Playgroud)
我找到了解决此问题的两种可能方法:
虽然我可以使用1.作为一种解决方法,但我想知道目前(OpenJDK 11)构建/交付非模块化JavaFX应用程序的可执行胖罐的方法.有人可以帮忙吗?
我有一个应用程序,在从Eclipse导出为runnable jar并将其"打包所需的库到生成的JAR"后,可以使用"java -jar blah.jar"运行.
我添加了一些JavaFX代码来弹出Web浏览器.现在似乎不可能制作一个可以在小型Java版本中运行的可运行jar.当我将它导出为可运行的jar时,它会复制到我的次要版本特有的jfxrt.jar中.如果我使用"java -jar blah.jar"为完全匹配的java版本(jdk1.7.0_17)运行此jar,那么它工作正常,但如果我使用一个稍微更新(jdk1.7.0_45)然后它无法解决swingx上课正确."写一次在任何地方运行"都是如此.
我尝试使用JavaFX ant任务,但我无法完成实际打包依赖jar的任务.这实际上并不包括它创建的jar中的fx:resources jar,就像魔术eclipse"将所需的库包装到生成的JAR中"完美无缺:
<fx:jar destfile="${dist}/${dist.jar}">
<fx:application id="BlahTesterApp"
mainClass="blah.MainClass"
toolkit="swing"/>
<fileset dir="${build}"/>
<fx:resources>
<fx:fileset dir="${lib}" includes="**/*.jar" />
</fx:resources>
<manifest>
<attribute name="Implementation-Vendor" value="My Team"/>
<attribute name="Implementation-Title" value="Tester App"/>
</manifest>
</fx:jar>
Run Code Online (Sandbox Code Playgroud)
并且似乎只能创建我不想要的"本地捆绑".我不想让用户在以前能够运行darn jar时安装rpm或deb.
我不明白为什么Oracle必须在这里引入自己神奇的额外部署层.他们不想让人们使用JavaFX吗?
我在IntelliJ中创建了一个JavaFX项目.我可以在IntelliJ中运行项目.我在配置中添加了以下代码:
--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml
Run Code Online (Sandbox Code Playgroud)
但是项目的输出.jar文件(由Artifects制作)不会运行.我测试了这些命令,但没有任何机会:
java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
java --module-path %PATH_TO_FX% --add-modules javafx.controls Timer.jar
Run Code Online (Sandbox Code Playgroud)
命令行的上一个错误日志:
Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib
Run Code Online (Sandbox Code Playgroud)
ps:在JDK-10上构建时,我可以运行这个项目的.jar文件
编辑:
我下载了JavaFX并将其lib文件夹添加到系统环境中.为了将JavaFX添加到项目中,我执行了以下过程:项目结构>库>添加> Java> JavaFxPath/lib
然后我在此过程中为输出jar文件创建了Artifect:项目结构> Artifects>添加> JAR>从具有依赖项的模块> main类:main.Main.
JavaFX 11是否跨平台?正如我在openjfx.org中看到的,我必须为每个平台下载版本.如果是这样,我可以以任何方式以跨平台形式使用它吗?我应该为每个java版本使用每个javafx版本吗?不要告诉我使用maven或类似的东西.我想编写一个跨平台的软件.而且每个操作系统的每个版本都没有多版本软件.我在检查操作系统后加载模块但我可以这样做吗?任何方式都有很多跨平台的库,即使它有本机代码,为什么OpenJFX不这样做呢?
我似乎无法从 javaFX 应用程序生成跨平台构建。
\n当我从 IntelliJ 运行它时,它工作正常,如果通过 maven 打包它,我还可以在 Linux 上运行生成的 jar。
\n当我尝试在 Mac 上运行 jar 时出现问题,似乎不包含 JavaFX 库,然后我得到以下堆栈跟踪:
\nGraphics Device initialization failed for : es2, sw\nError initializing QuantumRenderer: no suitable pipeline found\njava.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found\n at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:280)\n at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:244)\n at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:261)\n at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:267)\n at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:158)\n at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:658)\n at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:678)\n at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)\n at java.base/java.lang.Thread.run(Thread.java:832)\nCaused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found\n at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:94)\n at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)\n ... 1 more\nException in thread \xe2\x80\x9cmain\xe2\x80\x9d …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 OpenJDK16 运行 JavaFX16 应用程序(应用程序本身是通过 Java 1.8 编写的)。不幸的是,每次运行我的应用程序时,我都会收到以下警告消息:
--- exec-maven-plugin:3.0.0:exec (default-cli) @ ListPlanWizard --- ???. 2021 年 1 月 14 日下午 12:46:53 com.sun.javafx.application.PlatformImpl 启动警告:不支持的 JavaFX 配置:从“未命名模块 @1cebc698”加载类
你能解释一下为什么我会得到它,我该如何避免这种情况?
请注意,与我在 Internet 上发现的此或类似警告的其他问题不同,我的应用程序在此之后不会崩溃或按预期工作。
另请注意,我使用此问题中的提示来避免 错误:缺少 JavaFX 运行时组件,并且需要运行此应用程序
我不在我的项目属性中使用外部 JavaFX OpenSDK 或其他东西。
我的 pom.xml 文件附在下面:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>bla.blabla</groupId>
<artifactId>ListPlanWizard</artifactId>
<version>0.9.3</version>
<packaging>jar</packaging>
<name>ListPlanWizard</name>
<description>blablablablabla</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<start-class>bla.blabla.ListPlanWizard.Crutch</start-class>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency> …
Run Code Online (Sandbox Code Playgroud) 我有一个非常基本的JavaFX应用程序,如果Application类不是 Main类,它可以完美地工作:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
public class Main {
public static void main(String[] args) {
Application.launch(App.class, args);
}
}
public class App extends Application {
@Override
public void start(Stage primaryStage) {
FXMLLoader loader = new FXMLLoader(); // works
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我将两者合并在一起时(这是大多数教程中推荐的方式,包括OpenJFX的官方文档),模块系统抛出IllegalAccessError
(至少在OpenJDK 11.0.2上):
public class MainApp extends Application {
@Override
public void start(Stage primaryStage) {
FXMLLoader loader = new FXMLLoader(); // throws IllegalAccessError
}
public static void main(String[] args) {
launch(MainApp.class, args);
} …
Run Code Online (Sandbox Code Playgroud)