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