0

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).

2
  • What happens if you add your specific database driver as a dependency to the project? Commented Dec 11, 2023 at 12:06
  • Same result. I excluded that to provide a minimal reproducible example.
    – Thayne
    Commented Dec 11, 2023 at 23:27

0

Browse other questions tagged or ask your own question.