如何从生成的 pom 中排除具有显式 URL 的库依赖项?

2024-01-19

我正在移动Scala 迁移 http://code.google.com/p/scala-migrations/项目从 ant/ivy 到 sbt。它可以选择使用 log4jdbc 作为不存在于的库依赖项任何公共 Maven 存储库 http://code.google.com/p/log4jdbc/wiki/FAQ(据我所知)。

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)
}

因为您提到了 POM,所以我假设您想要支持 Maven 用户或者想要发布到 Maven 存储库。如果不是这样,您不需要发布到 POM,您可以像在 Ant/Ivy 设置中一样使用 Ivy 元数据。

既然你认识艾维,from(URL)方法本质上是通过声明一个自定义工件来实现的from属性设置为 URL。独立于 Maven/POM,Ivy 不在交付的 Ivy 文件中包含自定义工件。 (至少,我相信这是标准的 Ivy 行为,而不是 sbt 配置 Ivy 要做的事情。)

不过,也没有办法在 pom.xml 中提供依赖项的 URL。如何处理这个问题可能取决于您期望客户端做什么,但一个相当通用的解决方案是将依赖项声明为可选:

libraryDependencies +=
  "log4jdbc" % "log4jdbc" % "1.1" % "compile,optional" from
    "http://log4jdbc.googlecode.com/files/log4jdbc4-1.1.jar"

客户端需要显式声明依赖关系才能使用它。 因为它不是存储库,所以 sbt 用户仍然需要复制from "..."宣言。 Maven 用户只能使用存储库中的依赖项,尽管他们可以相当轻松地手动将其安装在本地存储库中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从生成的 pom 中排除具有显式 URL 的库依赖项? 的相关文章

随机推荐