157

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

4

8 に答える 8

262

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

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

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

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

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

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

于 2012-08-09T12:54:50.050 に答える
44

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

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

于 2012-08-09T10:51:46.817 に答える
35

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

プラグインとは?

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

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

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

コマンド ラインで指定された Maven ゴール (たとえばmvn cleanmvn clean packageまたはmvn site)に従って、特定のライフサイクルが使用され、プラグイン ゴールの特定のセットが実行されます。、および
の 3 つの組み込みビルド ライフサイクルがあります。ライフサイクルはプロジェクトの展開を処理し、ライフサイクルはプロジェクトのクリーニングを処理し、ライフサイクルはプロジェクトのサイト ドキュメントの作成を処理します。defaultcleansitedefaultcleansite

プラグインの目標は、特定のライフサイクルの特定のフェーズにバインドされる場合があります。
たとえば、はデフォルトで目標をライフサイクル フェーズにmaven-compiler-pluginバインドします: 。 ほとんどの Maven プラグイン (コア プラグインとサード パーティのプラグインの両方) は、構成よりも規約を優先します。したがって、これらは通常、プラグインの目標を特定のフェーズにバインドして、使用を簡単にします。compilecompile

それはよりきちんとしていて、エラーが発生しにくいです:

<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 アーティファクト/コンポーネントです。

具体的には、ほとんどの依存関係は 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です。part
で宣言された依存関係の例を次に示します。<build><dependencies>

<build>
   <dependencies>
      <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>5.2.14.Final</version>
      </dependency>
   <dependencies>
</build>

依存関係には、「いつ」の問題に対処するためのプラグインとしてのフェーズ バインディングがありません。
しかし、これには対応するスコープがあります。スコープ
です。
Indeed で宣言された依存関係は、定義したスコープに従って、特定の時間にアプリケーションで使用できます。
これscopeは、プロジェクトの依存関係がどのように表示されるかについての中心的な概念です。

デフォルトのスコープは です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>
于 2018-08-31T16:44:39.417 に答える
1

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

        javac (compiler) dependency.java (dependency) 
于 2019-01-01T17:51:15.513 に答える