12

这个词是什么意思classifiers?它来自罐子吗?例如在sbt-assembly插件中:

artifact in (Compile, assembly) ~= { art =>
  art.copy(`classifier` = Some("assembly"))
}
4

2 回答 2

19

classifier被 Maven 定义为项目坐标的第五个元素,在、groupId和之后。artifactIdversionpackaging

更具体地说(来自Maven 文档,强调我的):

分类器允许区分从相同 POM 构建但内容不同的工件。它是一些可选且任意的字符串——如果存在的话——被附加到工件名称之后,紧跟在版本号之后。

作为这个元素的动机,例如,考虑一个项目,它提供了一个针对 JRE 1.5 的工件,但同时也提供了一个仍然支持 JRE 1.4 的工件。第一个工件可以配备分类器 jdk15,第二个工件配备 jdk14,以便客户端可以选择使用哪一个。

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

例如,Maven central 不仅包含 normal(无分类器)scala-library-2.10.2.jar,还包含

  • scala-library-2.10.2-javadoc.jar,按照惯例包含文档(即使在这种情况下它包含 scaladoc 而不是 javadoc),
  • scala-library-2.10.2-sources.jar其中包含来源。

这两个额外的工件是使用分类器发布的。

SBT 还允许您将分类器添加到依赖项。从文档:

libraryDependencies += "org.testng" % "testng" % "5.7" classifier "jdk15"

在您的情况下,似乎 sbt-assembly 插件会覆盖所有分类器(仅在组装任务中)以将它们设置为assembly.

于 2013-09-02T19:08:41.283 回答
1

除了@gourlaysama 的回答,请参阅Publishing

已发布的工件

默认情况下,会发布主二进制 jar、源 jar 和 API 文档 jar。您可以声明其他类型的工件以发布和禁用或修改默认工件。有关详细信息,请参阅工件页面。

神器

定义自定义工件

除了配置内置工件外,您还可以声明要发布的其他工件。使用 Ivy 元数据时允许多个工件,但 Maven POM 文件仅支持基于分类器区分工件,这些不会记录在 POM 中。

于 2013-09-02T22:26:19.900 回答