Giter Club home page Giter Club logo

kotlin-dsl-gradle-jooq-plugin's Introduction

kotlin-dsl-jooq-plugin

A plugin that closely mirrors the de-facto (but non-official) gradle plugin for jOOQ by etiennestuder. While the gradle plugin can be used while using kotlin-dsl it can get very difficult to use it because it employs the dynamic method mechanism of groovy, which the kotlin runtime cannot use to figure out the types and most of the types have to be annotated by the developer. This plugins also adds a couple of extra features that some use cases might require.

Author Rohan Prabhu ([email protected])

License Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0)

Latest Version 0.4.6 | Legacy Version 0.3.1

Contributors

A huge thank you for the kind people submitting PRs and continuously improving this plugin (in no particular order). If you see yours or anybodys name missing, please submit a PR marking a change in this section.

  1. Nigel Gott @nigel-gott
  2. Aldo Borrerro @aldoborrero
  3. Ivan @devshift
  4. Anuraag Agrawal @anuraaga
  5. Davin Kevin @davinkevin

What it provides

  1. Configure jooq code generation against a target database.
  2. Task dependency management, specifically its dependencies on compileJava and compileKotlin. As opposed to the gradle plugin, this plugin also configures the dependencies for the compileKotlin task.
  3. Lock version of jooq throughout the project in all configurations.
  4. Specify additional source directories which could be treated as an input for the code generation task (this is useful when you are using database migrations).

Similar to the gradle plugin, you can specify multiple jooq configurations and they will be mapped to different gradle tasks which will individually generate the code.

Usage

To apply the plugin, use the gradle plugin syntax:

plugins {
    id("com.rohanprabhu.kotlin-dsl-jooq") version "0.4.6"
}

If you want to use older versions of jOOQ (i.e. 3.10 and older) use plugin version "0.3.1". Do note that 0.3.1 does not support Java 9 and requires a slightly different configuration syntax.

Once the plugin is applied, the minimum configuration required to generate sources are:

import com.rohanprabhu.gradle.plugins.kdjooq.*

jooqGenerator {
    configuration("primary", project.java.sourcesets.getByName("main")) {
        configuration = jooqCodegenConfiguration {
            jdbc {
                username = "rohan"
                password = "password"
                driver   = "org.postgresql.Driver"
                url      = "jdbc:postgresql://localhost:5432/example_database"
            }

            generator {
                target {
                    packageName = "com.example.jooq"
                    directory   = "${project.buildDir}/generated/jooq/primary"
                }
                
                database {
                    name = "org.jooq.meta.postgres.PostgresDatabase"
                    inputSchema = "public"
                }
            }
        }
    }
}

If you are using the legacy version of this plugin, then you will need to assign these properties inside the config, i.e.

jooqGenerator {
   configuration("primary", project.java.sourceSets.getByName("main")) {
       configuration = jooqCodegenConfiguration {
           jdbc = jdbc { ...

The last line in the new config does not require the assignment part jdbc = ...

The code generator is run in a classpath of its own, which is specified using jooqGeneratorRuntime. So add your JDBC dependencies (like JDBC drivers) in the jooqGeneratorRuntime configuration in the dependencies block:

dependencies {
    jooqGeneratorRuntime("org.postgresql:postgresql:42.1")
}

This will generate a task called jooq-codegen-primary which will generate the jooq code into the directory as specified under target. The configuration object is the jaxb Configuration provided by jooq.

If you have multiple configurations you need to generate the code for, use:

jooqGenerator {
    configuration("primary", project.java.sourcesets.getByName("main")) { ... }
    configuration("analytics", project.java.sourcesets.getByName("main")) { ... }
}

This will create two tasks jooq-codegen-primary and jooq-codegen-analytics. Do note that both of them will be a dependency of tasks compileJava and compileKotlin so you would rarely need to call these tasks directly.

Do note that if you are using multiple source sets for your project, you might want to select the one you intend and pass it as the second argument of the configuration(..) function. The generated sources are added to the source set that you specify, so that they are included as a part of your compile phase.

Configuration style

There are different ways to write the configuration, the one which was shown above:

jooqGenerator {
    configuration("primary", project.java.sourceSets.getByName("main")) {
        configuration = jooqCodegenConfiguration {
            jdbc {
                username = 'rohan'
                ...
            }

            generator {
                ...
            }
        }
    }
}

Since the configuration is simply the Configuration from org.jooq.util.jaxb, you can construct the object any way you want:

jooqGenerator {
    configuration("primary", project.java.sourceSets.getByName("main")) {
        configuration = Configuration().apply {
            jdbc = Jdbc().withDriver("org.postgresql.Driver")
            ...
        }
    }
}

The first example uses the DSL convenience utilities that are provided as part of this plugin and they essentially create the jaxb package components for you and assign it to the configuration. From 0.4.2 onwards, if you want to re-use certain objects, most common properties have a mirror function with Config suffixed to it that can generate such an object for you. For example, to create a common jdbc config object, you can use the jdbcConfig function:

val commonJdbc = jdbcConfig {
     username = "rohan"
     password = "password"
}

configuration("primary", project.java.sourceSets.main()) {
    configuration = jooqCodegenConfiguration {
        jdbc = commonJdbc

        generator {
            ...
        }
    }
}

configuration("analytics", project.java.sourceSets.main()) {
    configuration = jooqCodegenConfiguration {
        jdbc = commonJdbc

        generator {
            ...
        }
    }
}

If you are using the legacy version, the function name is called jdbc itself.

These methods are available for almost all types that are used by the org.jooq.util.jaxb.Configuration object.

Locking the jooq version

To specify a jooq version and edition to use, specify in the top-level jooqGenerator configuration block:

jooqGenerator {
    jooqEdition = JooqEdition.OpenSource
    jooqVersion = "3.10.1"
}

Once this is specified, any jooq dependency across configurations does not need the version to be specified:

dependencies {
    compile("org.jooq:jooq")
}

This will automatically pick-up the version you have specified in the configuration. Do note that there is currently no way to disable this automatic version locking. Also, the name jooqGenerator is a bit misleading to its alternative action of locking a version number throughout the code base. I intend to rename it in the next version.

Using forced types

As has been mentioned before, since they are simply objects from the jooq package, you could simply set the forced types as:

database {
    forcedTypes = listOf(ForcedType().apply { .. }, ForcedType().apply { .. })
}

but keeping in lines with the kotlin-dsl and the overall gradle convention (also mirroring sort of close to what the gradle plugin offers), you could:

database {
    isIncludeIndexes = true
    // other database parameters here

    forcedTypes {
        forcedType {
            userType = "com.fasterxml.jackson.databind.JsonNode"
            expression = ".*"
            binding = "com.example.PostgreJSONGsonBinding"
            types = "JSONB?"
        }

        forcedType {
            name = "varchar"
            expression = ".*"
            types = "INET"
        }
    }
}

NOTE Since CustomType directive is now deprecated in jooq, no convenience functions are provided for the same, but you can still use it if you wish using:

database {
    customTypes = listOf(... construct your list here ...)
}

Other generation parameters

To fine tune the code generation parameters:

generator {
    database {
        ...
    }

    generate {
        relations = true
        deprecated = false
        records = true
        immutablePojos = false
        ...
    }
}

Task management

The tasks that are mapped are automatically set as dependencies for the compileKotlin and compileJava tasks so you don't have to do anything else manually. The task is considered UP-TO-DATE unless:

  1. The Configuration object has changed.
  2. The output directory of the generator is removed/modified (for example by a clean task or a manual delete).
  3. The classpath as specified by jooqGeneratorRuntime is modified (one example would be if you add/remove dependencies to it).

In addition to this, if you are using a migration tool like flyway, you'd want the generator to run anytime your migration directory has changed. To do so, you can:

configuration("primary", project.java.sourceSets.main()) {
    databaseSources {
        + "${project.projectDir}/src/main/resources/com/example/migrations"
        + "${project.projectDir}/src/main/resources/schema.sql"
    }

    configuration = jooqCodegenConfiguration {
        ...
    }
    ..
}

Any object can be specified after the + symbol, and the path is resovled by gradle depending on the type, as documented here. You can also directly specify the list if you wish (if it is being constructed elsewhere or through a procedure):

databaseSources = listOf( ... ) // Any list of type List<Any>

What you'd also like to do is make your migration task a dependency of the code generation task:

val `jooq-codegen-primary` by project.tasks
`jooq-codegen-primary`.dependsOn("flywayMigrate")

Do remember to use the correct name of the task depending on the configuration name you have chosen.

Optionally, if you want to run the task manually, you can disable this default behavior by setting the variable attachToCompileJava to false:

jooqGenerator {
    attachToCompileJava = false
}

Make sure this is the first line in your jooqGenerator block as it only applies to configurations defined after it.

Configuring the generator JVM

When the generator runs, it uses a java execution spec that is provided by the gradle infrastructure. If you wish to modify the way it runs, and/or add a handler to the post-execution result, you can:

val `jooq-codegen-priamry` : JooqCodeGenerationTask by project.tasks

`jooq-codegen-primary` {
    javaExecAction = Action {
        jvmArgs = listOf("-Xmx2G")
    }

    execResultHandler = Action {
        println(">> Exited with $exitValue")
    }
}

Do not forget to use the correct type annotation here (JooqCodeGenerationTask), otherwise it'll just resolve to gradle.api.tasks.Task and you will get an error, something along the lines of javaExecAction and execResultHandler not being resolved.

Contact

Please file an issue for feature requests or bugs. PRs for improvements are more than welcome.

kotlin-dsl-gradle-jooq-plugin's People

Contributors

anuraaga avatar davinkevin avatar defshift avatar nigel-gott avatar rohanprabhu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

kotlin-dsl-gradle-jooq-plugin's Issues

Future of the project?

Given etiennestuder/gradle-jooq-plugin#62 has been closed, what does it mean for this project?

I haven't checked it out, so I don't know if there's feature parity between Etienne's plugin and yours.

I know you were the one who requested Kotlin dsl support in the first place, and that's why you started this project.

Are you going to stop this plugin and contribute to Étienne's project instead?

I would say it would be beneficial for the gradle kotlin jooq community to have a single plugin, not to confuse newcomers.

fix(databaseSources): be able to provide every types supported by flyway

The documentation provides an example for "flyway" usage with this jooq plugin.

When I try to use databaseSources with a value like listOf("filesystem:../database/migrations") this leads to this kind of error:

> Task :jooq-codegen-primary FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':jooq-codegen-primary'.
> Cannot convert URL 'filesystem:../database/migrations' to a file.

I need to use the filesystem:.. format of URL because my changelog is managed in another folder of my repository, outside of my kotlin project (because we generate an init-db container with this source files).

Do you think it could be possible to support this kind of file path?

Configurable parameters are not evaluated declaritively

The configurable parameters of this plugin are defined in a block and persisted which are then used by further configurations during the project evaluation phase. This causes issues where an ordering is required in terms of specifying these directives v/s blocks where these directives or their side-effects are consumed. An example is as illustrated here : #18

Add attachToCompileJava/Kotlin flag for gradle 6.x compatibility

Just as has been described in this PR for the original jooq plugin it would be nice to be able to disable / enable at will if this plugin attaches itself to compileKotlin and compileJava tasks.

This allows to run manually jooq and to avoid the error that Gradle > 6.0 outputs when you try to delete a dependsOn: Removing a task dependency from a task instance is not supported.

Update: I added below the PR feel free to review and give suggestions. Thanks!

Weird way to specify `jooqCodegenConfiguration`

Current way to specify a jooq configuration is something like:

configuration("", ...) {
    configuration = jooqCodegenConfiguration {
        ....
    }
}

Whereas all other places of configuration looks like:

jdbc {

}

generator {

}

The first example looks really bad and completely out of sync with how everything else is written.

fix(): NPE when using plugin with spring-boot-jooq-starter in 2.3.1

Hello,

I tried to move from maven to gradle, but when using this. great plugin, I found a problem about it.

If I use spring-boot-jooq-starter and this plugin, the defined version seems to conflict. You can see the code here: https://gitlab.com/davinkevin/issue-kotlin-dsl-jooq

The error is the following:

gradle jooq-codegen-primary --stacktrace
> Task :jooq-codegen-primary FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':jooq-codegen-primary'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':jooq-codegen-primary'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.NullPointerException
        at com.rohanprabhu.gradle.plugins.kdjooq.JooqCodeGenerationTask.writeConfigFile(JooqCodeGenerationTask.kt:58)
        at com.rohanprabhu.gradle.plugins.kdjooq.JooqCodeGenerationTask.generateSources(JooqCodeGenerationTask.kt:38)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)


* Get more help at https://help.gradle.org

BUILD FAILED in 3s
1 actionable task: 1 executed

After investigation (I'm new to gradle), it seems to look after the wrong xsd files, and even if I set the version in the plugin to the same used by spring boot 2.3.1 (jooq 3.13.2), I keep the NPE when trying to fetch the jooq xsd.

Hope this could lead to a quick fix or a quick solution ❤️

Example in readme does not work

This is a great plugin -- thank you so much!

The example in the readme does not work for me. Instead, I had to assign each part of the configuration to a property like below. If I don't do this, I end up with a NPE because the pieces of the configuration are all null :).

Thanks again for this great plugin!

jooqGenerator {
    configuration("primary", project.java.sourceSets.getByName("main")) {
        configuration = jooqCodegenConfiguration {
            jdbc = jdbc {
                username = 'rohan'
                ...
            }

            generator = generator {
                ...
                target = target { ... }
            }
        }
    }
}

Handle classpath disparity between plugin target and runtime target

Since the plugin uses references to certain jooq objects that it is built with, there might be scenarios where the objects that are being referenced for configuration computation do not align with the references when the plugin is actually run. This causes issues, one of which is documented here : #19

The original author of this issue has proposed a solution, which works for the time being, but I am keeping this issue opened here to further mull on the issue and evaluare if Reflections is the best way to solve it.

fix(cache): configHash is different between two execution with daemon differents

If I run two consecutive jobs with differents gradle daemon (in the CI), the hash is different and this triggers a cache invalidation.

To reproduce the bug, I have this configuration:

jooqGenerator {

	jooqVersion = "3.13.2"

	configuration("primary", project.sourceSets.getByName("main")) {

		configuration = jooqCodegenConfiguration {

			jdbc {
				url = "jdbc:postgresql://postgres:5432/podcast-server"
				username = "podcast-server-user"
				password = "nAAdo5wNs7WEF1UxUobpJDfS9Si62PHa"
				driver = "org.postgresql.Driver"
			}

			generator {
				database {
					name = "org.jooq.meta.postgres.PostgresDatabase"
					inputSchema = "public"
					excludes = "Databasechangelog|Databasechangeloglock|flyway_schema_history"

					forcedTypes {
						forcedType {
							userType = "com.github.davinkevin.podcastserver.entity.Status"
							converter = "com.github.davinkevin.podcastserver.database.StatusConverter"
							includeExpression = "ITEM\\.STATUS"
						}
					}

					isIncludeTables = true
					isIncludeRoutines = true
					isIncludePackages = false
					isIncludeUDTs = true
					isIncludeSequences = true
					isIncludePrimaryKeys = true
					isIncludeUniqueKeys = true
					isIncludeForeignKeys = true
				}

				target {
					packageName = "com.github.davinkevin.podcastserver.database"
					directory = "${project.buildDir}/generated/jooq/primary"
				}
			}
		}
	}
}

If I print the Objects.deepHashCode(jooqConfiguration.configuration) use as @Input here, on the same daemon I have the same result (due to in memory caching).

gradle jooq-codegen-primary

> Configure project :
-305210474

BUILD SUCCESSFUL in 647ms
1 actionable task: 1 up-to-date
Λ\:~/W/g/d/P/backend kevin | 86-refactor-backend-experiment-gradle-build-tool-for-backend-component $ gradle jooq-codegen-primary

> Configure project :
-305210474

BUILD SUCCESSFUL in 681ms
1 actionable task: 1 up-to-date
Λ\:~/W/g/d/P/backend kevin | 86-refactor-backend-experiment-gradle-build-tool-for-backend-component $ gradle --stop
Stopping Daemon(s)
1 Daemon stopped
Λ\:~/W/g/d/P/backend kevin | 86-refactor-backend-experiment-gradle-build-tool-for-backend-component $ gradle jooq-codegen-primary
Starting a Gradle Daemon, 5 stopped Daemons could not be reused, use --status for details

> Configure project :
-1775873045

> Task :jooq-codegen-primary
[jooq-codegen-3.13.2.jar, postgresql-42.2.12.jar, jooq-meta-3.13.2.jar, jooq-3.13.2.jar, reactive-streams-1.0.3.jar, jaxb-api-2.3.1.jar, javax.activation-api-1.2.0.jar]
juin 20, 2020 10:14:01 PM org.jooq.tools.JooqLogger info
INFOS: Initialising properties  : /Users/kevin/Workspace/gitlab.com/davinkevin/Podcast-Server/backend/build/tmp/jooq/config-primary.xml
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: No <inputCatalog/> was provided. Generating ALL available catalogs instead.
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: License parameters
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   Thank you for using jOOQ and jOOQ's code generator
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Database parameters
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   dialect                : POSTGRES
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   URL                    : jdbc:postgresql://postgres:5432/podcast-server
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   target dir             : /Users/kevin/Workspace/gitlab.com/davinkevin/Podcast-Server/backend/build/generated/jooq/primary
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   target package         : com.github.davinkevin.podcastserver.database
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   includes               : [.*]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   excludes               : [Databasechangelog|Databasechangeloglock|flyway_schema_history]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   includeExcludeColumns  : false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: JavaGenerator parameters
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   annotations (generated): false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   annotations (JPA: any) : false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   annotations (JPA: version):
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   annotations (validation): false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments               : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on attributes : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on catalogs   : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on columns    : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on keys       : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on links      : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on packages   : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on parameters : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on queues     : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on routines   : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on schemas    : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on sequences  : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on tables     : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   comments on udts       : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   sources                : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   sources on views       : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   daos                   : false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   deprecated code        : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (any): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (catalogs): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (keys): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (links): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (queues): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (routines): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (schemas): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (sequences): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (tables): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   global references (udts): true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   indexes                : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   instance fields        : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   interfaces             : false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   interfaces (immutable) : false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   javadoc                : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   keys                   : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   links                  : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   pojos                  : false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   pojos (immutable)      : false
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   queues                 : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   records                : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   routines               : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   sequences              : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   sequenceFlags          : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   table-valued functions : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   tables                 : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   udts                   : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:   relations              : true
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generation remarks
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating catalogs      : Total: 1
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@  @@        @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@
@@@@@@@@@@@@@@@@  @@  @@    @@@@@@@@@@
@@@@@@@@@@  @@@@  @@  @@    @@@@@@@@@@
@@@@@@@@@@        @@        @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@        @@        @@@@@@@@@@
@@@@@@@@@@    @@  @@  @@@@  @@@@@@@@@@
@@@@@@@@@@    @@  @@  @@@@  @@@@@@@@@@
@@@@@@@@@@        @@  @  @  @@@@@@@@@@
@@@@@@@@@@        @@        @@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@  @@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  Thank you for using jOOQ 3.13.2

juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ARRAYs fetched           : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Enums fetched            : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Packages excluded
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Routines fetched         : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Sequences fetched        : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Tables fetched           : 8 (7 included, 1 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: No schema version is applied for catalog . Regenerating.
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating catalog       : DefaultCatalog.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ==========================================================
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating schemata      : Total: 1
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: No schema version is applied for schema public. Regenerating.
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating schema        : Public.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: ----------------------------------------------------------
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: UDTs fetched             : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating tables
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Adding foreign key       : item_cover_id_fkey (public.item.cover_id) referencing cover_pkey
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Adding foreign key       : item_podcast_id_fkey (public.item.podcast_id) referencing podcast_pkey
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Adding foreign key       : podcast_cover_id_fkey (public.podcast.cover_id) referencing cover_pkey
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Adding foreign key       : podcast_tags_podcasts_id_fkey (public.podcast_tags.podcasts_id) referencing podcast_pkey
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Adding foreign key       : podcast_tags_tags_id_fkey (public.podcast_tags.tags_id) referencing tag_pkey
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Adding foreign key       : watch_list_items_items_id_fkey (public.watch_list_items.items_id) referencing item_pkey
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Adding foreign key       : watch_list_items_watch_lists_id_fkey (public.watch_list_items.watch_lists_id) referencing watch_list_pkey
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Synthetic primary keys   : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Overriding primary keys  : 11 (0 included, 11 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table         : Cover.java [input=cover, output=cover, pk=cover_pkey]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Embeddables fetched      : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Indexes fetched          : 5 (5 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table         : Item.java [input=item, output=item, pk=item_pkey]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Forcing type             : public.item.status to <userType>com.github.davinkevin.podcastserver.entity.Status</userType><converter>com.github.davinkevin.podcastserver.database.StatusConverter</converter><includeExpression>ITEM\.STATUS</includeExpression><nullability>ALL</nullability><objectType>ALL</objectType>
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table         : Podcast.java [input=podcast, output=podcast, pk=podcast_pkey]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table         : PodcastTags.java [input=podcast_tags, output=podcast_tags, pk=podcast_tags_pkey]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table         : Tag.java [input=tag, output=tag, pk=tag_pkey]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table         : WatchList.java [input=watch_list, output=watch_list, pk=watch_list_pkey]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table         : WatchListItems.java [input=watch_list_items, output=watch_list_items, pk=watch_list_items_pkey]
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Tables generated         : Total: 678.592ms
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table references
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Table refs generated     : Total: 681.554ms, +2.961ms
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating Keys
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Keys generated           : Total: 687.875ms, +6.32ms
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating Indexes
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Indexes generated        : Total: 690.734ms, +2.858ms
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating table records
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating record        : CoverRecord.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating record        : ItemRecord.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Forcing type             : public.item.status to <userType>com.github.davinkevin.podcastserver.entity.Status</userType><converter>com.github.davinkevin.podcastserver.database.StatusConverter</converter><includeExpression>ITEM\.STATUS</includeExpression><nullability>ALL</nullability><objectType>ALL</objectType>
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating record        : PodcastRecord.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating record        : PodcastTagsRecord.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating record        : TagRecord.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating record        : WatchListRecord.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generating record        : WatchListItemsRecord.java
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Table records generated  : Total: 728.532ms, +37.797ms
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Domains fetched          : 0 (0 included, 0 excluded)
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Generation finished: public: Total: 752.383ms, +23.851ms
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS:
juin 20, 2020 10:14:02 PM org.jooq.tools.JooqLogger info
INFOS: Removing excess files

BUILD SUCCESSFUL in 7s
1 actionable task: 1 executed

This is annoying because during the CI phase, the cache is not valid and the plugin is triggered... but I don't have any database at this build phase. Due to this problem, this also prevents usage of distributed build-cache which is very powerful for CI and the team.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.