pom xmlの依存関係タグとプラグインタグのMavenの違いは何ですか?


118

私はmavenツールを初めて使用し、SpringとHibernateを使用してプロジェクトを作成しました。これらはpom.xmlでプラグインとして構成されていますが、JUnitは依存関係の下でタグ付けされています。私の質問は、プラグインと依存関係の背後にあるロジックは何ですか?

回答:


213

プラグインと依存関係はどちらもJarファイルです。

しかし、それらの違いは、Mavenでのほとんどの作業はプラグインを使用して行われることです。一方、依存関係は、タスクの実行中にクラスパスに追加される単なるJarファイルです。

たとえば、javaファイルをコンパイルするには、compiler-pluginを使用します。プラグインをクラスパスに追加するだけで、コンパイルはトリガーされないため、依存関係としてcompiler-pluginを使用することはできません。ファイルのコンパイル中にクラスパスに追加されるJARファイルは、依存関係として指定されます。

同じことがあなたのシナリオにも当てはまります。いくつかのSpring実行可能ファイルを実行するには、Springプラグインを使用する必要があります[Springプラグインの用途はわかりません。私はここで推測しているだけです]。ただし、これらの実行可能ファイルを実行するには依存関係が必要です。そして、Junitは、ユニットテストの実行のために確実にプラグインによって使用されるため、依存関係の下でタグ付けされます。

したがって、プラグインはタスクを実行するJarファイルであり、依存関係はタスクを実行するクラスファイルを提供するJarであると言えます。

それがあなたの質問に答えることを願っています!


誰かが実行のフェーズと目標の違いを教えてもらえますか?私が知っているように、フェーズはmavenのライフサイクルについて話している....しかし、なぜ再び目標なのか?ヒントはありますか?時々私は人々が目標にライフサイクルキーワードを置いているのを見ます... ??? (?。?)
taymedee 2015年

@taymedeeこのSOの質問には、違いを説明しますstackoverflow.com/questions/16205778/...
dev_feed

1
@ r981回答をより明確にする必要があります。この回答の方が優れています。stackoverflow.com
Digital Impermanence

この回答の見落とし点は、トップレベルの依存関係が主にプラグインではなくアーティファクトによって使用されることです。
lfree 2016年

3
@MichaelPacheco、つまり、Springプラグインは一連のコードを実行する特定のタスクを実行します。これは、「依存関係」によって指定される一部のライブラリに依存している可能性があります。別の例を見てみましょう。コードを実行するにはコンパイラが必要です。ここで、コンパイラはプラグインであり、コードは実行可能ファイルです。コンパイラーだけで任意のコードを実行できますが、コードはライブラリーに依存している可能性があります(apache commonsなど)。これは依存関係になります。コンパイラは、依存関係がクラスパスに存在する場合にのみコードをコンパイルできます。私はそれが今はっきりしていることを望みます。
r9891

37

Maven自体は、さまざまなタスクを実行するために使用できるさまざまなユニットを備えたフードプロセッサとして説明できます。これらのユニットはプラグインと呼ばれます。たとえば、プロジェクトをコンパイルするためにmavenがを使用したりmaven-compiler-plugin、テストを実行しmaven-surefire-pluginたりするなどです。

Mavenに関する依存関係は、プロジェクトが依存するパッケージ化されたクラスの一部です。jar、warなどを使用できます。たとえば、JUnitテストを記述できるようにするには、JUnitアノテーションとクラスを使用する必要があるため、プロジェクトがJUnitに依存していることを宣言する必要があります。


迅速な返信に感謝します。申し訳ありませんが、JUnitもフレームワークであり、(hibernate、spring)もフレームワークのみに含まれるため、依存関係タグで(hibernate、spring)も構成できるため、混乱しています。 ?あなたが私の質問を受けたことを願っています。
コーラル

はい、私が知る限り、Spring mavenプラグインなどはありません。通常、Spring libs(またはHibernate、JUnit、TestNGなど)は、プロジェクトの依存関係として宣言されます。あなたがmavenが初めての場合は、この非常に優れた本を読むことをお勧めします。
Andrew Logvinov

@AndrewLogvinov-API自動化テスト用のマルチpomプロジェクトがあります。Mavenプロジェクトの1つに自動化テストがあります。プロジェクトpomのビルドセクションには1つのプラグインしかありませんでした-スイートを参照するmaven surefireプラグイン。ビルドタグ全体が削除されました。これが何を意味するのか教えて頂けませんか?ありがとう。
MasterJoe

15

プラグインと依存関係は非常に異なるものであり、これらは相補的です。

プラグインとは?

プラグインは、Mavenビルドのタスクを実行します。これらはアプリケーションにパッケージ化されていません。

これらはMavenの中心です。
Mavenによって実行されるタスクはすべて、プラグインによって実行されます
:プラグインの2つのカテゴリがありますし、プラグインはbuildreporting

  • ビルドプラグインはビルド中に実行さ<build/>れ、POMの要素で構成する必要があります。
  • レポートプラグインはサイトの生成中に実行さ<reporting/れ、POMの>要素で構成する必要があります。

コマンドラインで指定されたMavenゴール(たとえばmvn cleanmvn clean packageまたはmvn siteに従って、特定のライフサイクルが使用され、プラグインゴールの特定のセットが実行されます。
組み込みビルドライフサイクルにはdefaultcleanとの3つがありますsitedefaultライフサイクルは、プロジェクトの展開を扱う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
plugindependency

たとえば、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>

素晴らしい説明!、私はJavaでの依存関係の設定に精通していないので、まだ疑問があります。現在IntelliJで作業していて、Mavenプロジェクトを作成しました。含めるようwebdriver-ieにすると、次の2つのオプションがあります。pluginsまたはdependency、両方を含めて比較しましたが、どちらもまったく同じでgroupIdあることがわかりました。唯一の違いはplugins、特定のバージョンが付属していないことですが、dependency付属し付属していること0.6.685です。(この例に関連して)素人でそれについて説明していただけますか?なにか提案を?
Anu

1
あなたを見ないで最も正確な答えを出すのは難しいpom.xml。しかし、興味深いのは、Maven 3以降(おそらく機能として悪い考え)、Mavenバージョンでは依存関係バージョンの指定が必須であるということです(現在のpomまたは継承された依存関係の場合は親pomで)。プラグインのバージョンの指定はオプションです。Mavenは、Mavenが見つけたリリースリポジトリで入手可能な最後のバージョンを使用します。(1/2)
davidxxx

1
プラグインを指定することは悪い方法であることに注意してください。時間の経過とともにビルドが再現可能になるわけではありません(cwiki.apache.org/confluence/display/MAVEN/…)。ビルドで警告が表示されます。それで、「違いは何ですか?」プラグインはMavenビルドのタスクを実行しますが、ビルド中の依存関係はクラスパスで必要なライブラリ(jarなど)です。プロジェクトのビルドがどの場合も同じである場合(ライブラリまたはプラグインの方法を使用)、プラグインは使用されていないため
役に立た

6

私のようなフロントエンドのバックグラウンドから来ていて、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>

もちろん、これは正確な類推ではありませんが、頭を包み込むのに十分なほど近いです。


4

プラグインは、Mavenそれ自体に機能を追加するために使用されます(eclipseサポートの追加やSpringBootサポートの追加Mavenなど)。ソースコードが依存関係を必要とするのは、Mavenフェーズ(compileまたはtestなど)を通過するためです。以下の場合、JUnitテストコードは基本的にあなたのコードベースの一部であり、あなたが呼び出すので、JUnitテストスイートおよびそれらのコマンド内の特定のコマンドはによって提供されていないJava SDKため、JUnit一度に存在している必要がありますMavenテスト段階にあり、これは言及によって処理されJUnit、依存関係としてあなたの中pom.xmlのファイル。


1

中心的なMavenはプラグイン実行フレームワークです-正式および標準のコンパクトな定義に従って。より明確にするために、使用するコマンドはmaven-install/clean/compile/build etcjarの作成/実行に似ていますが、手動で実行することもあります。したがって、実行(または構成または実行)したいものは、基本的にそれらをmavens pomの依存関係タグに配置し、誰がこれらの依存関係を実行するか(環境のセットアップに必要)がプラグインになるように回答します。

        javac (compiler) dependency.java (dependency) 

1

一行回答-基本的な理解

プラグインは、Mavenビルドの実行時に使用するツールです

依存関係とは、コードで使用するライブラリの一種を意味します


0

プラグインは、アーティファクトを生成するために使用されるMavenの拡張機能です(例としては、maven-jar-pluginを使用して、コンパイルしたクラスとリソースからjarを作成します)。

依存関係は、ビルド中のアプリケーションがコンパイル時、テスト時、実行時、またはその両方で必要とするライブラリです。

プラグインと依存関係

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.