这类似于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)。
答案 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中描述的其余构建脚本配置。如果您偏离了上述内容,上述内容可能没有用。)