5

Scala Migrationsプロジェクトを ant/ivy から sbt に移行しています。オプションで、公開されている Maven リポジトリには存在しないライブラリ依存関係として log4jdbc を使用します(私が見つけたものから)。

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

1 に答える 1

5

あなたはPOMについて言及しているので、Mavenユーザーをサポートしたい、またはMavenリポジトリに公開したいと思っていると思います。そうでない場合は、POM に公開する必要はなく、Ant/Ivy セットアップのように Ivy メタデータを操作できます。

ご存じのとおり、Ivy のメソッドは基本的に、プロパティを URL に設定しfrom(URL)てカスタム アーティファクトを宣言することによって実装されます。fromMaven/POM とは無関係に、Ivy は提供された Ivy ファイルにカスタム成果物を含めません。(少なくとも、これは Ivy の標準的な動作であり、sbt が Ivy に設定するものではないと私は信じています。)

ただし、pom.xml で依存関係の URL を提供する方法もありません。これを処理する方法は、クライアントに何を期待するかによって異なりますが、かなり一般的な解決策の 1 つは、依存関係をオプションとして宣言することです。

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

クライアントは、依存関係を使用するために明示的に宣言する必要があります。これはリポジトリではないため、sbt ユーザーはfrom "..."宣言を複製する必要があります。Maven ユーザーはリポジトリ内の依存関係しか使用できませんが、手動でローカル リポジトリにかなり簡単にインストールできます。

于 2012-09-12T19:51:24.687 に答える