我正在尝试为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
,它就不会编译。因此,为了publish
或publish-local
,我必须首先手动compile
。
有什么建议吗?
答案 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和构建工具。如果发现有帮助,请随意进行分叉或改进!