IIUC, with forkCount=0, you're disabling forking, so everything happens in the Maven process itself and won't use the configured toolchain. If you're running Maven with a JDK < 9 then you'd have that UnsupportedClassVersionError.
For the first case, with forkCount being its default value (forkCount=1) I suppose, can you share the stacktrace? It might be (I haven't checked) that the plugin looks at (loads) the compiled classes to determine how to actually fork/run the tests (e.g. determine if a given class is a test class, by looking at the @Test annotations with JUnit 4 for instance). If that's the case then it means you have to run Maven with a JDK version greater than the one you'd want to use as a toolchain. In other words you can run Maven with JDK 11 to run your tests with JDK 8, but not run Maven with JDK 8 to run tests with JDK 11. On Thu, Aug 26, 2021 at 3:32 PM Delany <delany.middle...@gmail.com> wrote: > Hi. Im having trouble with the jdkToolchain feature of > maven-surefire-plugin > > https://maven.apache.org/surefire/maven-surefire-plugin/examples/toolchains.html > This is my working build tag > > <build> > <pluginManagement> > <plugins> > <plugin> > <artifactId>maven-compiler-plugin</artifactId> > <configuration> > <source>8</source> > <target>8</target> > </configuration> > </plugin> > <plugin> > <artifactId>maven-surefire-plugin</artifactId> > <configuration> > <jdkToolchain> > <version>9</version> > </jdkToolchain> > </configuration> > </plugin> > </plugins> > </pluginManagement> > <plugins> > <plugin> > <artifactId>maven-toolchains-plugin</artifactId> > <executions> > <execution> > <configuration> > <toolchains> > <jdk> > <version>9</version> > </jdk> > </toolchains> > </configuration> > </execution> > </executions> > </plugin> > </plugins> > </build> > > I can build with the above config no problem, but if I configure the > compile plugin with <target>9</target>, surefire throws > > > Execution default-test of goal > org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M5:test failed: > java.lang.UnsupportedClassVersionError: > com/etc/common/crypto/clientreference/TestClientToken has been compiled by > a more recent version of the Java Runtime (class file version 53.0), this > version of the Java Runtime only recognizes class file versions up to 52.0 > > In either case I can see the toolchain being configured in the build log > > [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ > cryptocommon --- > [INFO] Toolchain in maven-compiler-plugin: JDK[/usr/lib/jvm/zulu-9-amd64] > [INFO] Changes detected - recompiling the module! > [INFO] Compiling 7 source files to > /git/tep22x/common_cryptocommon/target/test-classes > [INFO] > [INFO] --- maven-surefire-plugin:3.0.0-M5:test (default-test) @ > cryptocommon --- > [INFO] Toolchain in maven-surefire-plugin: JDK[/usr/lib/jvm/zulu-9-amd64] > > Now, if on top of my changes thus far I go and configure surefire-plugin > with <forkCount>1</forkCount>, it's back to a successful build. > > But, if I follow the advice of > > https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html > and rather set <forkCount>0</forkCount>, I get this > > [ERROR] Exception in provider > [ERROR] org.apache.maven.surefire.booter.SurefireExecutionException: > Exception in provider > [ERROR] at > > org.apache.maven.plugin.surefire.InPluginVMSurefireStarter.runSuitesInProcess(InPluginVMSurefireStarter.java:91) > [ERROR] at > > org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1295) > [ERROR] at > > org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1159) > [ERROR] at > > org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:932) > [ERROR] at > > org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137) > [ERROR] at > > org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210) > [ERROR] at > > org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156) > [ERROR] at > > org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148) > [ERROR] at > > org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117) > [ERROR] at > > org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:196) > [ERROR] at > > org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:186) > [ERROR] at java.util.concurrent.FutureTask.run(FutureTask.java:266) > [ERROR] at > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > [ERROR] at java.util.concurrent.FutureTask.run(FutureTask.java:266) > [ERROR] at > > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > [ERROR] at > > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > [ERROR] at java.lang.Thread.run(Thread.java:748) > [ERROR] Caused by: java.lang.UnsupportedClassVersionError: > com/traderoot/common/crypto/clientreference/TestClientToken has been > compiled by a more recent version of the Java Runtime (class file version > 53.0), this version of the Java Runtime only recognizes class f > ile versions up to 52.0 > [ERROR] at java.lang.ClassLoader.defineClass1(Native Method) > [ERROR] at java.lang.ClassLoader.defineClass(ClassLoader.java:756) > [ERROR] at > java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) > [ERROR] at > java.net.URLClassLoader.defineClass(URLClassLoader.java:468) > [ERROR] at > java.net.URLClassLoader.access$100(URLClassLoader.java:74) > [ERROR] at java.net.URLClassLoader$1.run(URLClassLoader.java:369) > [ERROR] at java.net.URLClassLoader$1.run(URLClassLoader.java:363) > [ERROR] at java.security.AccessController.doPrivileged(Native > Method) > [ERROR] at > java.net.URLClassLoader.findClass(URLClassLoader.java:362) > [ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) > [ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) > [ERROR] at > > org.apache.maven.surefire.booter.IsolatedClassLoader.loadClass(IsolatedClassLoader.java:100) > [ERROR] at > > org.apache.maven.surefire.api.util.DefaultScanResult.loadClass(DefaultScanResult.java:136) > [ERROR] at > > org.apache.maven.surefire.api.util.DefaultScanResult.applyFilter(DefaultScanResult.java:100) > [ERROR] at > > org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.scanClasspath(JUnitPlatformProvider.java:147) > [ERROR] at > > org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:128) > [ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) > [ERROR] at > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > [ERROR] at > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > [ERROR] at java.lang.reflect.Method.invoke(Method.java:498) > [ERROR] at > > org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:167) > [ERROR] at > > org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:161) > [ERROR] at > > org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:84) > [ERROR] at > > org.apache.maven.plugin.surefire.InPluginVMSurefireStarter.runSuitesInProcess(InPluginVMSurefireStarter.java:87) > [ERROR] ... 16 more > > I don't like guessing what is going on here, but i'm not in a position to > go that extra mile and "Run Maven with -Dmaven.surefire.debug, and attach > to the running process with a debugger." > > In a nutshell my question is "how can I build with a JDK 9 or above using a > toolchain and without being limited to a single test fork?" > > Thanks, > Delany > -- Thomas Broyer /tɔ.ma.bʁwa.je/ <http://xn--nna.ma.xn--bwa-xxb.je/>