什么是SBT中的分类器

时间:2013-09-02 10:56:10

标签: scala jar sbt sbt-assembly

classifiers一词的含义是什么?它来自罐子吗?例如,在sbt-assembly插件中:

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

2 个答案:

答案 0 :(得分:14)

classifiergroupIdartifactIdversion之后,

packaging被Maven定义为项目坐标的第五个元素。

更具体地说(来自maven documentation,强调我的):

  

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

     

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

     

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

例如,Maven central不仅包含普通(没有分类器)scala-library-2.10.2.jar,还包含

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

这两个额外的工件与分类器一起发布。

SBT还允许您向依赖项添加分类器。来自doc:

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

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

答案 1 :(得分:1)

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

  

已发布的工件

     

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

Artifacts

  

定义自定义工件

     

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