このエラーが発生しています
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サンプル(BrickBreaker、Ensemble、FXML-LoginDemo、SwingInterop)の4つのJARファイルすべてを調べました。それらはすべて「余分な」ファイルも持っています。
私の小さなテストアプリでは、このコマンドラインを使用して「実行可能な」JARファイルを作成しました。
javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1
お役に立てれば!
Java 8を使用すると、この問題は発生しませんが、私にとってはそうでした
最初にEclipse Export-> Runnable Jarからjarを作成しましたが、問題ありませんでした。 Mavenに移動すると、上記で失敗しました。
2つのjarを比較すると、fxに関連するfxがjarにパッケージ化されていないことがわかりました(予想どおり)が、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>
私はそれがjavafxアプリケーションを起動する「適切な」方法ではないかもしれないことを知っていますが、私はしばらくの間この問題に苦労し、外部のパッケージングアプリケーションを使用する必要のない回避策を思い付きました。プラグイン(シェードプラグインと競合する)など...
このソリューションでは、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>
IntelliJおよび他のIDEは、実行/デバッグ構成をリファクタリングしません。メインクラスの名前の前にパッケージ名を手動で変更する必要があります。たとえば、「sample.Main」を「com.company.package.ui.Main」に変更すると、次回実行するときに正しく起動します。 IDEは、メインクラスが見つからなかったため、[実行/デバッグ]ボタンに既に赤い十字が付いている可能性があります。また、実行/デバッグ構成を開くと警告が表示されます。
私は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の2つのバージョンがインストールされている場合、構成ファイルでクラスパスを適切なJavaインストールに変更する必要があります。これはNetbeansのバグです:次の2つの方法があります。
次のコマンドを実行して、-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"
私は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