How to use custom jooq generator and use it as a sbt task?

Viewed 104

I'm trying to use JOOQ for generating Daos inside java play framework project using sbt task. It works fine if I use the default org.jooq.codegen.JavaGenerator. Although when I try to use a custom class that extends the original generator I cannot properly link it in the xml configuration file. It always ends with a java.lang.ClassNotFoundException.

Where should I put the custom generator and what should I add into the configuration file?

//project/jooq.sbt:
libraryDependencies += "org.jooq" % "jooq-meta" % "3.14.7"
libraryDependencies += "org.jooq" % "jooq-codegen" % "3.14.7"
libraryDependencies += "org.postgresql" % "postgresql" % "42.2.5"
//build.sbt:
val generateJOOQ = taskKey[Seq[File]]("Generate JooQ classes")
generateJOOQ := {
org.jooq.codegen.GenerationTool.main(Array("conf/jooq-config.xml"))
  ((sourceManaged.value / "main/generated") ** "*.java").get
}
    //sbt console, successful with default generator
    $ generateJOOQ
    [success] Total time: 3 s, completed 22. 2. 2021 19:02:47
    //failing configuration with custom generator
    <generator>
        <name>generated.codegen.JOOQJavaGenerator</name>
    </generator
    //sbt console, failing with custom generator
    $ generateJOOQ
    19:07:05.480 [pool-16-thread-1] ERROR org.jooq.codegen.GenerationTool - Error in file: conf/jooq-config.xml. Error : generated.codegen.JOOQJavaGenerator
    java.lang.ClassNotFoundException: generated.codegen.JOOQJavaGenerator
        at java.net.URLClassLoader.findClass(URLClassLoader.java:471) ~[?:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:589) ~[?:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[?:?]
      | => rat org.jooq.codegen.GenerationTool.loadClass0(GenerationTool.java:1075) ~[?:?]
        at org.jooq.codegen.GenerationTool.loadClass(GenerationTool.java:1005) ~[?:?]
    at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:382) ~[?:?]
    at org.jooq.codegen.GenerationTool.run(GenerationTool.java:233) ~[?:?]
    at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:228) ~[?:?]
    at org.jooq.codegen.GenerationTool.main(GenerationTool.java:200) ~[?:?]
    at $281b221f498d45a1a3c3$.$anonfun$$sbtdef$1(/home/severste/SyncthingSync/Uniqway/sources/microservices/dummy-service/uniqway-dummy-service/build.sbt:59) ~[?:?]
    at scala.Function1.$anonfun$compose$1(Function1.scala:49) ~[scala-library.jar:?]
    at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62) ~[collections_2.12-1.3.13.jar:1.3.3]
    at sbt.std.Transform$$anon$4.work(Transform.scala:67) ~[task-system_2.12-1.3.13.jar:1.3.13]
    at sbt.Execute.$anonfun$submit$2(Execute.scala:281) ~[tasks_2.12-1.3.13.jar:1.3.13]
    at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:19) ~[util-control_2.12-1.3.3.jar:1.3.3]
    at sbt.Execute.work(Execute.scala:290) ~[tasks_2.12-1.3.13.jar:1.3.13]
    at sbt.Execute.$anonfun$submit$1(Execute.scala:281) ~[tasks_2.12-1.3.13.jar:1.3.13]
    at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178) ~[tasks_2.12-1.3.13.jar:1.3.13]
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:37) [tasks_2.12-1.3.13.jar:1.3.13]
    at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
    at java.lang.Thread.run(Thread.java:834) [?:?]
1 Answers

I'm not acquainted with SBT, but if you were using Maven, you'd simply create a new project or module containing your JOOQJavaGenerator, and add that as a dependency to your project or module running the JOOQJavaGenerator.

Some build systems may allow for interleaving different code generation and compilation steps, but the cleanest approach is always to outsource the task of compiling your JOOQJavaGenerator to a new project or module.

Related