web-dev-qa-db-ja.com

javac(JDK 9)で--class-pathと--module-pathを混在させることはできますか?

以前にコンパイルした他のモジュールに依存するモジュールをコンパイルするとき、--module-path <directory>オプションを指定する必要があります。これにより、依存するモジュールが表示されます。

しかし同時に、いくつかの非モジュラーJarファイルも表示したいと思います。ただし、自動モジュールを作成せず、--class-path some.jarの隣に--module-path <directory>を指定するだけの場合、javacはclaspathを無視するようで、「パッケージyyyが見つかりません」とスローします。その他の「見つかりません」エラー。

--class-path--module-pathを同時に(コンパイル)使用することは違法であるが、javacはそれに対して警告しないことを理解できます。

21
malloc4k

--classpathオプションと--module-pathオプションを同時に使用することは、違法ではない。クラスパスを明示的に指定しない場合でもdefaults現在のディレクトリに両方を同時に使用することができます。

javac -helpメッセージの詳細と javac tools docs -

--module-path <path>, -p <path>

アプリケーションモジュールの場所を指定する

--class-path <path>, -classpath <path>, -cp <path>

ユーザークラスファイルと注釈プロセッサの場所を指定する

--class-path-classpath、または-cpが指定されていない場合ユーザークラスパスは、現在のディレクトリです。


Edit:@MouseEventのおかげで、おそらく質問の一部を見逃していました

ただし、それらを自動モジュールにせず、--module-pathの隣に--class-path some.jarを指定するだけの場合、javacはclaspathを無視するようで、「package yyy not found」およびその他の「not found」をスローします「エラー。

それらを自動化しない場合、 モジュールシステムの名前のないモジュール および-として扱われます

実際、名前付きモジュールは、名前なしモジュールへの依存を宣言することさえできません。名前付きモジュールがクラスパスの任意のコンテンツに依存することを許可すると、信頼できる構成が不可能になるため、この制限は意図的なものです。

さらに、unnamedモジュールはすべてのパッケージをエクスポートするため、automaticモジュールは、クラスパスからロードされたすべてのパブリックタイプにアクセスできます。

ただし、クラスパスの型を使用する自動モジュールは、明示的なモジュールが名前のないモジュールへの依存関係を宣言できないため、それらの型をそれに依存する明示的なモジュールに公開する必要はありません

明示的モジュールcom.foo.appのコードがcom.foo.barのパブリックタイプを参照し、たとえば、そのタイプのシグネチャがまだ存在するJARファイルのいずれかのタイプを参照する場合クラスパスcom.foo.appのコードは、com.foo.appが名前のないモジュールに依存できないため、そのタイプにアクセスできません。

これは、com.foo.appを一時的に自動モジュールとして処理して、クラスパス上の関連JARファイルが自動モジュールとして処理されるか、または明示的なモジュール。

9
Naman