Mavens依存関係宣言分類子プロパティの目的は何ですか?


81

私はpom.xmlファイルを持っていますが、同じように参照されている3つの依存関係<artifactId>がタグにあることがわかります。

<classifier>sources</classifier>
<classifier>javadoc</classifier>

を持っていた依存関係を削除し、SOURCES/JAVADOC1つの依存関係のみを保持しました。私は自分のアプリケーションをテストしましたが、すべてが正常に機能します。

この分類タグを使用する目的は何ですか?と<classifier>タグを追加するために依存関係を2回複製する必要がある理由SOURCES/JAVADOC

<dependency>
   <groupId>oauth.signpost</groupId>
   <artifactId>signpost-commonshttp4</artifactId>
   <version>1.2.1.2</version>
   <type>jar</type>
   <scope>compile</scope>
</dependency>
  <dependency>
   <groupId>oauth.signpost</groupId>
   <artifactId>signpost-commonshttp4</artifactId>
   <version>1.2.1.2</version>
   <type>jar</type>
      ***<classifier>javadoc</classifier>***
   <scope>compile</scope>
</dependency>
<dependency>
   <groupId>oauth.signpost</groupId>
   <artifactId>signpost-commonshttp4</artifactId>
   <version>1.2.1.2</version>
   <type>jar</type>
   ***<classifier>sources</classifier>***
   <scope>compile</scope>
</dependency> 

回答:


65

分類子は、同じPOMから作成されたが、内容が異なるアーティファクトを区別します。バージョン番号の直後にアーティファクト名に追加されるのは、オプションの任意の文字列です(存在する場合)。

ソース


1
ドキュメントによると、「分類子のソースとjavadocは、パッケージ化されたクラスファイルとともにプロジェクトのソースコードとAPIドキュメントをデプロイするために使用されます」とはどういう意味ですか?それが私のpom.xmlがそれを使用する理由だと思います。パッケージ化されたクラスと一緒にAPIドキュメントとソースコードをデプロイする必要があるのはなぜですか。パッケージ化されたクラスをデプロイするだけでは不十分ではありませんか?
pushya 2014年

6
@pushyaは通常、アーティファクトをMaven Centralなどのパブリックリポジトリにデプロイするときに、javadocsとソースを含めて、MavenをサポートするIDEが適切なコード補完とJavaDocポップアップを実行し、デバッグ時にライブラリコードにステップインできるようにします。
イアンロバーツ

今意味のある@IanRoberts。つまり、「SOURCE / JAVADOC」を持つ依存関係を削除でき、それらはオプションであり、主にコーディング時に開発者に優しいという目的を果たしますか?
pushya 2014年

1
@pushyaおそらくそうです。それを試して、何が起こるかを見てください。
イアンロバーツ

15

classifierより良いの有用性を理解するのに役立つ例によるさらに別のより実用的な答え。

あなたがアーティファクトの2つのバージョンを必要としていると仮定します。のためにopenjpaとのためにeclipselink- jarファイルは、特にJPAの実装を強化することが必要とされたエンティティが含まれているためと言います。

Mavenプロファイルで定義されたこれらのビルドに対していくつかの異なる処理があり、使用されるプロファイルにもプロパティがあります<classifier />

で、異なった分類バージョンをビルドするには、その後followinglyに構成されるだろうpommaven-jar-plugin

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <version>3.0.2</version>
   <configuration>
       <classifier>${classifier}</classifier>
   </configuration>
</plugin>

両方をインストールすると、リポジトリ内のファイルは次のようになります。

org / example / data / 1.0.0 / data-1.0.0.pom
org / example / data / 1.0.0 / data-1.0.0-openjpa.jar
org / example / data / 1.0.0 /data-1.0 。 0-eclipselink.jar

これでclassifier、どちらを使用するかだけが問題になるため、OpenJPAの場合、たとえば次のようになります。

<dependency>
   <groupId>org.example</groupId>
   <artifactId>data</artifactId>
   <version>1.0.0</version>       
   <classifier>openjpa</classifier>
</dependency>

EclipseLinkの場合、分類子を次のように切り替えます。

<classifier>eclipselink</classifier>

私はこの構文の説明を見つけることができます。<分類器> [OpenJPAの|のEclipseLink] </クラシファイア>
アラン・スナイダー

@AlanSnyderは単なる「怠惰なコーダーショートカット」であり、実際に機能する構文ではありませんでした。その部分を編集して、より明確にしました。[openjpa|eclipselink]どちらかを選択するための単なる「セレクター」でした。
pirho

7

分類子の例
この要素の動機として、たとえば、JRE 1.8を対象とするアーティファクトを提供すると同時に、JRE1.7を引き続きサポートするアーティファクトを提供するプロジェクトについて考えてみます。最初のアーティファクトには分類子jdk18を装備し、2番目のアーティファクトにはjdk14を装備して、クライアントがどちらを使用するかを選択できるようにすることができます。

分類子のもう1つの一般的な使用例は、プロジェクトのメインアーティファクトにセカンダリアーティファクトをアタッチする必要があることです。Maven中央リポジトリを参照すると、分類子sourcesとjavadocが、パッケージ化されたクラスファイルとともにプロジェクトソースコードとAPIドキュメントをデプロイするために使用されていることがわかります。


3

これにより、同じPOMに属しているが、ビルドが異なる2つのアーティファクトを区別でき、バージョンの後にファイル名に追加されます。

たとえば、リポジトリに他のアーティファクト(ドキュメント、ソースなど)がある場合、それらを参照して、依存関係としてプロジェクトに追加できます。このコード<classifier>sources</classifier>では、リポジトリからsources.jarを取得しています。

    <dependency>
    <groupId>oauth.signpost</groupId>
    <artifactId>signpost-commonshttp4</artifactId>
    <version>1.2.1.2</version>
    <type>jar</type>
    ***<classifier>sources</classifier>***
    <scope>compile</scope>
    </dependency> 

実際には、さらに詳細なレベルで依存関係を見つけることができます。


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