[英]Exception in thread “JavaFX Application Thread” java.lang.NoClassDefFoundError
[英]JavaFX Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
我收到這個錯誤
Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Ap
plication
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 13 more
嘗試運行我的類文件時,這是源
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.util.concurrent.Executor;
public class TestApplication extends Application{
@Override
public void start(Stage stage) throws Exception {
new TestApplication();
}
public TestApplication() {
try{
final Parent root = FXMLLoader.load(Executor.class.getResource("test.fxml"));
final Stage stage = new Stage(){{
setScene(new Scene(root, 300, 250));
setTitle("Test");
setResizable(false);
show();
}};
}catch(Exception e){
e.printStackTrace();
}
}
}
fxml 文件包含一個簡單的 gui。
在過去的幾個小時里,我一直在處理同樣的問題。 盡管我沒有看到它明確地編寫,但似乎您必須使用其中一種 JavaFX 打包工具,它是 Ant 任務或 javafxpackager 可執行文件。 (請參閱http://docs.oracle.com/javafx/2/deployment/packaging.htm ,第 5.3.1 節)。 NetBeans IDE 使用 Ant 來打包代碼。 (我正在使用 IntelliJ)
當您使用其中一種打包方法時,除了應用程序的所有代碼和資源之外,它還會將以下內容添加到您的輸出 JAR 文件中:
/com/javafx/main/Main$1.class
/com/javafx/main/Main$2.class
/com/javafx/main/Main.class
/com/javafx/main/NoJavaFXFallback.class
有了這些,您可以從命令行運行應用程序:
java -jar outjar.jar
一切正常。 如果我刪除額外的 com.javafx.main 文件,該應用程序不會運行。
為了仔細檢查這一點,我查看了 JavaFX 示例中的所有四個 JAR 文件(BrickBreaker、Ensemble、FXML-LoginDemo 和 SwingInterop)。 他們也都有“額外”的文件。
對於我的小型測試應用程序,我使用這個命令行來構建一個“可執行”的 JAR 文件:
javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1
希望這可以幫助!
我遇到了同樣的問題,以下步驟幫助我解決了它,
在運行應用程序時添加 vm 參數,
--module-path /home/user/Java-libraries/openjfx-11.0.2_linux-x64_bin-sdk/javafx-sdk-11.0.2/lib/ --add-modules javafx.controls,javafx.fxml
筆記:
- --module-path 將包含 Java fx 的 jars
- 我使用了 open-jdk 13
在你的 eclipse 中配置這個(如果你正在使用)或者你可以像這樣編譯和運行,
編譯
javac --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml *.java
跑
java --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml MyMainClass
我知道這可能不是啟動 javafx 應用程序的“正確”方式,但我一直在努力解決這個問題,並提出了一種不需要使用任何外部打包應用程序的解決方法,強制您使用 ant 或 maven插件(與陰影插件沖突)等...
該解決方案使用 Utils4j 在運行時動態加載 jfxrt。 您不能在擴展 javafx.application.Application 的類中加載它,請在單獨的類中加載它並為其命名,例如:Launcher
import org.fuin.utils4j.Utils4J
public class Launcher {
public static void main(String[] args) {
Utils4J.addToClasspath("file:///"+System.getProperty("java.home")+ File.separator+"lib"+File.separator+"jfxrt.jar");
// CODE TO RUN YOUR CLASS THAT EXTENDS javafx.application.Application goes here.
}
}
您可以在您的項目中包含 Utils4j(如果使用 maven):
<dependency>
<groupId>org.fuin</groupId>
<artifactId>utils4j</artifactId>
<version>0.7.0</version>
</dependency>
使用 java 8 不應該出現這個問題,但對我來說確實如此
我最初從 Eclipse Export -> Runnable Jar 創建了我的 jar,它很好。 當我搬到 Maven 時,它因上述原因而失敗。
比較這兩個 jar 表明,jar 中沒有打包任何與 fx 相關的內容(正如我所期望的那樣),但是 Eclipse 生成的清單具有Class-Path: .
在里面。 讓 maven 使用以下內容打包 jar(使用 Java 8)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.pg.fxapplication.Main</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
我相信我的例子會對某人有所幫助。 我沒有成功構建真正可執行的 jar 文件,該文件可以通過從任何位置/目錄使用 Java 8 單擊運行。移動到 Java 11 和其他一些 twicks 完成了這項業務。
移至Java 11。指定SDK,IDE中的其他人員,將其添加到pom.xml
<maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target>
添加 JavaFX 依賴項
<!--JavaFX--> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx</artifactId> <version>15.0.1</version> <type>pom</type> </dependency> <!--JavaFX-controls--> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>15.0.1</version> </dependency>
構建應用程序
為您的 Main 類創建包裝類,它擴展了 Application
public class Launcher { public static void main(String[] args) { Main.main(args); } }
將以下內容添加到 pom.xml
<build> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>path-to-launcher.Launcher</mainClass> </manifest> <manifestEntries> <Class-Path>.</Class-Path> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <finalName>final-jar-file-name</finalName> <archive> <manifest> <mainClass>path-to-launcher.Launcher</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <appendAssemblyId>false</appendAssemblyId> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
運行這個 Maven 命令
mvn clean -Dmaven.clean.failOnError=false compile assembly:single -DskipTests=true
指定名稱的 jar 文件將出現在目標目錄中。 它將是獨立於您運行它的位置的可執行文件。
我使用 maven,我只運行這個mvn install:install-file -Dfile="/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar" -DgroupId=com.oracle.javafx -DartifactId=javafx -Dversion=2.2 -Dpackaging=jar
在終端(可能在 Windows 中有點不同。)。 然后 maven 將安裝jfxrt.jar
然后你可以簡單地將它引用為
<dependency>
<groupId>com.oracle.javafx</groupId>
<artifactId>javafx</artifactId>
<version>2.2</version>
</dependency>
如果您像我一樣使用 netbeans 並且安裝了兩個版本的 JDK,那么您應該在配置文件中將類路徑更改為相應的 java 安裝。 這也是 Netbeans 中的一個錯誤:有兩種方法可以做到:
通過執行以下命令使用 --jdkhome 啟動 NetBeans:
"C:\Program Files\NetBeans Dev 201402160001\bin\netbeans.exe" --jdkhome "C:\Program Files\Java\jdk1.7.0_51"
或者在 /etc/netbeans.conf 中設置“netbeans_jdkhome”屬性,例如
# Default location of JDK, can be overridden by using --jdkhome <dir>:
netbeans_jdkhome="C:\Program Files\Java\jdk1.7.0_51"
IntelliJ 和其他 IDE 可能不會重構您的運行/調試配置。 您必須在 Main 類名稱之前手動更改包名稱。 例如,將 'sample.Main' 更改為 'com.company.package.ui.Main' 以便下次嘗試運行它時它會正確啟動。 IDE 可能已經用紅叉標記了運行/調試按鈕,因為它找不到主類。 當您打開運行/調試配置時,它還會發出警告。
我已經在“Ask ubntu”上回答了。 我建議您使用https://openjfx.io/openjfx-docs/ 。我使用的是 Eclipse IDE,但它適用於所有 IDE
然后你可以在設置 VM 選項時引用這個全局變量:
在IDE中右鍵單擊項目->運行方式->運行配置->參數->VM參數
對於 Windows,
--module-path "\\path to javafx\\lib" --add-modules javafx.controls,javafx.fxml
對於 Linux,
--module-path /path to javafx/lib --add-modules javafx.controls,javafx.fxml
我正在 Linux 上開發一個簡單的 WebApp 我遇到了同樣的錯誤,但修復它真的很容易(假設您像我一樣在命令行上開發)。
cat compile.sh
#!/bin/bash
/usr/lib/jvm/jdk1.7.0_25/bin/javac WebViewSample.java -cp /usr/lib/jvm/jdk1.7.0_25
/jre/lib/jfxrt.jar
$ cat run.sh
#!/bin/sh
JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25/bin/
CLASSPATH=/usr/lib/jvm/jre1.7.0_25/lib/jfxrt.jar:.
$JAVA_HOME/java -cp $CLASSPATH WebViewSample $* 2>&1 /dev/null | awk -F\| '{ print $2"|"$3 ; exit $1 }'
exit $?
我遇到了無法從 javafx 找到Pair類的問題。
似乎 vanilla eclipse(沒有e(fx)clipse擴展名)不會搜索 java 中包含的 javaFX 運行時 jar。
我剛剛將這個外部 jar 添加到我的 eclipse 項目構建路徑中(或者,如果您處於調試配置中,請在調試配置的 JRE 選項卡中添加外部 jar):
$JAVA_HOME/jre/lib/ext/jfxrt.jar
(將 JAVA_HOME 替換為您的 jdk 文件夾)
對我來說它在 /installs/jdk1.8.0_211/jre/lib/ext/jfxrt.jar
在eclipse環境中:將jfxrt.jar添加到MANIFEST.MF文件中的Bundle-ClassPath。
Bundle-ClassPath: .,
jfxrt.jar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.