Sou novo no JOOQ e estou tentando usar o novo plugin Gradle oficial do JOOQ lançado recentemente com meu aplicativo Micronaut 4.
Aqui está o meu 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"
}
}
}
}
Você provavelmente percebeu que estou usando o catálogo de versões do Micronaut para poder usar o JOOQ 3.19.3. Eu sobrescrevo a versão do Micronaut SQL para 5.4.1
poder gradle/mn-override.versions.toml
consumir o JOOQ 3.19.3, que é compatível com o novo plugin JOOQ Gradle.
[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
Quando eu preencho meu DDL em meu banco de dados Postgres e, em seguida, executo ./gradlew jooqCodegen
, o gerador de código do JOOQ gera todo o código Java conforme esperado build/generated-sources/jooq
e a pasta gerada é adicionada ao projeto IntelliJ como uma pasta de origem adicional.
Quando adiciono algum código que deseja usar os artefatos JOOQ gerados
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);
}
}
e tento compilar o projeto usando ./gradlew compileJava
recebo o erro
./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
o compilador não possui as fontes geradas em seu caminho de classe. Alguém sabe como solucionar esse problema? Por que as fontes geradas são entregues ao IDEA, mas não têm efeito na construção do Gradle? Qualquer ajuda é muito apreciada.