ランタイムとコンパイル時の違いと、2つを区別する方法は理解していますが、コンパイル時とランタイム時の依存関係を区別する必要があるだけではわかりません。
コンパイル時および実行時の一般的な概念と、Maven固有compile
およびruntime
スコープの依存関係は、2つの非常に異なるものです。これらは同じフレームを持たないため、直接比較することはできません。一般的なコンパイルおよびランタイムの概念は広範囲ですが、Maven compile
およびruntime
スコープの概念は、時間に応じた依存関係の可用性/可視性(コンパイルまたは実行)に関するものです。
Mavenは何よりもjavac
/ java
ラッパーであり、Javaではで指定するコンパイル時クラスパスとで指定javac -cp ...
するランタイムクラスパスがあることを忘れないでくださいjava -cp ...
。Javaコンパイルとランタイムクラスパスの両方に依存関係を追加する方法として
Maven compile
スコープを考慮することは間違いありません(クラスパス(javac
およびjava
)Maven runtime
スコープは、Javaランタイムクラスパス(javac
)にのみ依存関係を追加する方法と見なすことができます。
私が窒息しているのはこれです:プログラムがコンパイル時に依存している実行時にプログラムが依存しないようにするにはどうすればよいですか?
あなたが説明するものはruntime
、compile
スコープとは何の関係もありません。依存関係をコンパイル時に依存するように指定し、実行時には依存しないように指定
したprovided
スコープのように見えます。
依存関係をコンパイルする必要があるので使用しますが、パッケージ化されたコンポーネント(JAR、WAR、またはその他)に含めたくありません。依存関係はすでに環境によって提供されているためです。サーバーまたはその他に含めることができます。 Javaアプリケーションの起動時に指定されたクラスパスのパス。
私のJavaアプリがlog4jを使用している場合、コンパイル(log4j内からのメンバーメソッドとの統合およびメンバーメソッドの呼び出し)とランタイム(log4j内のコードが発生すると何が起こるかを完全に制御できないコード)のために、log4j.jarファイルが必要です。 .jarが実行されます)。
この場合はい。しかし、後で別のロギング実装(log4J 2、logbackまたはその他)に切り替えることができるように、log4jの前のファサードとしてslf4jに依存するポータブルコードを記述する必要があるとします。
この場合、pomでcompile
依存関係としてslf4jを指定する必要があります(これがデフォルトです)が、log4j依存関係を依存関係として指定しますruntime
。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>...</version>
<scope>runtime</scope>
</dependency>
このように、log4jクラスはコンパイルされたコードで参照できませんでしたが、slf4jクラスを参照することはできます。時間
とともに2つの依存関係を指定した場合compile
、コンパイルされたコードでlog4jクラスを参照することを妨げるものは何もないため、ロギング実装との望ましくない結合を作成する可能性があります。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>...</version>
</dependency>
runtime
スコープの一般的な使用法は、JDBC依存関係宣言です。移植可能なコードを書くために、クライアントコードが特定のDBMS依存関係のクラスを参照することは望ましくありません(たとえば、PostgreSQL JDBC依存関係)。ただし、実行時にクラスを作成するために必要なのと同じように、アプリケーションに含めます。 JDBC APIはこのDBMSで動作します。