我有一个由sbt构建的PlayFramework 2.7应用程序。
为了访问数据库,我使用的是JOOQ。如您所知,JOOQ读取我的数据库模式并生成Java源类,然后将其用于我的应用程序。
如果存在数据库类,则仅编译应用程序。
我正在使用此自定义sbt任务生成类:
// https://mvnrepository.com/artifact/org.jooq/jooq-meta
libraryDependencies += "org.jooq" % "jooq-meta" % "3.12.1"
lazy val generateJOOQ = taskKey[Seq[File]]("Generate JooQ classes")
generateJOOQ := {
(runner in Compile).value.run("org.jooq.codegen.GenerationTool",
(fullClasspath in Compile).value.files,
Array("conf/db.conf.xml"),
streams.value.log).failed foreach (sys error _.getMessage)
((sourceManaged.value / "main/generated") ** "*.java").get
}
我在Google周围搜索并找到了上面的脚本,并根据我的需要对其进行了一些修改,但是由于sbt / scala对我来说是新手,所以我不太了解它。
现在的问题是,当我启动generateJOOQ
时, sbt会首先尝试编译项目,但由于缺少数据库类而导致编译失败。所以我要做的是,注释掉所有使用生成的类的代码,执行编译我的项目的任务,生成数据库类,然后再次启用注释掉的代码。 这很痛苦!
我猜问题出在命令(runner in Compile)
上,但是我发现没有执行任何自定义任务而没有先编译的可能性。
请帮助!谢谢!
答案 0 :(得分:0)
通常,当您要生成源时,应使用源生成器,请参见https://www.scala-sbt.org/1.x/docs/Howto-Generating-Files.html
sourceGenerators in Compile += generateJOOQ
这样做会自动导致SBT在尝试编译Scala / Java源代码之前先执行您的任务。
然后,您不应该真正使用Runner任务,因为该任务用于运行您的项目,这取决于编译任务,而该编译任务当然需要首先执行。
您应该添加jooq-meta库作为构建的依赖项,而不是源代码。这意味着您应该添加libraryDependencies += "org.jooq" % "jooq-meta" % "3.12.1"
行,例如到project/jooq.sbt
。
然后,您可以像在通常的任务中一样简单地调用jooq的GenerationTool:
// build.sbt
generateJOOQ := {
org.jooq.codegen.GenerationTool.main(Array("conf/db.conf.xml"))
((sourceManaged.value / "main/generated") ** "*.java").get
}