我正在将Scala Migrations项目从ant / ivy转移到sbt。它可选地使用log4jdbc作为any public Maven repository中不存在的库依赖项(我可以找到)。
libraryDependencies +=
"log4jdbc" % "log4jdbc" % "1.1" from "http://log4jdbc.googlecode.com/files/log4jdbc4-1.1.jar"
我希望生成的POM不包含log4jdbc,因为它不在任何存储库中。这是一个正确的假设,即如果不列出log4jdbc,POM会更好吗?此外,对于使用sbt?
的Scala Migrations用户,它不会列出更好的效果我编写了以下设置来从POM中删除log4jdbc依赖项。有更好,更简单的方法吗?是否可以将设置添加到sbt以自动执行此操作?
// Do not include log4jdbc as a dependency.
pomPostProcess := { (node: scala.xml.Node) =>
val rewriteRule =
new scala.xml.transform.RewriteRule {
override def transform(n: scala.xml.Node): scala.xml.NodeSeq = {
val name = n.nameToString(new StringBuilder).toString
if (name == "dependency") {
if ((n \ "groupId").text == "log4jdbc")
scala.xml.NodeSeq.Empty
else
n
}
else {
n
}
}
}
val transformer = new scala.xml.transform.RuleTransformer(rewriteRule)
transformer.transform(node)(0)
}
答案 0 :(得分:5)
因为您提到了POM,我假设您想要支持Maven用户,或者您想要发布到Maven存储库。如果不是这样,您就不需要发布到POM,只需使用Ivy元数据,就像在Ant / Ivy设置中一样。
由于您了解Ivy,from(URL)
方法基本上是通过声明其from
属性设置为URL的自定义工件来实现的。独立于Maven / POM,Ivy在交付的Ivy文件中不包含自定义工件。 (至少,我相信这是标准的常春藤行为,而不是sbt配置常春藤做的事。)
但是,也没有办法在pom.xml中提供依赖关系的URL。您如何处理这可能取决于您希望客户做什么,但一个相当通用的解决方案是将依赖声明为可选:
libraryDependencies +=
"log4jdbc" % "log4jdbc" % "1.1" % "compile,optional" from
"http://log4jdbc.googlecode.com/files/log4jdbc4-1.1.jar"
客户端需要显式声明依赖项才能使用它。
因为它不是存储库,所以sbt用户仍然需要复制from "..."
声明。 Maven用户只能在存储库中使用依赖项,尽管他们可以非常轻松地手动将其安装在本地存储库中。