web-dev-qa-db-ja.com

スレッド「メイン」のJavaFX例外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が含まれています。

24
Archey

私は過去数時間、これとまったく同じ問題に取り組んできました。明示的に書かれていませんが、あなたは[〜#〜] [〜#〜]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

お役に立てれば!

13
Rob Stoecklein

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>
3
user1276925

私はそれが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>
2
Pma

IntelliJおよび他のIDEは、実行/デバッグ構成をリファクタリングしません。メインクラスの名前の前にパッケージ名を手動で変更する必要があります。たとえば、「sample.Main」を「com.company.package.ui.Main」に変更すると、次回実行するときに正しく起動します。 IDEは、メインクラスが見つからなかったため、[実行/デバッグ]ボタンに既に赤い十字が付いている可能性があります。また、実行/デバッグ構成を開くと警告が表示されます。

1
Huupke

私は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> 
1
Ciel

私のような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"
1
Genesis_GDK

私は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 $?
0
FarDarkMist

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にありました

0
thedrs

eclipse環境の場合:jfxrt.jarをMANIFEST.MFファイルのBundle-ClassPathに追加します。

Bundle-ClassPath: .,
jfxrt.jar
0
Rut.b