执行sbt任务而无需事先编译(用于使用JOOQ生成数据库类)

时间:2019-10-02 09:11:14

标签: sbt playframework-2.0 jooq

我有一个由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)上,但是我发现没有执行任何自定义任务而没有先编译的可能性。

请帮助!谢谢!

1 个答案:

答案 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
}