如何从WSDL生成Java文件并发布它们?

时间:2012-10-13 08:18:18

标签: sbt

我正在尝试为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

(我们在wsdl-lib)的任何maven回购中都找不到一个罐子

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,它就不会编译。因此,为了publishpublish-local,我必须首先手动compile

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

生成源和资源的内容为in this howto of the 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获取记录器。这会将输出发送到特定于任务的记录器,以便您可以单独检索它。有关详细信息,请参阅this howto
  • 始终使用绝对路径,通常是在baseDirectory上建立文件。见Use absolute paths

答案 1 :(得分:0)

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

在我的案例中,我遇到了一个非常相似的问题,即拥有一个sh脚本,该脚本使用wsimport完成了WSDL生成的所有肮脏工作(Java自带)。专用的sbt子项目将其包装为任务并在编译时执行。这样的子项目可以轻松地插入任何其他更大的sbt设置中,您可以在其中添加依赖项。

可以说,这是GitHub上的一个模板,它确切地证明了这一点:https://github.com/sainnr/sbt-scala-wsdl-template。希望它可以为某人节省大量时间来使用WSDL和构建工具。如果发现有帮助,请随意进行分叉或改进!