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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Java Development Kit

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

Java

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

Q&A

解決済

1回答

424閲覧

JDK でコマンドプロンプトを用いて実行する(パッケージあり)

sumika1223

総合スコア2

Java Development Kit

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

Java

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

0グッド

0クリップ

投稿2024/01/04 14:02

編集2024/01/04 14:30

実現したいこと

Main class をコマンドプロンプトで実行できるようする。

発生している問題・分からないこと

イメージ説明
上の画像のようなファイル構造しています。
Main.class をコンパイルするため、コマンドプロンプトで
C:\Users\kenta\japp>java Main
と実行するとエラーが表示されます。

エラーメッセージ

error

1C:\Users\kenta\japp>java Main 2Exception in thread "main" java.lang.NoClassDefFoundError: japp/comment/Zenhan 3 at Main.main(Main.java:4) 4Caused by: java.lang.ClassNotFoundException: japp.comment.Zenhan 5 at java.net.URLClassLoader.findClass(Unknown Source) 6 at java.lang.ClassLoader.loadClass(Unknown Source) 7 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 8 at java.lang.ClassLoader.loadClass(Unknown Source) 9 ... 1 more

該当のソースコード

Main.class

1import japp.comment.Zenhan; 2public class Main { 3 public static void main(String[] args)throws Exception { 4 Zenhan.doWarusa(); 5 Zenhan.doTogame(); 6 japp.comment.Kouhan.callDeae(); 7 japp.comment.Kouhan.showMondokoro(); 8 } 9 10}

Zenhan.class

1package japp.comment; 2public class Zenhan { 3 public static void doWarusa(){ 4 System.out.println("きなこでござる。食えませんがの"); 5 } 6 public static void doTogame(){ 7 System.out.println("この老いぼれの目はごまかせんぞ。"); 8 } 9}

Kouhan.class

1package japp.comment; 2public class Kouhan{ 3 public static void callDeae(){ 4 System.out.println("えぇい、こしゃくな。くせ者だ!であえい!"); 5 } 6 public static void showMondokoro() throws Exception { 7 System.out.println("飛車さん、角さんもういいでしょう。"); 8 System.out.println("この紋所が目に入らぬか!"); 9 japp.comment.Zenhan.doTogame(); 10 } 11}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

クラスjapp.comment.Zenhanがクラスパスに含まれていないことが原因の一つだと自分で調べました。

同様の質問があったのですが、メインクラスの実行で悩まれている事例ではなかったため質問させていただきました。どなたかお力をお貸しいただけますと幸いです。

補足

windows 11 home
JDK  1.は

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

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

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

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

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

jimbe

2024/01/04 18:36

コードのマークダウンの言語名を書く所に Main.class 等と書かれていますが、提示されているのは Main.java 等のソースコードです。 Main.class 等の所は言語名の java とし、 Main.java 等のファイル名はマークダウンの外に書いてください。
guest

回答1

0

ベストアンサー

Windows 11、OpenJDK 21.0.1で確認しました。

cd C:\Users\kenta\japp javac -sourcepath .. Main.java java -classpath ..;. Main

(追記)
回答が不足しているとの指摘が付きましたので、説明します。
質問者さんの前回の質問と同じなのですが、

  • javac、javaコマンドから見てカレントはどこか
  • package、importは頭から解釈される(末尾から、たどってくれない)

ということで、コマンドにオプションでそれを教えてあげます。

投稿2024/01/04 14:43

編集2024/01/04 15:02
hiroki-o

総合スコア494

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

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

sumika1223

2024/01/04 14:56

ご回答ありがとうございます。 いまいち理解ができずそのままコマンドプロンプとで実行しましたができませんでした。
hiroki-o

2024/01/04 14:57

どのようなエラーが出ましたか?
sumika1223

2024/01/04 15:09

C:\Users\kenta\japp>java Mainと実行すると、 Exception in thread "main" java.lang.NoClassDefFoundError: japp/comment/Zenhan at Main.main(Main.java:4) Caused by: java.lang.ClassNotFoundException: japp.comment.Zenhan 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) ... 1 more とエラーが表示されます。
hiroki-o

2024/01/04 15:19

回答に書いた通り java -classpath ..;. Main と実行してみてください。
sumika1223

2024/01/04 15:33

実行できました、、ほんとにありが等ございます。 java-classpath ..;.Main の..;.の指定方法が理解できていません。
hiroki-o

2024/01/04 15:36

「..」は1個上(他の2クラスを探す)、「.」はその場所(Mainクラスを探す)、「;」はそれらを並べて書く時の区切りです。
sumika1223

2024/01/04 15:45

Main クラスを実行したいとき指定したものは C:\Users\kenta\japp>java -classpath ..;. Main だったのですが、classpathはどのように意図して経路設定していくのでしょうか。何度も質問してすみません
sumika1223

2024/01/04 15:47

自分で推測したのは、 パッケージ化された関係のあるクラスをはじめとして、どこに実行したいメインクラスがあるか?ということでしょうか
hiroki-o

2024/01/04 15:53

Mainクラスには import japp.comment.Zenhan; japp.comment.Kouhan.~ の記述がありますが、javaコマンドから見てjappがどこにあるか、わかりません。なので「..」を指定して、1個上がjappですよと教えてあげます。 あと、-classpathを指定した時はカレントも教えてあげないとならないので、「.」を指定します。 -classpathを指定しないときは、そのままカレントのMainを見ます(そのかわり、jappの場所は不明になる)。
sumika1223

2024/01/04 16:14

javaコマンドから見てというのは、commentファイルから見てということでしょうか? つまり、実行するメインクラスに関わるクラスが入っているファイルからメインクラスのファイルまでのパスをclasspathに指定してあげるイメージでしょうか。 例えば、classpath ..;.Mainのように、commentファイルから一つ上がjappファイルその中にメインクラスが入っているからそこで実行する。感じでしょうか? いまいちクラスパスの指定の仕方が理解できていません。
sumika1223

2024/01/04 16:18

また、classpath を指定しない場合は、jappの場所が不明になるとのことでしたが、 その場合、Mainをみるので他のクラスの位置や、jappの位置も分からずエラーになるという解釈であっていますでしょうか
hiroki-o

2024/01/04 16:26 編集

逆に説明したほうが、わかりやすかったかな。 java -classpath .;.. Main でも動きは同じです。 で、最初のカレントは「.」でMainクラスを見る、次のカレントは「..」で他の2クラスを探す、でどうでしょうか? (追記) > その場合、Mainをみるので他のクラスの位置や、jappの位置も分からずエラーになるという解釈であっていますでしょうか そうです。仮にMainと同じフォルダーにjappフォルダーが存在した場合は、-classpathは不要です。
sumika1223

2024/01/04 16:43

いろいろと勘違いしていました。 classpath 指定するときは、 C:\Users\kenta\japp>java -classpath ..;. Main のように実行するクラスのカレントディレクトリ「.」から始まり、jappはどこなの?で一つ上の階層だから「..」でclasspathは「 .;..」になっているという解釈で大丈夫ですか? そうすると関連している二つのクラスは自動的にパッケージの頭からたどっていけるので指定はしていない。という解釈ですかね。
hiroki-o

2024/01/04 16:57

はい、それで正しい解釈です。
jimbe

2024/01/04 18:27

その様に分かりにくくなるので、パッケージを使用する場合はコンパイルも実行もパッケージのトップがある場所(本件では C:/users/kenta)をカレントフォルダとして行ったほうが良いです。 その場合パッケージの指定の無いクラスのファイル(Main.javaと生成物Main.class)もそのフォルダに置くことになります。(その方が自然で、何故jappフォルダにMain.classを置いたりそこでコンパイル・実行しようとされているのかが謎なくらいです。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問