Arc*_*hey 25 java javafx exception noclassdeffounderror
我收到了这个错误
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
Run Code Online (Sandbox Code Playgroud)
尝试运行我的类文件时,这是源
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
fxml文件包含一个简单的gui.
Rob*_*ein 13
过去几个小时我一直在研究这个问题.即使我没有看到它明确写出来,看来你必须使用一个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
Run Code Online (Sandbox Code Playgroud)
有了这些,您可以从命令行运行应用程序:
java -jar outjar.jar
Run Code Online (Sandbox Code Playgroud)
一切正常.如果我删除额外的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
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
小智 7
我相信我的例子会对某人有所帮助。我没有成功构建真正可执行的 jar 文件,该文件可以通过 Java 8 从任何位置/目录单击运行。迁移到 Java 11 和其他一些小东西就完成了这项工作。
转到Java 11。指定SDK,IDE中的其他人员,将其添加到pom.xml
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
Run Code Online (Sandbox Code Playgroud)
添加 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>
Run Code Online (Sandbox Code Playgroud)
构建应用程序
为主类创建包装类,它扩展了应用程序
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}
Run Code Online (Sandbox Code Playgroud)
将以下内容添加到 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>
Run Code Online (Sandbox Code Playgroud)
运行这个maven命令
mvn clean -Dmaven.clean.failOnError=false compile assembly:single -DskipTests=true
Run Code Online (Sandbox Code Playgroud)
指定名称的 jar 文件将出现在目标目录中。它将独立于您运行它的位置而执行。
我遇到了同样的问题,以下步骤帮助我解决了它,
在运行应用程序时添加 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
Run Code Online (Sandbox Code Playgroud)
笔记:
- --module-path 将包含 Java fx 的 jars
- 我使用了 open-jdk 13
在你的 eclipse 中配置这个(如果你正在使用)或者你可以像这样编译和运行,
编译
javac --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml *.java
Run Code Online (Sandbox Code Playgroud)
跑
java --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml MyMainClass
Run Code Online (Sandbox Code Playgroud)
小智 0
我正在 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 $?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61556 次 |
| 最近记录: |