如何使用 Gradle 的 jOOQ 自定义代码生成器策略?

How can I use a jOOQ custom code generator strategy with Gradle?

这类似于 this question, but we're using Gradle instead. Assume we're using jOOQ's code generation directly in our build script as canonically described in the docs

有两个问题。首先,我们将向生成器配置添加一个新的 strategy,这应该很简单:

// ...
generator() {
    // ...
    strategy() {
        name('com.example.MyCustomGeneratorStrategy')
    }
}

然而,如果我们 println 结果 XML 配置,name 元素神秘地被省略了(并且也是默默地):

<generator>
    <!-- ... -->
    <strategy />
</generator>

其次,可以使用什么机制来预编译生成器策略class (com.example.MyCustomGeneratorStrategy) 并使其在构建脚本的classpath 中可用?这里可能存在一个问题:策略代码依赖于 jOOQ 的代码生成模块(也可能有其他依赖性——例如我们的依赖于 Apache Commons Lang)。

第一个问题(name 被默默省略)似乎与问题 Groovy MarkupBuilder name conflict 中描述的问题类似。按照那里的答案的建议,我们可以通过以下方式解决问题 #1:

// ...
generator() {
    // ...
    strategy() {
        delegate.invokeMethod('name', 'com.example.MyCustomGeneratorStrategy')
    }
}

(当然,在废话上面加上描述性注释,以防止将来发生任何胡闹......)有了这个,XML 配置实际上是正确的:

<strategy>
  <name>com.example.MyCustomGeneratorStrategy</name>
</strategy>

第二个问题(预编译策略 class 并将其放置在构建脚本的 class 路径中)是 already solved by Gradle:使用特殊的 buildSrc 项目。即在项目根目录下放一个buildSrc目录。设置 buildSrc/build.gradle 以包含 jOOQ codegen 依赖项和您可能需要的任何其他依赖项:

repositories() {
    mavenCentral()
}

dependencies {
    compile 'org.apache.commons:commons-lang3:+'
    compile 'org.jooq:jooq-codegen:+'
}

然后在 buildSrc/src/main/java 中,您可以放置​​生成器策略 class。这样,代码生成就可以正常工作了(Gradle 将为您预编译 buildSrc 中的内容)。如果你搞砸了生成器 class 并且找不到它,jOOQ 应该抛出一个 ClassNotFoundException 无论如何。

(注意:我们正在使用 jOOQ docs 中描述的构建脚本配置的其余部分。如果您偏离了上述内容,上述内容可能没有帮助。)