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


80

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

<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> 

Answers:


64

分类器区分从相同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更好的用处。

假设您需要一个工件的两个版本:foropenjpaeclipselinkfor-例如,因为jar包含专门用于增强JPA实现的实体。

您可能会对在Maven配置文件中定义的这些构建有不同的处理方式,然后使用的配置文件还具有property <classifier />

要构建不同分类的版本,请在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>

在哪里可以找到有关此语法的解释:<classifier> [openjpa | eclipselink] </ classifier>
Alan Snyder

@AlanSnyder只是一个“懒惰的编码器快捷方式”,而不是任何实际可用的语法。我对该部分进行了编辑以使其更加清晰。[openjpa|eclipselink]只是选择其中一个的“选择器”。
pirho

7

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

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


3

它允许区分属于同一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> 

实际上,它可以让您以更高的粒度级别找到依赖项。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.