在不进行编译的情况下执行sbt任务(用于使用JOOQ生成数据库类)
我有一个PlayFramework 2.7应用程序,它是由sbt构建的 为了访问数据库,我使用了JOOQ。正如您所知,JOOQ读取我的数据库模式并生成Java源类,然后在我的应用程序中使用 应用程序仅在数据库类存在的情况下进行编译 我正在使用此自定义sbt任务生成类:在不进行编译的情况下执行sbt任务(用于使用JOOQ生成数据库类),sbt,playframework-2.0,jooq,Sbt,Playframework 2.0,Jooq,我有一个PlayFramework 2.7应用程序,它是由sbt构建的 为了访问数据库,我使用了JOOQ。正如您所知,JOOQ读取我的数据库模式并生成Java源类,然后在我的应用程序中使用 应用程序仅在数据库类存在的情况下进行编译 我正在使用此自定义sbt任务生成类: // https://mvnrepository.com/artifact/org.jooq/jooq-meta libraryDependencies += "org.jooq" % "jooq-meta" % "3.12.1"
// 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
}
我搜索了一下,找到了上面的脚本,并根据我的需要对其进行了一些修改,但我并不真正理解它,因为sbt/scala对我来说是新的
现在的问题是,当我启动generateJOOQ
时,sbt首先尝试编译项目,但失败了,因为缺少数据库类。所以我要做的是,注释掉所有使用生成类的代码,执行编译我的项目的任务,生成数据库类,然后再次启用注释掉的代码<这是一种痛苦强>
我想问题出在命令(runner in Compile)
上,但我没有发现任何不先编译就执行自定义任务的可能性
请帮忙!谢谢大家! 通常,当您想要生成源时,应该使用源生成器,请参见 编译中的sourceGenerators+=generateJOOQ 这样做会自动导致SBT在编译Scala/Java源代码之前先执行任务 然后,您不应该真正使用runner任务,因为它用于运行您的项目,这取决于编译任务,当然首先需要执行编译任务 您应该添加jooq元库作为构建的依赖项,而不是源代码的依赖项。这意味着您应该将
libraryDependencies+=“org.jooq”%“jooq meta”%“3.12.1”
行添加到project/jooq.sbt
然后,您可以像在任务中一样简单地调用jooq的GenerationTool:
//build.sbt
generateJOOQ:={
org.jooq.codegen.GenerationTool.main(数组(“conf/db.conf.xml”))
((sourceManaged.value/“main/generated”)***“.java”).get
}
通常,当您想要生成源代码时,应该使用源代码生成器,请参阅
编译中的sourceGenerators+=generateJOOQ
这样做会自动导致SBT在编译Scala/Java源代码之前先执行任务
然后,您不应该真正使用runner任务,因为它用于运行您的项目,这取决于编译任务,当然首先需要执行编译任务
您应该添加jooq元库作为构建的依赖项,而不是源代码的依赖项。这意味着您应该将libraryDependencies+=“org.jooq”%“jooq meta”%“3.12.1”
行添加到project/jooq.sbt
然后,您可以像在任务中一样简单地调用jooq的GenerationTool:
//build.sbt
generateJOOQ:={
org.jooq.codegen.GenerationTool.main(数组(“conf/db.conf.xml”))
((sourceManaged.value/“main/generated”)***“.java”).get
}