3

我正在尝试为 sbt 0.12.1 创建一个插件,该插件将从 WSDL 生成 java 文件,编译它们,然后发布 jar。

我的项目布局是这样的:

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

我正在使用axis来生成java文件,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 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。但如果 I publish-local,它不会编译。所以为了publishor publish-local,我必须先手动compile

有什么建议么?

4

2 回答 2

3

在 sbt 文档的这个 howto 中描述了生成源和资源。

在您的情况下,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 回答
0

这个问题已经很老了,尽管这个问题可能仍然与某人有关。

就我而言,我通过一个sh脚本来处理 WSDL 生成的所有繁琐工作wsimport(随 Java 一起提供),从而解决了一个非常相似的问题。一个专门的sbt子项目将其包装为一个任务并在编译时执行。这样的子项目可以很容易地插入到任何其他更大的sbt设置中,您可以在其中添加对它的依赖项。

说得够多了,下面是 GitHub 上的一个模板,它准确地展示了这一点:https ://github.com/sainnr/sbt-scala-wsdl-template 。希望它可以为人们节省几个小时搞乱 WSDL 和构建工具的时间。如果您觉得有帮助,请随意分叉或改进它!

于 2019-10-10T19:40:04.180 回答