私はmavenツールを初めて使います。SpringとHibernateでプロジェクトを作成し、pom.xmlでプラグインとして構成されていますが、JUnitは依存関係でタグ付けされています。私の質問は、プラグインと依存関係の背後にあるロジックは何ですか?
プラグインと依存関係は両方ともJarファイルです。
しかし、両者の違いは、Mavenのほとんどの作業がプラグインを使用して行われることです。一方、依存関係は、タスクの実行中にクラスパスに追加される単なるJarファイルです。
たとえば、コンパイラプラグインを使用してJavaファイルをコンパイルします。コンパイラプラグインを依存関係として使用することはできません。クラスパスにプラグインを追加するだけで、トリガしないためです。任意のコンパイル:ファイルのコンパイル中にクラスパスに追加されるJarファイルは、依存関係として指定されます。
シナリオにも同じことが言えます。 spring-pluginを使用して、いくつかのspring実行可能ファイルを実行する必要があります[spring-pluginの用途がわかりません。ここで推測しています。ただし、これらの実行可能ファイルを実行するには依存関係が必要です。また、Junitは、ユニットテストを実行するためにsurefire-pluginによって使用されるため、依存関係でタグ付けされます。
したがって、プラグインはタスクを実行するJarファイルであり、依存関係はタスクを実行するクラスファイルを提供するJarです。
それがあなたの質問に答えることを願っています!
Maven自体は、さまざまなタスクを実行するために使用できる多くのさまざまなユニットを備えたフードプロセッサとして説明できます。これらのユニットはプラグインと呼ばれます。たとえば、プロジェクトをコンパイルするには、mavenはmaven-compiler-plugin
を使用し、テストを実行するにはmaven-surefire-plugin
などを使用します。
Mavenの観点からの依存関係は、プロジェクトが依存するパッケージ化されたクラスです。たとえば、JUnitテストを記述できるようにするには、JUnitアノテーションとクラスを使用する必要があるため、プロジェクトがJUnitに依存していることを宣言する必要があります。
プラグインと依存関係は非常に異なっており、これらは補完的なものです。
プラグインはMavenビルドのタスクを実行します。これらはアプリケーションにパッケージ化されていません。
これらはMavenの中心です。
Mavenによって実行されるタスクはすべてプラグインによって実行されます 。
プラグインには2つのカテゴリがあります: build
およびreporting
プラグイン :
<build/>
要素で構成する必要があります。<reporting/
>要素で構成する必要があります。コマンドラインで指定されたMavenの目標(たとえば、mvn clean
、mvn clean package
、またはmvn site
)に従って、 特定のライフサイクル が使用され、特定のセットがプラグインの目標が実行されます。
3つの組み込みビルドライフサイクルがあります:default
、clean
、およびsite
。 default
ライフサイクルはプロジェクトのデプロイメントを処理し、clean
ライフサイクルはプロジェクトのクリーニングを処理し、site
ライフサイクルはプロジェクトのサイトドキュメントの作成を処理します。
プラグインの目標は、特定のライフサイクルの特定のフェーズにバインドされる場合があります。
たとえば、maven-compiler-plugin
は、デフォルトでcompile
目標をライフサイクルフェーズにバインドします:compile
。
ほとんどのmavenプラグイン(コアプラグインとサードパーティプラグインの両方)は、構成よりも規約を優先します。そのため、これらは一般に、プラグインの目標を特定のフェーズに結び付けて、使用を簡単にしました。
それはすっきりしており、エラーが発生しにくいです:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
より:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
依存関係は、Mavenビルド中にクラスパスに必要なMavenアーティファクト/コンポーネントです。
これらはアプリケーションにパッケージ化されている場合がありますが、必ずしもそうではありません(以下のscope
を参照)。
ほとんどの依存関係はjarですが、これらは他の種類のアーカイブ(war、ear、test-jar、ejb-client ...、またはPOMまたはBOM)である場合もあります。
pom.xmlでは、依存関係は複数の場所で指定できます:<build><dependencies>
パート、dependencies management
パート、またはa plugin
宣言!実際、一部のプラグインは、実行中にクラスパスにいくつかの依存関係を持つ必要があります。それは一般的ではありませんが、起こる可能性があります。
documentation の例は、plugin
とdependency
が一緒に機能することを示しています。
たとえば、Maven Antrun Pluginバージョン1.2はAntバージョン1.6.5を使用します。このプラグインの実行時に最新のAntバージョンを使用する場合は、次のような
<dependencies>
要素を追加する必要があります。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
...
<dependencies>
<dependency>
<groupId>org.Apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.Apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
...
</project>
Mavenでは、依存関係は特定の形式で参照されます:groupId:artifactId:packaging:classifier:version
。
分類子(オプション)とパッケージ(デフォルトではJAR
)は、一般的に指定されていません。したがって、dependency
宣言の一般的な形式は、むしろgroupId:artifactId:version
です。
これは、<build><dependencies>
部分で宣言された依存関係の例です。
<build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.14.Final</version>
</dependency>
<dependencies>
</build>
プラグインとは異なり、依存関係にはスコープがあります。
デフォルトのスコープはcompile
です。これが最も一般的に必要とされる範囲です(構成よりも規約)。
_compile
スコープは、プロジェクトのすべてのクラスパスで依存関係が利用可能であることを意味します。
スコープは、依存関係を追加するクラスパスを定義します。たとえば、コンパイル時と実行時、またはテストのコンパイルと実行時にのみ必要ですか?
たとえば、以前はHibernateをどこでも必要に応じてcompile
依存関係として定義しました。ソースのコンパイル、テストのコンパイル、ランタイムなどです。
しかし、テストライブラリがアプリケーションにパッケージ化されたり、ソースコードで参照されたりすることは望ましくありません。そのため、それらにtest
スコープを指定します。
<build>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>
<dependencies>
</build>
プラグインは、Maven
自体に機能を追加するために使用されます(Eclipse
サポートまたはSpringBoot
サポートをMaven
などに追加するなど)。 Mavenフェーズ(compile
またはtest
など)を渡すには、ソースコードに依存関係が必要です。 JUnit
の場合、テストコードは基本的にコードベースの一部であり、テストスイート内でJUnit
固有のコマンドを呼び出しますが、これらのコマンドはJava SDK
したがって、JUnit
がテスト段階にあるときにMaven
が存在している必要があり、これはJUnit
をpom.xml
ファイル。
あなたが私のようなフロントエンドのバックグラウンドから来ていて、Gruntとnpmに精通しているなら、このように考えてください:
最初に、たとえばnpm install grunt-contrib-copy --save-dev
を実行します。これはmavenの<dependency></dependency>
に似ています。ビルドタスクの実行に必要なファイルをダウンロードします。
次に、Gruntfile.jsでタスクを構成します
copy: {
main: {
src: 'src/*',
dest: 'dest/',
},
}
これはmavenの<plugin>/<plugin>
に似ています。 npm/<dependency></dependency>
によってダウンロードされたコードをどうするかをビルドツールに伝えています。
もちろん、これは正確なアナロジーではありませんが、頭を包み込むのに十分なほど近いものです。
Mavenはその中心にあるプラグイン実行フレームワークであり、正式かつ標準のコンパクトな定義に従っています。より明確にするために、使用するコマンドはmaven-install/clean/compile/build etc
jarの作成/実行用。これも時々手動で実行します。したがって、実行する(または構成または実行する)ものは、基本的にmavens pomの依存関係タグに配置し、これらの依存関係を実行する(環境のセットアップに必要な)ための答えはプラグインになります。
javac (compiler) dependency.Java (dependency)