Maven的依赖声明分类属性有什么作用?

94

我有一个pom.xml文件,在其中我看到有3个依赖项引用了相同的<artifactId>,它们之间的差异在标签中。

我有一个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> 
5个回答

77
分类器用于区分使用相同 POM 构建但内容不同的构件。它是一些可选的任意字符串,如果存在,则会附加到构件名称后面的版本号之后。请注意保留 HTML 标签。

来源


2
根据文档所说,“分类器源和javadoc用于部署项目源代码和API文档以及打包的类文件”,这是什么意思?我认为这就是为什么我的pom.xml要使用它的原因。为什么需要将API文档和源代码与打包的类一起部署?难道只部署打包的类不够吗? - pushya
7
通常情况下,当你将你的构件部署到公共仓库(例如 Maven 中央仓库)时,需要包含 javadocs 和源代码,这样支持 Maven 的集成开发环境才能进行适当的代码补全和 JavaDoc 弹出,以及在调试时可以进入库的代码中。 - Ian Roberts
@IanRoberts,现在有意义了。这意味着我可以删除具有“SOURCE/JAVADOC”依赖项的内容,它们是可选的,并且主要用于编码时使开发人员更加友好? - pushya
1
@pushya 很有可能是的。试一试,看看会发生什么。 - Ian Roberts

23

这里有一个更加实用的例子,来帮助更好地理解classifier的用处。

假设你需要两个版本的构件: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>
安装两者将导致仓库中的文件类似于这样:

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

现在只需要使用“分类器”来选择要使用哪个,例如对于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

8

分类器示例
作为此元素的动机,可以考虑一个项目,该项目提供针对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> 

实际上,它让您以更高的粒度定位依赖项。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接