google / google/ksp

unable to use Jakarta JAXB in a KSP processor

Open
#2,628 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Kotlin
Stars
3.5k
Forks
415
Avg merge
1d 2h
Merged PRs (30d)
53

Description

I try to use JAXB either directly or through Hibernate in a KSP processor for parsing an orm.xml mapping file. Below example is using Hibernate 7.1.0.
```import org.hibernate.boot.MetadataSources
import org.hibernate.boot.registry.StandardServiceRegistryBuilder
import org.hibernate.boot.spi.MetadataImplementor

class HBT {

fun run() {
val registry = StandardServiceRegistryBuilder()
.configure() // loads hibernate.cfg.xml
.build()

val metadataSources = MetadataSources(registry).addFile("/path/to/orm.xml") // explicitly add orm.xml

val metadata = metadataSources.buildMetadata() as MetadataImplementor

// Print all entity bindings
metadata.entityBindings.forEach { entityBinding ->
println("Entity: ${entityBinding.entityName}")
entityBinding.properties.forEach { prop ->
println(" Property: ${prop.name}")
}
}
}
}
```

No matter what I try in my KSP processor (e.g. adding JAXB to the processor, adding JAXB to the module the processor is run on etc.) I get below error.

```
Caused by: java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key ContextFinder.DefaultProviderNotFound
at jakarta.xml.bind.Messages.format(Messages.java:41)
at jakarta.xml.bind.Messages.format(Messages.java:22)
at jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:250)
at jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:238)
at jakarta.xml.bind.ContextFinder.find(ContextFinder.java:386)
at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:605)
at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:546)
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:119)
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:64)
at org.hibernate.boot.cfgxml.internal.ConfigLoader.loadConfigXmlResource(ConfigLoader.java:55)
at org.hibernate.boot.registry.StandardServiceRegistryBuilder.configure(StandardServiceRegistryBuilder.java:242)
at org.hibernate.boot.registry.StandardServiceRegistryBuilder.configure(StandardServiceRegistryBuilder.java:231)
at com.blablabla.HBT.run(HBT.kt:13)
at com.blablbabla.processor.BeansProcessor.process(BeansProcessor.kt:27)
at com.google.devtools.ksp.impl.KotlinSymbolProcessing$execute$1$1.invoke(KotlinSymbolProcessing.kt:562)
at com.google.devtools.ksp.impl.KotlinSymbolProcessing$execute$1$1.invoke(KotlinSymbolProcessing.kt:560)
at ksp.com.google.devtools.ksp.common.IncrementalContextBase.closeFilesOnException(IncrementalContextBase.kt:400)
at com.google.devtools.ksp.impl.KotlinSymbolProcessing.execute(KotlinSymbolProcessing.kt:560)
at com.google.devtools.ksp.impl.KSPLoader$Companion.loadAndRunKSP(KSPLoader.kt:37)
at com.google.devtools.ksp.impl.KSPLoader.loadAndRunKSP(KSPLoader.kt)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at com.google.devtools.ksp.gradle.KspAAWorkerAction.execute(KspAATask.kt:628)
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:170)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:187)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:120)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:162)
at org.gradle.internal.Factories$1.create(Factories.java:31)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:264)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:128)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:133)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:157)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:126)
... 2 more
```

The build script for my processor:

```
val kspVersion: String by project
val hibernateVersion: String by project
val serializationVersion: String by project
val jpaVersion: String by project

plugins {
kotlin("jvm")
`maven-publish`
id("com.google.devtools.ksp")

}

group = "com.blabla.bla"
version = "1.0.0"

java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:$kspVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
implementation("org.hibernate.orm:hibernate-core:$hibernateVersion")
implementation(project(":core"))
// implementation("org.jgrapht:jgrapht-core:1.5.2")
}

// Configure source sets properly for IDE recognition
kotlin {
sourceSets {
main {
kotlin.srcDir("src/main/kotlin")
kotlin.srcDir("src/main/resources")
}
}
}
```

the build script for the module the processor is run on:
```
plugins {
kotlin("multiplatform")
id("com.google.devtools.ksp")
kotlin("plugin.serialization")
}

group = "com.blabla"
version = "1.0.0"
val hibernateVersion: String by project
val serializationVersion: String by project

kotlin {
jvm {
}

js(IR) {
browser {
testTask {
useMocha {
timeout = "30s"
}
}
}
}

sourceSets {
val commonMain by getting {
dependencies {
implementation(project(":core"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
}
kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin")
}
val jsMain by getting {
}
val jvmMain by getting {
}
val commonTest by getting {
dependencies {
implementation(kotlin("test"))
}
}
val jsTest by getting {
dependencies {
implementation(kotlin("test-js"))
}
}
val jvmTest by getting {
dependencies {
implementation(kotlin("test"))
implementation("org.hibernate.orm:hibernate-core:$hibernateVersion")
implementation("org.hibernate.orm:hibernate-hikaricp:$hibernateVersion")
implementation("com.h2database:h2:2.2.224")
implementation("jakarta.persistence:jakarta.persistence-api:3.2.0")
implementation("org.slf4j:slf4j-simple:2.0.9")
implementation("com.zaxxer:HikariCP:5.1.0")
implementation("org.junit.jupiter:junit-jupiter:5.10.1")
implementation("org.junit.jupiter:junit-jupiter-engine:5.10.1")
runtimeOnly("org.junit.platform:junit-platform-launcher")
}
}
}
}

dependencies {
add("kspCommonMainMetadata", project(":annotation-processor"))

}

tasks.named("compileKotlinJs") {
dependsOn(tasks.named("kspCommonMainKotlinMetadata"))
}
tasks.named("compileKotlinJvm") {
dependsOn(tasks.named("kspCommonMainKotlinMetadata"))
}

tasks.named("jvmTest") {
useJUnitPlatform()
}

tasks.named("jvmProcessResources") {
from("src/commonMain/resources/META-INF/orm.xml") {
into("META-INF")
}
}
tasks.named("jvmTestProcessResources") {
from("src/commonMain/resources/META-INF/orm.xml") {
into("META-INF")
}
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.