web-dev-qa-db-ja.com

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

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

90
Coral

プラグインと依存関係は両方ともJarファイルです。

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

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

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

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

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

177
r9891

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

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

33
Andrew Logvinov

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

プラグインとは何ですか?

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

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

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

コマンドラインで指定されたMavenの目標(たとえば、mvn cleanmvn clean package、またはmvn site)に従って、 特定のライフサイクル が使用され、特定のセットがプラグインの目標が実行されます。
3つの組み込みビルドライフサイクルがあります:defaultclean、および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パート、またはa plugin宣言!実際、一部のプラグインは、実行中にクラスパスにいくつかの依存関係を持つ必要があります。それは一般的ではありませんが、起こる可能性があります。
documentation の例は、plugindependencyが一緒に機能することを示しています。

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

プラグインは、Maven自体に機能を追加するために使用されます(EclipseサポートまたはSpringBootサポートをMavenなどに追加するなど)。 Mavenフェーズ(compileまたはtestなど)を渡すには、ソースコードに依存関係が必要です。 JUnitの場合、テストコードは基本的にコードベースの一部であり、テストスイート内でJUnit固有のコマンドを呼び出しますが、これらのコマンドはJava SDKしたがって、JUnitがテスト段階にあるときにMavenが存在している必要があり、これはJUnitpom.xmlファイル。

4
coffeMug

あなたが私のようなフロントエンドのバックグラウンドから来ていて、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>によってダウンロードされたコードをどうするかをビルドツールに伝えています。

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

4
Kevin

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

        javac (compiler) dependency.Java (dependency) 
1
Himanshu Ahuja