プログラムはコンパイル時にライブラリに依存しますが、実行時には依存しないのでしょうか? 質問する

プログラムはコンパイル時にライブラリに依存しますが、実行時には依存しないのでしょうか? 質問する

実行時とコンパイル時の違いと、その区別の仕方は理解していますが、コンパイル時と実行時を区別する必要性を感じません。依存関係

私が困惑しているのは、プログラムが依存しないコンパイル時に依存していた実行時の何かに依存しているのでしょうか? Java アプリが log4j を使用する場合、コンパイル (log4j と統合してメンバー メソッドを呼び出すコード) と実行時 (log4j.jar 内のコードが実行されると何が起こるかをコードがまったく制御できない) に log4j.jar ファイルが必要です。

私は Ivy や Maven などの依存関係解決ツールについて調べていますが、これらのツールはこれら 2 種類の依存関係を明確に区別しています。その必要性が理解できません。

どなたか、私のような貧乏な人間でも理解できるような、実際の例を挙げて、簡単な「キングズイングリッシュ」風の説明をしてくださる方はいらっしゃいませんか?

ベストアンサー1

コンパイル時の依存関係は、通常、実行時に必要になります。Maven では、compileスコープ指定された依存関係が実行時にクラスパスに追加されます (たとえば、wars では WEB-INF/lib にコピーされます)。

ただし、これは厳密には必須ではありません。たとえば、特定の API に対してコンパイルしてコンパイル時の依存関係を作成し、実行時にその API も含む実装を含める場合があります。

プロジェクトのコンパイルに特定の依存関係が必要であるものの、対応するコードは実際には必要ではないという例外的なケースもあるかもしれませんが、これはまれです。

一方、コンパイル時に必要のない実行時依存関係を含めることは非常に一般的です。たとえば、Java EE 6 アプリケーションを作成する場合、Java EE 6 API に対してコンパイルしますが、実行時には任意の Java EE コンテナーを使用できます。実装を提供するのはこのコンテナーです。

リフレクションを使うことでコンパイル時の依存関係を回避できます。例えば、JDBCドライバは次のようにロードできます。Class.forName実際にロードされるクラスは、構成ファイルを通じて構成できます。

おすすめ記事