質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

Q&A

解決済

2回答

2766閲覧

JavaのGUIアプリケーション(javaFx)のクラスファイルを実行するとjava.lang.ClassNotFoundExceptionが表示される

kuina

総合スコア1

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

0グッド

0クリップ

投稿2020/11/02 17:04

前提・実現したいこと

Java初心者です。こちらで初めて質問させていただきます。

勉強でjavaFxライブラリを使用し、簡単なGUIアプリケーションを作ろうとしています。
javacコマンドでコンパイルを行いましたが、その後の実行コマンドにて以下のエラーメッセージが発生し、原因が分かっておりません。
ネットでエラーメッセージを検索しましたが、欲しい答えにはたどり着けず、悩んだうえでこちらに質問させていただきました。

C:\Users\ユーザー\Desktop>java Sample2 エラー: メイン・クラスSample2を検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Sample2

ディレクトリ構成は以下となっています。
Desktop/
├ Sample2.class
└ Sample2.java

実行環境、Javaのバージョンを以下に記載します。
windows10
java version "15.0.1"
javafx-sdk-11.0.2

ソースコード

import javafx.application.*; import javafx.stage.*; import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.layout.*; public class Sample2 extends Application { private Button bt; private Label lb; public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { // コントロールの作成 bt = new Button("購入"); lb = new Label("いらっしゃいませ"); // ペインの作成 BorderPane bp = new BorderPane(); // ペインへの追加 bp.setCenter(bt); bp.setTop(lb); // シーンの作成 Scene sc = new Scene(bp, 300, 200); // ステージへの追加 stage.setScene(sc); // ステージの表示 stage.setTitle("サンプル"); stage.show(); } }

試したこと

調べていると、javafxの実行にはjavafx.fxmlが必要であることが分かり、javacコマンドは以下のように記載しました。

javac --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample2.java

調べた上での質問となります。
足りない情報などありましたら補足いたしますので、何卒ご教示のほどをよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

javacでコンパイルしたときのコマンドラインオプションを実行時にも追加することで、実行できます。

CMD

1C> javac -version 2javac 15.0.1 3 4C> set PATH_TO_FX=C:\Java\javafx-sdk-11.0.2\lib 5 6C> javac --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample2.java 7 8C> java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample2

ちなみに--add-modulesオプションについてはヘルプ(java -help)では以下のように説明されています。

--add-modules <module name>[,<module name>...] 初期モジュールに加えて解決するルート・モジュール。 <module name>には次も指定できます: ALL-DEFAULT、ALL-SYSTEM、 ALL-MODULE-PATH.

ですので、少なくとも今回のケースではALL-MODULE-PATHを指定することでもいけます。

CMD

1C> java --module-path %PATH_TO_FX% --add-modules ALL-MODULE-PATH Sample2

投稿2020/11/02 23:33

dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuina

2020/11/03 02:08

dodox86様、ご回答ありがとうございます。 'ALL-MODULE-PATH'でモジュール名を全て内包でき、省略した書き方ができるのですね。勉強になります。 ご回答にありました 'java --module-path %PATH_TO_FX% --add-modules ALL-MODULE-PATH Sample2' を実行したところ、以下のエラーが出力されました。 C>java --module-path %PATH_TO_FX% --add-modules ALL-MODULE-PATH Sample2 エラー: メイン・クラスSampleを検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Sample2 また、ALL-MODULE-PATHではない元の書き方に戻しましたところ、同じようなエラーが出力されます。 C>java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample2 エラー: メイン・クラスSampleを検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Sample2 関係ないかもしれませんが、デスクトップ上に置いたのが間違いかと思い、以下のディレクトリに再配置しましたが、同じエラーが出力されます。 Desktop/  └ Sample/    └ Sample2.java      └ Sample2.class
dodox86

2020/11/03 02:16

> エラー: メイン・クラスSampleを検出およびロードできませんでした > 原因: java.lang.ClassNotFoundException: Sample2 "Sample"と出ていますが原因の方は"Sample2になっています。この点に限らず、色々おかしいように思います。まず、環境変数PATH_TO_FXにセットしたディレクトリが合っているか再度確認してください。 C> DIR %PATH_TO_FX% いったん、*.class ファイルは削除してください。で、まずコンパイルが成功したコマンドラインで再度コンパイルし、javac を java に、Sample2.java は Sample2にして実行してみてください。
kuina

2020/11/03 02:43

dodox86様、ご指導ありがとうございます。 >"Sample"と出ていますが原因の方は"Sample2になっています。この点に限らず、色々おかしいように思います。 こちらは私が意図的に書きかえました。"Sample2.java"と同内容のソース"Sample.java"を作成し、そちらでコンパイルしていた為です。中途半端な行為で混乱させてしまい、すみません。 (以降はSample.javaに統一致します) 'DIR %PATH_TO_FX%'を実行したところ、以下のディレクトリを示しました。 C:\Program Files\Java\jdk-15.0.1\javafx-sdk-11.0.2\lib >いったん、*.class ファイルは削除してください。で、まずコンパイルが成功したコマンドラインで再度コンパイルし、javac を java に、Sample2.java は Sample2にして実行してみてください。 実行しましたところ、以下のエラーが出力します。 C> javac --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample.java C> java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample エラー: メイン・クラスSampleを検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Sample
dodox86

2020/11/03 03:02 編集

> DIR %PATH_TO_FX%'を実行したところ、以下のディレクトリを示しました。 > C:\Program Files\Java\jdk-15.0.1\javafx-sdk-11.0.2\lib この出力結果で推測すると、コマンドラインでの展開時に"C:\Program"と"Files\Java\jdk-15.0.1\javafx-sdk-11.0.2\lib"に分割されてしまいます。つまり、 java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample は、 java --module-path C:\Program Files\Java\jdk-15.0.1\javafx-sdk-11.0.2\lib --add-modules javafx.controls,javafx.fxml Sample のようになり、正しく--module-pathを参照できていないのだと思います。 set PATH_TO_FX="C:\Program Files\Java\jdk-15.0.1\javafx-sdk-11.0.2\lib" とのように、PATHの前後を " でくくってみて再度コンパイル~実行を試してみてください。 それでダメだった場合、C:\Program Files\Java\jdk-15.0.1\javafx-sdk-11.0.2 の配置を C:\Java\javafx-sdk-11.0.2 などに移動、あるいはコピーして変えて試してみてください。
kuina

2020/11/03 04:16

dodox86様、ご指導ありがとうございます。 長い時間でのご回答ありがとうございます。 結果から言いますと、実行ができました。 原因は単純なCLASSPATHでの設定ミスでした。 >PATHの前後を " でくくってみて再度コンパイル~実行を試してみてください。 >それでダメだった場合、C:\Program Files\Java\jdk-15.0.1\javafx-sdk-11.0.2 の配置を C:\Java\javafx-sdk-11.0.2 などに移動、あるいはコピーして変えて試してみてください。 上記を実行しても、"java.lang.ClassNotFoundException"が出力されるので、 試しに"hello"を出力するhello.javaを作成したところ、同じエラーが出力されたため、 もう一度環境構築から見直し致しました。 結果として、単純な設定ミスによるものでしたので、大変ご迷惑をおかけしました。 お陰様で勉強となりました。 ありがとうございます。
guest

0

java Sample2.java

ではどうなるでしょう

投稿2020/11/02 22:35

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/11/02 23:43

ご回答について、特に外部モジュールなど使わないクラスでは確かに「java ソースファイル名」でそのままコンパイル~実行できますが、今回の質問のケースではそうはいかないようです。 C:>java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml Sample2.java Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: Sample2 at javafx.graphics/javafx.application.Application.launch(Application.java:304) at Sample2.main(Sample2.java:13) ...エラーが続く
kuina

2020/11/03 01:57 編集

y_waiwai様、ご回答ありがとうございます。 恥ずかしながら'java'でコンパイル~実行できることを知らず、試しておりませんでした。 ご回答にありましたコマンド'java Sample2.java'を入力しましたところ、dodox86様とは異なった以下のエラーが出力されました。 ``` Sample.java:8: エラー: シンボルを見つけられません public class Sample2 extends Application { ^ シンボル: クラス Application Sample.java:10: エラー: シンボルを見つけられません private Button bt; ^ シンボル: クラス Button 場所: クラス Sample2 Sample.java:11: エラー: シンボルを見つけられません private Label lb; ^ シンボル: クラス Label 場所: クラス Sample2 Sample.java:18: エラー: シンボルを見つけられません public void start(Stage stage) throws Exception { ^ シンボル: クラス Stage 場所: クラス Sample2 Sample.java:1: エラー: パッケージjavafx.applicationは存在しません import javafx.application.*; ^ Sample.java:2: エラー: パッケージjavafx.stageは存在しません import javafx.stage.*; ^ Sample.java:3: エラー: パッケージjavafx.sceneは存在しません import javafx.scene.*; ^ Sample.java:4: エラー: パッケージjavafx.scene.controlは存在しません import javafx.scene.control.*; ^ Sample.java:5: エラー: パッケージjavafx.scene.layoutは存在しません import javafx.scene.layout.*; ^ Sample.java:6: エラー: パッケージjavafx.eventは存在しません import javafx.event.*; ^ Sample.java:14: エラー: シンボルを見つけられません launch(args); ^ シンボル: メソッド launch(String[]) 場所: クラス Sample2 Sample.java:17: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません @Override ^ Sample.java:20: エラー: シンボルを見つけられません bt = new Button("aa"); ^ シンボル: クラス Button 場所: クラス Sample2 Sample.java:21: エラー: シンボルを見つけられません lb = new Label("ほげ"); ^ シンボル: クラス Label 場所: クラス Sample2 Sample.java:23: エラー: シンボルを見つけられません BorderPane bp = new BorderPane(); ^ シンボル: クラス BorderPane 場所: クラス Sample2 Sample.java:23: エラー: シンボルを見つけられません BorderPane bp = new BorderPane(); ^ シンボル: クラス BorderPane 場所: クラス Sample2 Sample.java:30: エラー: シンボルを見つけられません Scene sc = new Scene(bp, 300, 200); ^ シンボル: クラス Scene 場所: クラス Sample2 Sample.java:30: エラー: シンボルを見つけられません Scene sc = new Scene(bp, 300, 200); ^ シンボル: クラス Scene 場所: クラス Sample2 エラー18個 エラー: コンパイルが失敗しました ``` コンパイルの失敗が出力されましたが、再度'javac'コマンドでコンパイルすると、エラーを出力することはありませんでした。
dodox86

2020/11/03 01:59

@質問者さん > dodox86様とは異なった以下のエラーが出力されました。 いや、それは私のコメントしたコマンドラインオプションと違うので当然です。 > 再度'javac'コマンドでコンパイルすると、エラーを出力することはありませんでした。 一度javacでコンパイルして*.classファイルが出力されると、java *.java で実行しても可能なようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問