回答:
プラグインと依存関係はどちらもJarファイルです。
しかし、それらの違いは、Mavenでのほとんどの作業はプラグインを使用して行われることです。一方、依存関係は、タスクの実行中にクラスパスに追加される単なるJarファイルです。
たとえば、javaファイルをコンパイルするには、compiler-pluginを使用します。プラグインをクラスパスに追加するだけで、コンパイルはトリガーされないため、依存関係としてcompiler-pluginを使用することはできません。ファイルのコンパイル中にクラスパスに追加されるJARファイルは、依存関係として指定されます。
同じことがあなたのシナリオにも当てはまります。いくつかのSpring実行可能ファイルを実行するには、Springプラグインを使用する必要があります[Springプラグインの用途はわかりません。私はここで推測しているだけです]。ただし、これらの実行可能ファイルを実行するには依存関係が必要です。そして、Junitは、ユニットテストの実行のために確実にプラグインによって使用されるため、依存関係の下でタグ付けされます。
したがって、プラグインはタスクを実行するJarファイルであり、依存関係はタスクを実行するクラスファイルを提供するJarであると言えます。
それがあなたの質問に答えることを願っています!
Maven自体は、さまざまなタスクを実行するために使用できるさまざまなユニットを備えたフードプロセッサとして説明できます。これらのユニットはプラグインと呼ばれます。たとえば、プロジェクトをコンパイルするためにmavenがを使用したりmaven-compiler-plugin
、テストを実行しmaven-surefire-plugin
たりするなどです。
Mavenに関する依存関係は、プロジェクトが依存するパッケージ化されたクラスの一部です。jar、warなどを使用できます。たとえば、JUnitテストを記述できるようにするには、JUnitアノテーションとクラスを使用する必要があるため、プロジェクトがJUnitに依存していることを宣言する必要があります。
プラグインと依存関係は非常に異なるものであり、これらは相補的です。
プラグインは、Mavenビルドのタスクを実行します。これらはアプリケーションにパッケージ化されていません。
これらはMavenの中心です。
Mavenによって実行されるタスクはすべて、プラグインによって実行されます。
:プラグインの2つのカテゴリがありますし、プラグインは:build
reporting
<build/>
れ、POMの要素で構成する必要があります。<reporting/
れ、POMの>要素で構成する必要があります。 コマンドラインで指定されたMavenゴール(たとえばmvn clean
、 mvn clean package
またはmvn site
)に従って、特定のライフサイクルが使用され、プラグインゴールの特定のセットが実行されます。
組み込みビルドライフサイクルにはdefault
、clean
との3つがあります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
中にはまだ一部または宣言!実際、一部のプラグインは、実行中にクラスパスにいくつかの依存関係を必要とする場合があります。それは一般的ではありませんが、それが起こる可能性があります。
ここでの例であるドキュメント番組があることということと一緒に働くことは: plugin
plugin
dependency
たとえば、Maven Antrunプラグインバージョン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
スコープは、依存関係は、プロジェクトのすべてのクラスパスで利用可能であることを意味します。
スコープは、依存関係を追加する必要があるクラスパスを定義します。たとえば、コンパイルと実行時に必要ですか、それともテストのコンパイルと実行にのみ必要ですか?
たとえば、以前はcompile
どこでも必要なため、依存関係としてHibernateを定義していました。ソースコンパイル、テストコンパイル、ランタイムなどです。
ただし、テストライブラリをアプリケーションにパッケージ化したり、ソースコードで参照したりしたくない。したがって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>
webdriver-ie
にすると、次の2つのオプションがあります。plugins
またはdependency
、両方を含めて比較しましたが、どちらもまったく同じでgroupId
あることがわかりました。唯一の違いはplugins
、特定のバージョンが付属していないことですが、dependency
付属し付属していること0.6.685
です。(この例に関連して)素人でそれについて説明していただけますか?なにか提案を?
pom.xml
。しかし、興味深いのは、Maven 3以降(おそらく機能として悪い考え)、Mavenバージョンでは依存関係バージョンの指定が必須であるということです(現在のpomまたは継承された依存関係の場合は親pomで)。プラグインのバージョンの指定はオプションです。Mavenは、Mavenが見つけたリリースリポジトリで入手可能な最後のバージョンを使用します。(1/2)
私のようなフロントエンドのバックグラウンドから来ていて、Gruntとnpmに精通している場合は、次のように考えてください。
最初に、たとえばを実行しますnpm install grunt-contrib-copy --save-dev
。これはメイブンの<dependency></dependency>
です。ビルドタスクの実行に必要なファイルをダウンロードします。
次に、Gruntfile.jsでタスクを構成します
copy: {
main: {
src: 'src/*',
dest: 'dest/',
},
}
これはmavenのようなもの<plugin>/<plugin>
です。npm /によってダウンロードされたコードをどうするかをビルドツールに指示しています<dependency></dependency>
。
もちろん、これは正確な類推ではありませんが、頭を包み込むのに十分なほど近いです。
プラグインは、Maven
それ自体に機能を追加するために使用されます(eclipse
サポートの追加やSpringBoot
サポートの追加Maven
など)。ソースコードが依存関係を必要とするのは、Mavenフェーズ(compile
またはtest
など)を通過するためです。以下の場合、JUnit
テストコードは基本的にあなたのコードベースの一部であり、あなたが呼び出すので、JUnit
テストスイートおよびそれらのコマンド内の特定のコマンドはによって提供されていないJava SDK
ため、JUnit
一度に存在している必要がありますMaven
テスト段階にあり、これは言及によって処理されJUnit
、依存関係としてあなたの中pom.xml
のファイル。
中心的なMavenはプラグイン実行フレームワークです-正式および標準のコンパクトな定義に従って。より明確にするために、使用するコマンドはmaven-install/clean/compile/build etc
jarの作成/実行に似ていますが、手動で実行することもあります。したがって、実行(または構成または実行)したいものは、基本的にそれらをmavens pomの依存関係タグに配置し、誰がこれらの依存関係を実行するか(環境のセットアップに必要)がプラグインになるように回答します。
javac (compiler) dependency.java (dependency)