我正在尝试从
更改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
附加到要下载的工件上?!
答案 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。