我是 JOOQ 的新手,尝试在我的 Micronaut 4 应用程序中使用 JOOQ 最近发布的全新官方 Gradle 插件。
这是我的build.gradle.kts
。
plugins {
alias(libs.plugins.shadow)
alias(libs.plugins.micronaut.application)
alias(libs.plugins.ons.plugin.release)
alias(libs.plugins.jooq.gradle)
alias(libs.plugins.jte.gradle)
}
version = "0.1"
group = "io.wangler"
repositories {
mavenCentral()
}
dependencies {
annotationProcessor(mn.micronaut.data.processor)
annotationProcessor(mn.micronaut.http.validation)
annotationProcessor(mn.micronaut.serde.processor)
implementation(mn.micronaut.data.jdbc)
implementation(mn.micronaut.flyway)
implementation(mn.micronaut.serde.jackson)
implementation(mn.micronaut.jdbc.hikari)
implementation(mn.micronaut.jooq)
implementation(mn.micronaut.views.jte)
compileOnly(mn.micronaut.http.client)
runtimeOnly(mn.logback.classic)
runtimeOnly(mn.postgresql)
jooqCodegen(mn.postgresql)
testImplementation(mn.micronaut.http.client)
}
application {
mainClass.set("io.wangler.Application")
}
java {
sourceCompatibility = JavaVersion.toVersion("21")
targetCompatibility = JavaVersion.toVersion("21")
}
graalvmNative.toolchainDetection.set(false)
micronaut {
runtime("netty")
testRuntime("junit5")
processing {
incremental(true)
annotations("io.wangler.*")
}
}
jte {
sourceDirectory.set(file("src/main/jte").toPath())
generate()
}
// Gradle requires that generateJte is run before some tasks
tasks.configureEach {
if (name == "inspectRuntimeClasspath") {
mustRunAfter("generateJte")
}
}
jooq {
configuration {
jdbc {
url = "jdbc:postgresql:solaria"
user = "user"
password = "password"
driver = "org.postgresql.Driver"
}
generator {
database {
name = "org.jooq.meta.postgres.PostgresDatabase"
includes = ".*"
excludes = "flyway_schema_history"
inputSchema = "public"
}
target {
packageName = "io.wangler.solaria"
}
}
}
}
您可能会注意到,我使用 Micronaut 的版本目录才能使用 JOOQ 3.19.3。我将 Micronaut SQL 版本覆盖为5.4.1
能够gradle/mn-override.versions.toml
使用与新的 JOOQ Gradle 插件兼容的 JOOQ 3.19.3。
[versions]
micronaut-sql = "5.4.1" # to use JOOQ 3.19.3
+--- io.micronaut.sql:micronaut-jooq:5.4.1
| +--- io.micronaut:micronaut-inject:4.2.3 (*)
| +--- jakarta.persistence:jakarta.persistence-api:3.1.0
| +--- io.micronaut.sql:micronaut-jdbc:5.4.1 (*)
| \--- org.jooq:jooq:3.19.3
| \--- io.r2dbc:r2dbc-spi:1.0.0.RELEASE
| \--- org.reactivestreams:reactive-streams:1.0.3 -> 1.0.4
当我将 DDL 填充到 Postgres 数据库然后运行时./gradlew jooqCodegen
,JOOQ 的代码生成器会按预期生成所有 Java 代码,build/generated-sources/jooq
并且生成的文件夹将作为附加源文件夹添加到 IntelliJ 项目中。
然后当我添加一些想要使用生成的 JOOQ 工件的代码时
package io.wangler.solaria.repository;
import io.wangler.solaria.Tables;
import jakarta.inject.Singleton;
import org.jooq.DSLContext;
import java.util.List;
@Singleton
public class DeviceRepository {
private final DSLContext dsl;
public DeviceRepository(DSLContext dsl) {
this.dsl = dsl;
}
public List<Device> findAll() {
return this.dsl.select(Tables.DEVICE.ID, Tables.DEVICE.NAME, Tables.DEVICE.KEY)
.from(Tables.DEVICE)
.fetchInto(Device.class);
}
}
./gradlew compileJava
并尝试使用我得到的错误来编译项目
./src/main/java/io/wangler/solaria/repository/DeviceRepository.java:3: error: cannot find symbol
import io.wangler.solaria.Tables;
^
symbol: class Tables
location: package io.wangler.solaria
编译器的类路径上没有生成的源。有谁知道如何解决这个问题?为什么生成的源码交给IDEA,但在Gradle构建中没有影响?任何帮助深表感谢。
您必须将此任务依赖项添加到您的 build.gradle.kts 文件中:
请参阅此处的讨论:https ://github.com/jOOQ/jOOQ/issues/15966