为什么在库依赖项中没有使用%%时,Scala版本被添加到URL?

时间:2014-05-06 02:49:42

标签: sbt

我正在尝试从

更改Tormenta project中的依赖项
libraryDependencies += "storm" % "storm-kafka" % "0.9.0-wip6-scala292-multischeme"

libraryDependencies += "net.wurstmeister.storm" % "storm-kafka-0.8-plus" % "0.4.0"

构建失败,因为sbt正在尝试下载http://clojars.org/repo/net/wurstmeister/storm/storm-kafka-0.8-plus _2.9.2 /0.4.0/storm-kafka-0.8-plus-0.4.0.jar,即使我不知道在%%中指定libraryDependencies

为什么sbt会将_2.9.2附加到要下载的工件上?!

1 个答案:

答案 0 :(得分:2)

Clojars Repository中的pom.xml包含以下条目:

<properties>
  <scalaVersion>2.9.2</scalaVersion>
  <kafkaArtifact>kafka_2.9.2</kafkaArtifact>
  <envClassifier/>
</properties>
在解析Ivy期间,将使用以下模式来计算下载URL

[organisation]/[module](_[scalaVersion])(_[sbtVersion])/[revision]/[artifact]-[revision](-[classifier]).[ext]

它会将[scalaVersion]替换为从pom.xml读取的值。因此无效的URL和错误。

修改

正如我所承诺的那样,详细描述会发生什么:

Ivy将下载该库的POM。 在下载依赖项的过程中,Ivy会调用MyModuleDescriptorProvider#provideModule。该函数将返回通过解析已下载的POM文件获得的ModuleDescriptor

为此,常春藤召唤CustomPomParser#parseDescriptor。经过一系列调用后,我们到达CustomPomParser#defaultTransformImpl,第一行是val properties = getPomProperties(md)

生成的properties包含POM文件中定义的Scala版本属性。这些属性作为额外的模块属性存储在ModuleDescriptor中。

稍后在构建下载URL时,会使用我之前提到的模式。占位符用方法IvyPatternHelper.subsitute代替。该方法的参数包含已解析的属性,并且替换会导致错误的URL。