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

时间:2015-10-17 22:13:01

标签: java gradle code-generation jooq

这类似于this question,但我们正在使用Gradle。假设我们在构建脚本as canonically described in the docs中直接使用jOOQ的代码生成。

有两个问题。首先,我们将向生成器配置中添加一个新的strategy,这应该是直截了当的:

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

但是,如果我们println生成的XML配置,name元素会被神秘地省略(并且也会默默地):

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

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

1 个答案:

答案 0 :(得分:4)

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

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

(当然,将描述性评论放在废话以上,以阻止任何未来的口号......)有了这些,XML配置实际上是正确的:

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

第二个问题(预编译策略类并将其置于构建脚本的类路径中)是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中,您可以放置​​您的生成器策略类。有了这个,代码生成应该Just Work(Gradle会为你预先编译buildSrc中的内容)。如果你搞砸了生成器类并且无法找到它,那么jOOQ应该抛出ClassNotFoundException

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

相关问题