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

pus*_*hya 67 java dependency-management maven

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

<classifier>sources</classifier>
<classifier>javadoc</classifier>
Run Code Online (Sandbox Code Playgroud)

我删除了具有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> 
Run Code Online (Sandbox Code Playgroud)

Bis*_*jit 52

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

有关详细信息,请访问http://maven.apache.org/pom.html

  • @pushya通常在将工件部署到公共存储库(如Maven central)时,包含javadoc和源,以便具有Maven支持的IDE可以执行正确的代码完成和JavaDoc弹出,并且可以在调试时进入库代码. (6认同)
  • 根据文档,“分类器源和 javadoc 用于部署项目源代码和 API 文档以及打包的类文件”,这是什么意思?我认为这就是我的 pom.xml 使用它的原因。为什么需要将 API 文档和源代码与打包的类一起部署。部署打包的类还不够好​​吗? (2认同)

vis*_*dhe 5

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

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


pir*_*rho 5

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

假设您需要一个工件的两个版本:for openjpaeclipselinkfor-例如,因为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>
Run Code Online (Sandbox Code Playgroud)

同时安装这两个文件将导致在仓库中存储文件,如下所示:

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用哪一种就可以了,所以

<dependency>
   <groupId>org.example</groupId>
   <artifactId>data</artifactId>
   <version>1.0.0</version>
   <classifier>[openjpa|eclipselink]</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)