使用带有Gradle的Jooq代码生成

时间:2015-11-18 04:47:32

标签: gradle jooq

我正在阅读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文件中?对不起,如果这个问题太基础了。

3 个答案:

答案 0 :(得分:2)

你可以,例如添加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)
  )
}

答案 1 :(得分:1)

@Opal的问题通过一些调整非常有效(谢谢!)。以为我愿意与他人共享jOOQ和Gradle的较新版本。

更改:

  1. <<从第一行中删除,并添加了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())
        }
    }

答案 2 :(得分:0)

您可以创建任务并使用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")

对于以上代码段,您将需要根据您的配置更改变量。

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

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() {

}

在内部,您将需要放置此代码段,这将配置生成器。可以根据您的需要随意进行修改,但是我将提供一个对我有用的代码段:

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
}

这是以下完整的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
}