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

Sbt 如何从WSDL生成Java文件并发布它们?,sbt,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

我正在尝试为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
因此,我在
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 = { ... }
对象WsdlBuild扩展插件{ lazy val wsdlSourceDir=SettingKey[File](“wsdl源目录”) lazy val wsdlToJava=TaskKey[Unit](“wsdl到java”) lazy val managedSrcDir=文件(“target/src_managed/wsdl”) val wsdlSettings=inConfig(编译)(序号(
编译生成源代码和资源

在您的情况下,
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)
    },
  )
val wsdlSettings=inConfig(编译)(Seq(

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

在我的例子中,我通过使用
sh
脚本解决了一个非常类似的问题,该脚本通过
wsimport
完成了WSDL生成的所有脏活(随Java提供)。一个专用的
sbt
子项目将其包装为任务,并在编译时执行。这样的子项目可以很容易地插入到任何其他更大的
sbt
设置中,您可以在其中添加对它的依赖项


说到这里,GitHub上的一个模板正好说明了这一点:。希望它能为用户节省好几个小时的WSDL和构建工具的时间。如果您觉得有用,请随意使用或改进它!

如果有人感兴趣,请发一篇文章,详细描述如下:
  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)
    },
  )