3

WSDLからJavaファイルを生成し、それらをコンパイルしてからjarを公開するsbt0.12.1のプラグインを作成しようとしています。

私のプロジェクトのレイアウトは次のようなものです。

./build.sbt
./project/build.sbt
./project/WsdlBuild.scala
./src/main/wsdl/...many wsdl files...

私はjavaファイルを生成するためにaxisを使用しており、build.sbt次のようになります。

name := "zxtm-api"

organization := "com.giltgroupe.zeus"

unmanagedBase <<= baseDirectory { base => base / "wsdl-lib" }

libraryDependencies ++= Seq(
  "axis"              % "axis-wsdl4j"       % "1.2.1",
  "commons-logging"   % "commons-logging"   % "1.0.4",
  "commons-discovery" % "commons-discovery" % "0.2",
  "log4j"             % "log4j"             % "1.2.8",
  "org.apache.axis"   % "axis"              % "1.4",
  "org.apache.axis"   % "axis-ant"          % "1.4",
  "org.apache.axis"   % "axis-jaxrpc"       % "1.4",
  "org.apache.axis"   % "axis-saaj"         % "1.4"
)

gilt.zxtm.WsdlBuild.wsdlSettings

(にあるMavenリポジトリで見つからなかったjarが1つありましたwsdl-lib

project/build.sbt非常に似ています:

libraryDependencies ++= Seq(
  "axis"              % "axis-wsdl4j"       % "1.2.1",
  "commons-logging"   % "commons-logging"   % "1.0.4",
  "commons-discovery" % "commons-discovery" % "0.2",
  "log4j"             % "log4j"             % "1.2.8",
  "org.apache.axis"   % "axis"              % "1.4",
  "org.apache.axis"   % "axis-ant"          % "1.4",
  "org.apache.axis"   % "axis-jaxrpc"       % "1.4",
  "org.apache.axis"   % "axis-saaj"         % "1.4"
)

unmanagedBase <<= baseDirectory { base => base / "wsdl-lib" }

そこでWsdlBuild.scala、Javaファイルを生成するためのコードを記述し、次のようになりました。

object WsdlBuild extends Plugin {

  lazy val wsdlSourceDir = SettingKey[File]("wsdl-source-dir")
  lazy val wsdlToJava = TaskKey[Unit]("wsdl-to-java")
  lazy val managedSrcDir = file("target/src_managed/wsdl")

  val wsdlSettings = inConfig(Compile)(Seq(
    compile <<= compile dependsOn wsdlToJava,
    javaSource := managedSrcDir,
    managedSourceDirectories := Seq(managedSrcDir)
  )) ++ Seq(
    wsdlToJava <<= (wsdlSourceDir, managedSourceDirectories in Compile, state) map {
      (wsdlDir, managedDirs, s) =>
      // by convention use the first one. Not obvious why there is
      // ever more than one
        createJavaFromWsdl(wsdlDir, managedDirs.head, s.log)
    },
    wsdlSourceDir := file("src/main/wsdl")
  )

  def createJavaFromWsdl(wsdlDir: File, outputDir: File, log: Logger): File = { ... }

だからこの種の作品。を実行compileすると、wsdlが正しく生成されます。しかし、私がそうするとpublish-local、コンパイルされません。だから、publishまたはするためにpublish-local、そして私は最初に手動でしなければなりませんcompile

助言がありますか?

4

2 に答える 2

3

ソースとリソースの生成については、sbt docs のこのハウツーで説明されています。

あなたの場合、次のwsdlSettingsようになります。

  val wsdlSettings = inConfig(Compile)(Seq(
    sourceGenerators <+= wsdlToJava,
    wsdlSourceDir <<= baseDirectory(_ / "src/main/wsdl"),
    wsdlToJava <<= (wsdlSourceDir, sourceManaged, streams) map {
      (wsdlDir, managedDir, s) =>
        createJavaFromWsdl(wsdlDir, managedDir, s.log)
    },
  )

あなたの質問に関係のないいくつかの変更:

  • からロガーを取得しstreamsます。これにより、タスク固有のロガーに出力が送信されるため、個別に取得できます。詳細については、このハウツーを参照してください。
  • 多くの場合、ファイルを に基づいて、常に絶対パスを使用しますbaseDirectory絶対パスを使用するを参照してください。
于 2012-10-13T15:46:32.043 に答える