TaikiTkwkbysh
@TaikiTkwkbysh (WAKA Engineer)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JARファイルが実行できない

解決したいこと

JARファイルを実行したい。

現在javaを勉強している者です。
JARファイルを実行できず困っている状況です。

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

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

①ソースファイル(Bank.java)の作成

package main.java;

/** 銀行クラス。
 * このクラスは1つの銀行を表します。
 */
public class Bank {

    /**ユーザー名*/
    String name;
    /**住所*/
    String address;

    /**アカウント追加メソッド
     * 口座名義人の名前と残高を引数に、アカウントを追加します。
     */
    public void addAccount(String owner, int initZandaka) {}

    public static void main(String[] args) {
        System.out.println("試験用のメインメソッドです。");

    }
}

②コンパイルし、Bank.classを作成

③mainclass.txtの作成

Manifest-Version: 1.0
Main-Class: main.java.Bank

④jarファイルの作成

 jar -cvfm Bank.jar mainclass.txt bin/main/java/Bank.class

MANIFEST.MF内部

Manifest-Version: 1.0
Main-Class: main.java.Bank
Created-By: 11.0.12 (Eclipse Foundation)

jarファイルを作成した時のディレクトリ構成は下記の通りです。

PomProject
|
|←現在地(/Users/username/desktop/PomProject)
|
|---bin
|    |-- main
|          |--java
|                |--Bank.class
|
|---src
|    |-- main
|          |--java
|                |--Bank.java
|
|-----Bank.jar
|
|-----mainclass.txt

⑤jarファイルの実行

PomProject % java -jar Bank.jar

※この状態でjarファイルを実行すると、エラーが出る状態です。

自分で試したこと

別のサイトでも同じような質問があり、マニフェストファイルやjarファイルの位置を変えたりましたが解決しませんでした。
https://teratail.com/questions/287939

出ているエラーがメインクラスの検出ができないとの事なので、ディレクトリの構成が悪いか、マニフェストファイルに記述しているMain-ClassのFQCNが悪いのかと考えています。
ただ後者の場合、Bank.javaに記載しているパッケージ名と同じ記載をしているので、Bank.javaのパッケージがそもそも問題があるという事になりそうですが、Eclipseでは特にエラーは出ていません。
何卒ご教示の程、宜しくお願い致します。

0

7Answer

 jar -cvfm Bank.jar mainclass.txt bin/main/java/Bank.class

このコマンドでは、 JAR ファイルに bin/main/java/Bank.class がこのパスのまま格納されます。これは jar -tf Bank.jar で内容のリストを表示すると確認できます。

JAR ファイルに格納されたクラスファイルはパスの階層がパッケージ階層と一致している必要がありますが、 bin/main/java/Bank.class は bin/ の部分が一致しません。そのせいでクラスファイルが検出できないエラーになります。

解決するにはクラスファイルを main/java/Bank.class に移動して

 jar -cvfm Bank.jar mainclass.txt main/java/Bank.class

とするか、 bin/main/java/Bank.class に置いたまま、基準のディレクトリを一時的に変更するオプション -C を使って

 jar -cvfm Bank.jar mainclass.txt -C bin main/java/Bank.class

としてください。

1Like

エラーによればクラスバージョン61.0(Java 17 相当)のファイルをクラスバージョン55.0(Java 11 相当)までしか対応しないランタイムで実行しているようです。 Java 17 に対応したランタイムで実行してください。

あるいは Java 11 向けのクラスファイルにコンパイルするように設定することもできます。 Eclipse の設定またはプロジェクトの設定→Java→コンパイラー→コンパイラー準拠レベルを11に下げてください。

1Like

①IDEでの作成〜実行と、ターミナルを使用した作成〜実行はどちらも慣れておいた方が良いのでしょうか。

基本的には IDE を使うことになるでしょうが、ターミナルでの作業を覚えておくと以下の利点があります。

  • 特殊なコンパイルオプションやビルド手順が複雑なプロジェクトについてなど高度なトピックを検索するときは、ターミナルを使用した情報のほうが見つかりやすい
  • IDE 固有の知識と Java に共通する知識を見分けやすくなる。結果、現場に合わせて IDE を乗り換えることになっても、ターミナルでできることは IDE でもできそうだと当たりをつけられるようになる

②バージョンが全てバラバラになっているのですが、これは環境としては良くない環境なのでしょうか。

システムの Java と IDE の Java が異なるのは問題ないことで、普通にありえます。開発環境ならメジャーバージョンを揃えた方が便利ではあります。

/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java は今は使われなくなったブラウザプラグインの Java です。これが起動することはまずないので無視して構いません。

③もしjava、JDKのバージョンをeclipseのバージョンに合わせる場合、現在のjavaを全てアンインストールし、java17に対応するJavaとJDKとJREを再度インストールする必要があるのでしょうか。

複数のバージョンが共存できるので追加でインストールするだけで大丈夫です。たぶん最新のバージョンがデフォルトになると思います。デフォルト以外のバージョンを使うにはこちらの記事を参照してください https://stackoverflow.com/questions/21964709/how-to-set-or-change-the-default-java-jdk-version-on-macos

1Like

〜で確認できるバージョンは、ブラウザ上でjavaで開発された何かを利用する為のソフトウェアのバージョン

その通りです。

開発として意識するのは
JDKのバージョン : JDK:11.0.12  JRE Temurin-11.0.12+7 (build 11.0.12+7)
のバージョンの方

ターミナルで javac コマンドや java コマンドを使う場合においては、そうです。 Eclipse の Full Edition は別個の JDK を内蔵しているので、 Eclipse でプロジェクトをビルドする場合はそちらのバージョンを意識する必要があります。(お使いの Eclipse では Java 17 のようですね。また Eclipse の設定でシステム側の JDK を使うように切り替えることもできます。)

開発環境においてはメジャーバージョン(開発時に利用するバージョン?)を揃えておいた方が便利。
但し、IDEとjava(今現在利用しているJDK、JRE)のバージョンが違うこと自体は問題ではない。

メジャーバージョンとは、一般的にソフトウェアのバージョンで X.Y.Z の X 部分を指します。ここが変わると大きな機能追加や過去バージョンとの互換性がなくなる変更が入ることが多く、 Y や Z が変わるときは小さな機能追加やバグ修正が入ることが多いです。(バージョニングのルールはソフトウェアによって千差万別なので大まかな傾向と捉えてください。)

システムの JDK と IDE で使う JDK を同じメジャーバージョン(たとえば Java 17系)に揃えておくと、今回のような非互換性に起因するエラーが起きづらくなって便利ということです。

javaでの開発をするには、下記のURLでインストールするJavaが必ず必要があると勘違いしていました。

Java 仕様に適合した JDK は Oracle 以外にも各社が出していますし、 Eclipse など Java 用の IDE に内蔵されている場合もあります。どれかが入っていれば開発できます。

1Like

Comments

  1. @TaikiTkwkbysh

    Questioner

    @uasi様

    お忙しい中ご添削頂き、誠にありがとうございます。
    内容、承知致しました。
    @uasi様の大変分かりやすいご説明のおかげで、無事解決することができました。
    いつも大変助かっております。
    大変恐縮ではございますが、今後ともご教示頂けますと幸いでございます。
    以上 、宜しくお願い申しあげます。

@uasi

度々ご教示頂き、誠にありがとうございます。
ご教示いただきました内容を踏まえ、下記のような形で対応してみました。
①Jarファイルの再作成

jar -cvfm Bank.jar mainclass.txt /main/java/Bank.class

②ディレクトリの層を変更

PomProject
|
|
|---bin
|      |←現在地(/Users/username/desktop/PomProject/bin)
|      |-----Bank.jar
|      |-----mainclass.txt
|      |-- main
|               |--java
|                      |--Bank.class
|
|---src
|    |-- main
|          |--java
|                |--Bank.java
|

この状況で実行したところ、恐らくうまくいったのかと思いますが、次に別のエラーが発生致しました。

エラー: メイン・クラスBankのロード中にLinkageErrorが発生しました
	java.lang.UnsupportedClassVersionError: Bank has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

JDKのバージョンが古いという事なのでしょうか。
java -version、javac -versionで表示される項目は下記です。

//java -version
openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment Temurin-11.0.12+7 (build 11.0.12+7)
OpenJDK 64-Bit Server VM Temurin-11.0.12+7 (build 11.0.12+7, mixed mode)

//javac -version
javac 11.0.12

//JREのバージョン
/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/ java -version
java version "1.8.0_311

度々で申し訳ございませんが、ご教示頂けますと幸いでございます。

0Like

@uasi

度々ご教示頂き、誠にありがとうございます。
バージョン等色々確認したところ、解決致しました。

プロジェクトファイルをeclipseで作成した際、コンパイラJDK準拠レベル17、実行環境JRE17で設定してた事が原因だったかと思います。
どちらも11に下げたところ、無事うまく実行ができました。
とても良い勉強になりました。

またこちらの件でいくつか感じた事がございます。
度々で申し訳ございませんが、お時間の余裕がある時で結構でございますので、ご教示頂けますと幸いです。

①IDEでの作成〜実行と、ターミナルを使用した作成〜実行はどちらも慣れておいた方が良いのでしょうか。まだ現場に出て働いたことのない人間ですので、今後の為に参考にしたく存じます。

②eclipseのバージョン : コンパイラJDK準拠レベル17、実行環境JRE17
JDKのバージョン : JDK:11.0.12  JRE Temurin-11.0.12+7 (build 11.0.12+7)
Javaのバージョン : 1.8.0_311
上記バージョンが全てバラバラになっているのですが、これは環境としては良くない環境なのでしょうか。

③もしjava、JDKのバージョンをeclipseのバージョンに合わせる場合、現在のjavaを全てアンインストールし、java17に対応するJavaとJDKとJREを再度インストールする必要があるのでしょうか。

質問の内容が支離滅裂でしたら、申し訳ございません。

宜しければご教示の程、宜しくお願い致します。

0Like

@uasi

お忙しい中ご教示板頂き、誠にありがとうございます。
③のURLの内容、難しそうですが少しずつ読み進めて理解していきます。

その他の件につきましては、承知致しました。
特に②の

/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java は今は使われなくなったブラウザプラグインの Java です。これが起動することはまずないので無視して構いません。

については、以下のように解釈致しました。
/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/javaで確認できるバージョンは、ブラウザ上でjavaで開発された何かを利用する為のソフトウェアのバージョンで、開発にはおいては特に関係がないから無視して良い。

開発として意識するのは
JDKのバージョン : JDK:11.0.12  JRE Temurin-11.0.12+7 (build 11.0.12+7)
のバージョンの方で、こちらをIDEのバージョンと合わせるには、新しいJDKをインストールする必要がある。
開発環境においてはメジャーバージョン(開発時に利用するバージョン?)を揃えておいた方が便利。
但し、IDEとjava(今現在利用しているJDK、JRE)のバージョンが違うこと自体は問題ではない。

javaでの開発をするには、下記のURLでインストールするJavaが必ず必要があると勘違いしていました。
https://www.java.com/ja/download/help/download_options_ja.html#mac
なので、java -versionで出てくるものと、/Library/ ~ /bin/java で表示されるものの違いが全く分からずにいましたが、かなりスッキリしました。
プログラミングスクールが掲載しているjavaのインストール方法を調べると、JDKのインストール方法から始まるのも謎に思っていましたが、ようやく解決できた気がします。(間違っていましたら、申し訳ありません。)

度々ご教示頂き、ありがとうございました。
もし解釈が間違っていましたら、添削頂けますと幸いでございます。

0Like

Your answer might help someone💌