Mavens依赖声明分类器属性的目的是什么?

时间:2014-01-03 17:45:55

标签: java maven dependency-management

我有一个pom.xml文件,因为我看到他们是同一个<artifactId>引用的3个依赖项,区别在于标记

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

我删除了具有SOURCES/JAVADOC的依赖项,并且只保留了一个依赖项。我测试了我的应用程序,每件事情都很好。

使用此分类器标记的目的是什么?以及为什么我需要两次复制依赖项才能将<classifier>标记添加到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> 

5 个答案:

答案 0 :(得分:51)

  

分类器区分由相同构建的工件   POM但内容不同。它是一些可选的任意字符串    - 如果存在 - 将附加到工件名称之后   版本号。

Source

答案 1 :(得分:5)

分类器的示例
作为此元素的动机,请考虑一个项目,该项目提供针对JRE 1.8的工件,但同时也是一个仍支持JRE 1.7的工件。第一个工件可以配备分类器jdk18,第二个工件可以配备jdk14,以便客户可以选择使用哪个。

分类器的另一个常见用例是需要将辅助工件附加到项目的主要工件。如果您浏览Maven中央存储库,您会注意到分类器源和javadoc用于部署项目源代码和API文档以及打包的类文件。

答案 2 :(得分:3)

另一个更实用的答案,通过一个例子来帮助更好地理解classifier的用处。

假设您需要两个版本的工件:for openjpaeclipselink - 比如因为jar包含需要特别增强JPA实现的实体。

您可能对Maven配置文件中定义的这些构建有一些不同的处理,然后使用的配置文件也具有属性<classifier />

要构建不同分类的版本,请在pom中随后配置maven-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>

安装两者会导致repo中的文件如下:

  

组织/示例/数据/ 1.0.0 /数据1.0.0.pom
  组织/示例/数据/ 1.0.0 /数据-1.0.0-openjpa.jar
  org / example / data / 1.0.0 / data-1.0.0-eclipselink.jar

现在只有classifier才能使用,所以

<dependency>
   <groupId>org.example</groupId>
   <artifactId>data</artifactId>
   <version>1.0.0</version>
   <classifier>[openjpa|eclipselink]</classifier>
</dependency>

答案 3 :(得分:1)

它允许区分属于同一个POM但构建方式不同的两个工件,并在版本之后附加到文件名。

例如,如果您的存储库中有其他工件(文档,源...),您可以引用它们并将它们作为依赖项添加到项目中。 在此代码中添加<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> 

实际上,它允许您以更高级别的粒度定位依赖项。

答案 4 :(得分:0)

根据以下内容: https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/ 分类器标签暗示了&#34;辅助工件&#34;,它的&#34;传递依赖&#34;将被切断! 因此,分类器标签不仅可以改变Maven Coordinate&#34;通过$ artifactId- $ version- $ classifier.jar!