Maven 为什么跨建筑约定会将scala版本附加到artifactId?

Maven 为什么跨建筑约定会将scala版本附加到artifactId?,maven,sbt,Maven,Sbt,用于指示编译库所依据的Scala版本的底层机制是在库的名称后面附加uu。这种相当简单的方法允许与Maven、Ant和其他构建工具的用户进行互操作。 -- 虽然这是一种简单的方法,但与Maven和其他构建工具的互操作性还有待改进。由于artifactId不同(例如scalatest_2.9.0和scalatest_2.10.0),Maven将它们视为不同的工件。Maven的依赖项解析机制因此受到损害,同一工件的多个版本(针对不同的scala版本构建)可能会在类路径上结束 为什么不将scala版本放

用于指示编译库所依据的Scala版本的底层机制是在库的名称后面附加uu。这种相当简单的方法允许与Maven、Ant和其他构建工具的用户进行互操作。 --

虽然这是一种简单的方法,但与Maven和其他构建工具的互操作性还有待改进。由于
artifactId
不同(例如
scalatest_2.9.0
scalatest_2.10.0
),Maven将它们视为不同的工件。Maven的依赖项解析机制因此受到损害,同一工件的多个版本(针对不同的scala版本构建)可能会在类路径上结束

为什么不将scala版本放在分类器中?这似乎是分类器的主要预期用途之一:

分类器允许[Maven]区分从同一POM构建但内容不同的工件。作为这个元素的一个动机,考虑一个项目,该项目提供了一个针对JRE 1.5的工件,但同时也是一个仍然支持JRE 1.4的工件。第一个工件可以配备分类器jdk15,第二个工件可以配备jdk14,这样客户机可以选择使用哪一个。 --


将版本附加到名称是一个历史性的决定,这是很久以前做出的,因此它很可能不会改变,因为许多库已经按照约定发布了

话虽如此,正如Seth所指出的,几年前,当sbt 0.12将“_2.10.0”后缀缩短为“_2.10”以利用Scala库在次要版本之间的二进制兼容性时,有一次讨论回顾了这个主题。这是马克来自:

所谓交叉版本控制,我指的是在模块ID中包含Scala版本的某些部分,以区分通过编译相同源代码针对不同Scala版本生成的工件。我不是说使用
+task
构建多个Scala版本的能力,这将持续下去;我只是指跨版本公约

[剪报]

用不灵活的pom.xml格式对其进行编码一直是个难题,我认为对于基于Scala 2.10及更高版本构建的项目,最好不要使用这种格式。然而,这也许比任何可能取代它的临时解决方案都要好。我没有看到其他构建工具的用户这样做,所以我希望没有什么可以取代它

在线索的某个地方Josh:

(1) Scala分类器。这些可以是自定义字符串,也可以使用依赖项指定。至少,IIRC这应该行得通

这是马克的:

“可以用依赖项指定”是什么意思?所有分类器只有一个pom,对吗?如何为每个分类器声明不同的依赖关系

这里有一些关于量词的更有趣的评论

我也认为分类器将是处理 这个问题尤其是考虑到maven文档中的建议 分类器
java-1.4
java-1.5
用于区分JAR之间的差异 适用于各个平台。致命的缺陷似乎是 可传递依赖关系管理。也就是说,没有办法选择 基于用于要求 模块。当你使用这个模块时,我们需要能够这样说 使用
scala-2.10
分类器,它使用
scala-2.10
分类器,与2.9分类器一起使用时引入 它自己的DEP带有
scala-2.9
分类器

我认为在jvm版本中,这是可行的,因为 jvm版本控制在概要文件激活中有特殊支持,可以 可以控制依赖项


我记得几年前做出了这个决定,我几乎可以肯定,使用分类器被讨论并拒绝,所有人都同意这不是一个可行的解决方案。我不记得为什么了@谢谢你的提示。