NoClassDefFound error when using java.sql classes in JMH test in sbt

40 Views Asked by At

If I create a minimal sbt project with a build.sbt that looks like

scalaVersion := "3.3.1"

enablePlugins(JmhPlugin)

with addSbtPlugin("pl.project14.scala" % "sbt-jmh" % "0.4.6") in project/plugins.sbt

and the following code in src/main/scala/test/Test.scala:

import java.sql._

import org.openjdk.jmh.annotations._

@State(Scope.Benchmark)
class Test {

  var connection: Connection = null
}

Then when I run sbt Jmh/compile I get the following exception:

Writing out Java source to /home/thayne/sandbox/sbt-jmh-test/target/scala-3.3.1/src_managed/jmh and resources to /home/thayne/sandbox/sbt-jmh-test/target/scala-3.3.1/resource_managed/jmh
Annotation generator had thrown the exception.
java.lang.NoClassDefFoundError: java/sql/Connection
        at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
        at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578)
        at java.base/java.lang.Class.getDeclaredMethods(Class.java:2676)
        at org.openjdk.jmh.generators.reflection.RFClassInfo.getMethods(RFClassInfo.java:99)
        at org.openjdk.jmh.generators.core.BenchmarkGenerator.buildAnnotatedSet(BenchmarkGenerator.java:213)
        at org.openjdk.jmh.generators.core.BenchmarkGenerator.generate(BenchmarkGenerator.java:77)
        at org.openjdk.jmh.generators.bytecode.JmhBytecodeGenerator.main(JmhBytecodeGenerator.java:100)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at sbt.Run.invokeMain(Run.scala:144)
        at sbt.Run.execute$1(Run.scala:94)
        at sbt.Run.$anonfun$runWithLoader$5(Run.scala:121)
        at sbt.Run$.executeSuccess(Run.scala:187)
        at sbt.Run.runWithLoader(Run.scala:121)
        at sbt.Run.run(Run.scala:128)
        at pl.project13.scala.sbt.JmhPlugin$.internalGenerateBenchmarkSourcesAndResources(JmhPlugin.scala:112)
        at pl.project13.scala.sbt.JmhPlugin$.$anonfun$generateBenchmarkSourcesAndResources$2(JmhPlugin.scala:96)
        at sbt.util.FileFunction$.$anonfun$cached$1(FileFunction.scala:81)
        at sbt.util.FileFunction$.$anonfun$cached$4(FileFunction.scala:154)
        at sbt.util.Difference.apply(Tracked.scala:415)
        at sbt.util.Difference.apply(Tracked.scala:395)
        at sbt.util.FileFunction$.$anonfun$cached$3(FileFunction.scala:150)
        at sbt.util.Difference.apply(Tracked.scala:415)
        at sbt.util.Difference.apply(Tracked.scala:390)
        at sbt.util.FileFunction$.$anonfun$cached$2(FileFunction.scala:149)
        at pl.project13.scala.sbt.JmhPlugin$.generateBenchmarkSourcesAndResources(JmhPlugin.scala:98)
        at pl.project13.scala.sbt.JmhPlugin$.$anonfun$projectSettings$12(JmhPlugin.scala:59)
        at scala.Function1.$anonfun$compose$1(Function1.scala:49)
        at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:63)
        at sbt.std.Transform$$anon$4.work(Transform.scala:69)
        at sbt.Execute.$anonfun$submit$2(Execute.scala:283)
        at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:24)
        at sbt.Execute.work(Execute.scala:292)
        at sbt.Execute.$anonfun$submit$1(Execute.scala:283)
        at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
        at sbt.CompletionService$$anon$2.call(CompletionService.scala:65)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.ClassNotFoundException: java.sql.Connection
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        ... 42 more
    

It seems like the java.sql module isn't available during the compilation state for JMH, but JMH needs access to it for reflection. Is there any way to make it available during the compilation stage?

I'm using Java 21 (OpenJDK).

0

There are 0 best solutions below