teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

483閲覧

java モジュール

k.fujisawa

総合スコア42

Java

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2024/03/02 07:51

0

0

モジュールパスに配置されたclassファイルに関して
(jarファイルに圧縮されてないclassファイル)

以下の認識で合っていますでしょうか? このclassファイルは無名モジュール・自動モジュールに属さない。

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

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

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

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

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

k.fujisawa

2024/03/16 10:33 編集

<packageA.java> package packageA; public class packageA { public static void main(String[] args) { System.out.println(packageB.packageB.class); } } <packageB.java> package packageB; public class packageB {} <コンパイル・jarファイル作成> cd /temporary & javac -encoding utf-8 ./tempA/packageA/packageA.java ./tempB/packageB/packageB.java & jar -cf ./tempA/automaticA.jar -C ./tempA ./packageA/packageA.class <ディレクトリ構造> cd /temporary & tree /f C:. │ java │ javac ├─tempA │ │ automaticA.jar │ └─packageA │ packageA.class │ packageA.java └─tempB │ └─packageB │ packageB.class │ packageB.java <①-cp> cd /temporary & java --show-module-resolution -cp ./tempA/automaticA.jar;./tempB packageA.packageA class packageB.packageB <②-cp -p> cd /temporary & java --show-module-resolution -cp ./tempB -p ./tempA -m automaticA/packageA.packageA root automaticA file:///C:/temporary/./tempA/automaticA.jar automatic class packageB.packageB <③-p> cd /temporary & java --show-module-resolution -p ./tempA;./tempB -m automaticA/packageA.packageA root automaticA file:///C:/temporary/./tempA/automaticA.jar automatic Exception in thread "main" java.lang.NoClassDefFoundError: packageB/packageB
k.fujisawa

2024/03/16 08:18 編集

動作確認できたので、エビデンスとして追記しました。
guest

回答1

0

ベストアンサー

モジュールパスに入っているなら少なくとも無名モジュールでは無いでしょう。
後はモジュール定義が有るか無いかで、名前付きモジュールか自動モジュールかかと思います。

『モジュールパスに class ファイルを置いて使えるのか』の情報を探しましたが、見つかりませんでした。

モジュール定義(module-info.java)が無い jar をモジュールパスに入れて(自動)モジュールとして使えるのは、マニフェスト内情報や jar ファイル名からモジュール名が自動的に決められるからで、だとしたら class だけを置いてもモジュール名は付けられそうもありません。そうなるとその class はモジュールシステム上は見えないため、無名・自動・名前付きのどれでも無い…というよりは存在そのものが無いということになりそうです。

投稿2024/03/02 08:56

編集2024/03/02 20:39
jimbe

総合スコア13350

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

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

k.fujisawa

2024/03/02 09:25

加えて、自動モジュールは、jarファイルのみが対象になるかと思います。 jarファイルに圧縮されてない、むき出しのclassファイルに対しては無名モジュール・自動モジュールのような互換性維持機能は用意されていない。この認識で合ってますでしょうか?
jimbe

2024/03/02 10:38 編集

そもそもモジュールはパッケージの衝突を回避するためにパッケージの上位としてありますので、 jar かどうかは結果的にであってどこのモジュールに属することになるかは関係無いものと思っています。 java9 以降においては全てのクラスが(無名パッケージも含めて何れかのパッケージに属するのと同じく)何れかのモジュールに属していなければならず、その為に互換機能として無名モジュールというものが存在するのであって、名前付きでも自動でも無名でも無いというのは存在自体があり得ません。。
k.fujisawa

2024/03/05 19:39 編集

無名モジュールは、jarファイルに圧縮されていないむき出しのclassファイルも対象となる。 一方で、自動モジュールはjarファイルに圧縮されているclassファイルのみ対象となる。 この認識で合ってますでしょうか。
jimbe

2024/03/02 20:09 編集

考え直して回答を変更しました。
k.fujisawa

2024/03/03 05:44

丁寧に解答していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問