【问题标题】:How to use jOOQ code generation with Gradle?如何使用 Gradle 生成 jOOQ 代码?
【发布时间】:2016-02-19 17:10:27
【问题描述】:

我正在阅读jOOQ的这篇教程

它向我展示了如何在 Gradle 中使用 jOOQ 代码生成。

根据本教程,我修改了我的 build.gradle 文件,它看起来像这样:

group 'com.abhi'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'org.flywaydb.flyway'

sourceCompatibility = 1.8

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.flywaydb:flyway-gradle-plugin:3.2.1'
        classpath 'org.jooq:jooq-codegen:3.7.1'
        classpath 'com.h2database:h2:1.4.177'
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.jooq', name: 'jooq', version: '3.7.1'
    compile group: 'org.jooq', name: 'jooq-meta', version: '3.7.1'
    compile group: 'org.jooq', name: 'jooq-codegen', version: '3.7.1'
    runtime group: 'com.h2database', name: 'h2', version: '1.4.177'
}

flyway {
    url = 'jdbc:h2:file:target/foobar'
    user = 'sa'
}

但我无法理解的部分是教程还提供了一些代码:

def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)
.configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.7.0.xsd') {
    jdbc() {
        driver('org.h2.Driver')
        url('jdbc:h2:~/test-gradle')
        user('sa')
        password('')
    }
    generator() {
        database() {
        }
        generate() {
        }
        target() {
            packageName('org.jooq.example.gradle.db')
            directory('src/main/java')
        }
    }
}

// Run the code generator
// ----------------------
org.jooq.util.GenerationTool.generate(
    javax.xml.bind.JAXB.unmarshal(new StringReader(writer.toString()), org.jooq.util.jaxb.Configuration.class)
)

我应该把这段代码放在哪里,我应该如何执行它?

这段代码看起来像 Groovy 代码,但我正在编写一个 Java 项目。那么这如何以及在哪里适合我的项目呢?

我的目标是每次构建项目时,所有代码生成都由 Gradle 自己完成,这样我就不必手动运行任何工具。

这是否意味着我将此代码复制并粘贴到我的build.gradle 文件中?

【问题讨论】:

  • 您需要将代码放入build.gradle文件中。最好的方法是将其包装在一个单独的任务中。
  • 是的,将其复制粘贴到 build.gradle 作品中。但很奇怪。你能告诉我如何将它转移到不同的任务吗?

标签: gradle jooq


【解决方案1】:

你可以例如添加generate任务,定义如下:

task generate << {
  def writer = new StringWriter()
  def xml = new groovy.xml.MarkupBuilder(writer)
  .configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.7.0.xsd') {
      jdbc() {
          driver('org.h2.Driver')
          url('jdbc:h2:~/test-gradle')
          user('sa')
          password('')
      }
      generator() {
          database() {
          }
          generate() {
          }
          target() {
              packageName('org.jooq.example.gradle.db')
              directory('src/main/java')
          }
      }
  }

  org.jooq.util.GenerationTool.generate(
      javax.xml.bind.JAXB.unmarshal(new StringReader(writer.toString()), org.jooq.util.jaxb.Configuration.class)
  )
}

【讨论】:

    【解决方案2】:

    @Opal 的回答效果很好(谢谢!),并进行了一些调整。以为我会与任何人分享更新版本的 jOOQ 和 Gradle 的麻烦。

    变化:

    1. &lt;&lt; 从第一行删除,doLast 添加。
    2. jOOQ .xsd 更新到 3.9.2
    3. org.jooq.util.GenerationTool.generate(writer.toString())生成代码
        task generate {
            doLast {
                def writer = new StringWriter()
                def xml = new groovy.xml.MarkupBuilder(writer)
                        .configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.9.2.xsd') {
                            jdbc() {
                              driver('org.h2.Driver')
                              url('jdbc:h2:~/test-gradle')
                              user('sa')
                              password('')
                            }
                            generator() {
                                database() {
                                }
                                generate() {
                                }
                                target() {
                                    packageName('org.jooq.example.gradle.db')
                                    directory('src/main/java')
                                }
                            }
                        }
                org.jooq.util.GenerationTool.generate(writer.toString())
            }
        }
    

    【讨论】:

    • 我不断收到此错误:无法为 org.gradle.api.DefaultTask 类型的任务 ':generate' 获取未知属性 'org'。知道如何解决吗?
    【解决方案3】:

    您可以创建一个任务并使用org.jooq.meta.jaxb.Configuration 类来配置代码生成:

    在您的 build.gradle 文件中,您需要将以下内容放在文件的最顶部(这将允许您使用 jOOQ 类(例如 Gradle 文件中的 org.jooq.meta.jaxb.Configuration 类)。

    buildscript {
    
        repositories {
            mavenCentral()
        }
    
        dependencies {
            classpath group: 'org.jooq', name: 'jooq', version: '3.13.4'
            classpath group: 'org.jooq', name: 'jooq-meta', version: '3.13.4'
            classpath group: 'org.jooq', name: 'jooq-codegen', version: '3.13.4'
            classpath group: 'org.postgresql', name: 'postgresql', version: '42.2.16'
        }
    }
    

    接下来,创建一个名为 jooq.gradle 的新文件(您也可以在 build.gradle 中进行,但我喜欢将其分开以便更好地组织),或者任何您喜欢的名称。

    以下文件改编自here,稍作修改。

    在您的程序顶部,您需要添加以下导入,以便我们使用 jOOQ(它们可能显示为红色或无效,但我们会尽快修复):

    import org.jooq.codegen.GenerationTool
    import org.jooq.meta.jaxb.Database
    import org.jooq.meta.jaxb.Generator
    import org.jooq.meta.jaxb.Jdbc
    import org.jooq.meta.jaxb.Target
    

    太好了!现在我们可以在这之后定义一些变量以便更好地组织(不是必需的):

    ext.db = [
        url: 'jdbc:postgresql://localhost:5432/postgres',
        user: 'postgres',
        password: 'postgres',
        schema: 'public',
        driver: 'org.postgresql.Driver',
        jooqDbImpl: 'org.jooq.meta.postgres.PostgresDatabase',
        packageName: 'samplepackage'
     ]
    
    ext.genpath = new File("${projectDir}/build/generated-src/jooq/main")
    

    对于上面的 sn-p,你需要根据你的配置改变变量。

    接下来,我们可以为这个文件再次添加我们的构建脚本:

    buildscript {
    
        repositories {
            mavenCentral()
        }
    
        dependencies {
            classpath group: 'org.jooq', name: 'jooq', version: '3.13.4'
            classpath group: 'org.jooq', name: 'jooq-meta', version: '3.13.4'
            classpath group: 'org.jooq', name: 'jooq-codegen', version: '3.13.4'
            classpath group: 'org.postgresql', name: 'postgresql', version: '42.2.16'
        }
    }
    

    在此之后,我们可以将 genPath 添加为 Java 源文件:

    sourceSets.main.java.srcDirs += genpath.toString()
    

    我们终于可以开始我们的 generateCode() 任务了! 像这样创建函数定义:

    task generateCode() {
    
    }
    

    你会想在里面放这个sn-p的代码,它会配置生成器。随意根据您的需要修改它,但我会放一个适合我的 sn-p:

    org.jooq.meta.jaxb.Configuration configuration = new 
    org.jooq.meta.jaxb.Configuration()
            .withJdbc(new Jdbc()
                    .withDriver(db.driver)
                    .withUrl(db.url)
                    .withUser(db.user)
                    .withPassword(db.password)
            )
            .withGenerator(new Generator()
                    .withDatabase(new Database()
                            .withName(db.jooqDbImpl)
                            .withIncludes(".*")
                            .withExcludes("")
                            .withInputSchema(db.schema)
                    )
                    .withTarget(new Target()
                            .withPackageName(db.packageName)
                            .withDirectory(genpath.toString())
                    )
            );
    

    最后,经过所有努力,你可以执行这个函数,它将使用上面的配置创建你的代码:

    GenerationTool.generate(configuration);
    

    如果想要有删除生成代码的功能,可以使用如下sn-p:

    task deleteGeneratedCode(type: Delete) {
        delete genpath
    }
    

    以下是完整的 jooq.gradle 文件:

    import org.jooq.codegen.GenerationTool
    import org.jooq.meta.jaxb.Database
    import org.jooq.meta.jaxb.Generator
    import org.jooq.meta.jaxb.Jdbc
    import org.jooq.meta.jaxb.Target
    
    ext.db = [
        url: 'jdbc:postgresql://localhost:5432/postgres',
        user: 'postgres',
        password: 'postgres',
        schema: 'limehrm',
        driver: 'org.postgresql.Driver',
        jooqDbImpl: 'org.jooq.meta.postgres.PostgresDatabase'
        packageName: 'limehrm'
    ]
    
    ext.genpath = new File("${projectDir}/build/generated/source/jooq/main")
    
    buildscript {
    
        repositories {
            mavenCentral()
        }
    
        dependencies {
            classpath group: 'org.jooq', name: 'jooq', version: '3.13.4'
            classpath group: 'org.jooq', name: 'jooq-meta', version: '3.13.4'
            classpath group: 'org.jooq', name: 'jooq-codegen', version: '3.13.4'
            classpath group: 'org.postgresql', name: 'postgresql', version: '42.2.16'
        }
    }
    
    sourceSets.main.java.srcDirs += genpath.toString()
    
    task generateCode() {
        if (!genpath.exists()) {
            genpath.mkdirs()
        }
    
        org.jooq.meta.jaxb.Configuration configuration = new 
        org.jooq.meta.jaxb.Configuration()
            .withJdbc(new Jdbc()
                    .withDriver(db.driver)
                    .withUrl(db.url)
                    .withUser(db.user)
                    .withPassword(db.password)
            )
            .withGenerator(new Generator()
                    .withDatabase(new Database()
                            .withName(db.jooqDbImpl)
                            .withIncludes(".*")
                            .withExcludes("")
                            .withInputSchema(db.schema)
                    )
                    .withTarget(new Target()
                            .withPackageName(db.packageName)
                            .withDirectory(genpath.toString())
                    )
            );
    
        GenerationTool.generate(configuration);
    
    }
    
    task deleteGeneratedCode(type: Delete) {
        delete genpath
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2019-06-22
      • 2016-01-16
      • 2016-06-12
      • 2017-12-08
      • 2016-07-22
      • 2014-09-09
      • 2017-12-03
      • 2017-08-13
      相关资源
      最近更新 更多