ryuoh7878
@ryuoh7878

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!

モジュール制作時のエラー

解決したいこと

モジュール制作時に恐らく超基礎的な部分でつまずいてしまいました。
VSCodeにてプログラムを書いています。

スクリーンショット 2025-01-09 105541.png
スクリーンショット 2025-01-09 105610.png

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

appモジュールのmodule-infoにて発生したエラー

lib cannot be resolved to a moduleJava(8389908)

libモジュールのmodule-infoにて発生したエラー

The package toy does not exist or is emptyJava(8389919)

自分で試したこと

appモジュールのエラーはlibのmodule-infoのエラーが原因だと仮定し、
module-infoのエラー解消を試みました。
パッケージ名の部分をlib.パッケージ名に変えてみましたが、
効果はありませんでした。

追加の情報提供は惜しみません。
お力添えの程よろしくお願いいたします。

1

1Answer

モジュールのディレクトリには次の二種類があります

モジュールパス
module-info.javaを保持するフォルダ

モジュールソースパス
モジュールパスが属するルートディレクトリ

ここで注意すべき点が、モジュール名とそれを保持するフォルダ名が一致する場合、モジュールソースパス=モジュールパスの関係が成立することです

今回の場合、libという名前がモジュールとフォルダ共に一致するので、モジュールパス及びそのソースパスは**libフォルダのルート**となります

つまり、モジュール名とフォルダ名が一致するか否かでモジュールパスが変化します
モジュール関連のエラーケースでは、モジュールグラフの正確性とは別に、モジュールパスの不一致パターンが考えられます

あと基本的なことですが、公開するパッケージはソースファイル内でpackageによる修飾が必須です
またjavacではmodule-info.javaとコンパイル対象のJavaファイルのどちらもを指定する必要があります

どのオプションを使用してコンパイルしたのかについて明示があるとより詳しい状況が分かるかと思います

0Like

Comments

  1. @ryuoh7878

    Questioner

    知識不足で申し訳ないですが、わからない箇所がありましたので質問させていただきたいです。

    libフォルダのルートというのはルートディレクトリのことでしょうか?
    この場合はlibのさらに上に"JavaSample"というファイルがあるのですが、それにあたるのでしょうか。

    また、現段階ではコンパイルは行っていません。

  2. @ryuoh7878

    Questioner

    追加で質問したいことができたので、よければ教えていただきたいです。
    スクリーンショット 2025-01-09 155157.png
    この赤い下線部に以下のエラーが発生しました。
    The package main does not exist or is empty
    mainというパッケージは存在しているはずですが、認識されません。
    mainに含まれる"Main.java" "Main2.java"にも
    package main;
    と記述しています。
    原因がわからないため、もしよろしければ教えていただきたいです。

  3. libフォルダのルートというのはルートディレクトリのことでしょうか?
    この場合はlibのさらに上に"JavaSample"というファイルがあるのですが、それにあたるのでしょうか

    その通りです
    ディレクトリの構成がJavaSample/lib/module-info.javaである場合、

    モジュールパス=lib
    モジュールソースパス=JavaSample

    となります
    そして今回はモジュールとモジュールパスが共にlibという名称なので

    モジュールパス=モジュールソースパス=JavaSample

    となります
    モジュールパスとモジュールソースパスが一致していると—module-source-pathオプションが使えます
    モジュールコンパイルのサンプルコマンドでは主にこのオプションを使用した方法しか紹介されないため、モジュール名とフォルダ名はなるべく一致させておくことが望ましいでしょう

    mainというパッケージは存在しているはずですが、認識されません。

    VSCodeの構文解析はリアルタイムではありません
    パッケージの数が多くなるにつれ、解析の正確性は損なわれます
    もしも文法上問題点が確認されない場合、解析が追いついていない可能性があるので、一度コンパイルを走らせた方が賢明です
    どのような拡張機能を使用しているかにもよりますが、事前の解決策はおそらく存在しないので、特にインスタンス化周りのエラーは参考程度に捉えておきましょう

Your answer might help someone💌