mushroom171718
@mushroom171718

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

jarファイルの実行について

解決したいこと

プログラミング初心者です。
パッケージをJARファイルにまとめて実行しようとした所、
エラーが発生しました。解決策を教えて頂きたいです。

ファイル構成は以下の通りです。
jarフォルダ
 ├ main.jar
 ├ toy.jar
 ├ transport.jar
 ├ mainフォルダ
 ├ Toyフォルダ
 └ Transportフォルダ

jar以下の各フォルダには、それぞれのパッケージのクラスファイルが入っています。

発生している問題・エラー

java -cp main.jar:toy.jar:transport.jar main.Main2
エラー: メイン・クラスmain.Main2を検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: main.Main2

該当するソースコード

java -cp main.jar:toy.jar:transport.jar main.Main2

自分で試したこと

スペルミス等は考えられません。

0

3Answer

-cp オプションに複数のクラスパスを渡すときの区切り文字は、 Windows ではセミコロン ; にしてください。

0Like

Comments

  1. @mushroom171718

    Questioner

    指摘いただいた個所を変更後、再度実行しましたが同じエラーが発生しました。
    何か根本的な問題でしょうか。

main.Main2のようなクラスファイルを実行する際はクラスパスにmainのルートディレクトリ(mainが属するフォルダ)を指定します
ここでのmainMain2のパッケージと同義です

java -cp mainのフォルダ:file.jar… main.Main2

また、ファイルの区切り文字はWindowsでは;
Linuxでは:を用います
なお今回のようにjarを実行する際は、-jarオプションの指定が推奨されます

java -jar ./main.jar

jarを構成する際は.mfに少なくとも以下の二つのオプションを要します

Main-Class: main.Main2
Class-Path: file.jar…

Class-Pathには相対パスを用います

0Like

Comments

  1. @mushroom171718

    Questioner

    複数あるクラスパスを”で囲うと実行できました!
    ご協力ありがとうございました

実行コマンド

おそらく端末(ターミナル)での実行を想定されていると思うのですが
windowsのターミナルは PowerShell と cmd で少し挙動が違います。

クラスパスは java -cp "main.jar;toy.jar;transport.jar" main.Main2 のように指定するとどちらでも大丈夫で手っ取り早いです。

jarの中身

もしそれでもまだエラーが出る場合は、jar内の構成や作り方の問題かもしれません。

仮に main.Main2 が main.jar に含まれている場合
main.jar 内部では main フォルダ直下に Main2.class が存在していないといけません。

次のように jar コマンドで確認できます

>  jar -tf main.jar
...
main/Main2.class        //少なくともこのエントリを含む
...
0Like

Comments

  1. @mushroom171718

    Questioner

    ありがとうございます!クラスパスをダブルコーテーションで囲うと無事に実行できました!
    一年よいお年をお過ごしください。

Your answer might help someone💌