From 862884b33009e64b3c25487abde8bcbaf3244d54 Mon Sep 17 00:00:00 2001 From: Anatolii Kmetiuk Date: Fri, 5 Dec 2025 18:55:33 +0900 Subject: [PATCH 1/2] Fix #8345: forked test execution doesn't access main resources Fixes issue where tests running in forked mode (Test / fork := true) cannot access resources from src/main/resources, while non-forked execution works correctly. Root cause: Context classloader not set: tests using Thread.currentThread().getContextClassLoader() couldn't find resources because the context classloader wasn't set to the URLClassLoader with the classpath Solution: Set context classloader in ForkTestMain.runTests() to the URLClassLoader containing the test classpath --- worker/src/main/java/sbt/internal/worker1/ForkTestMain.java | 1 + 1 file changed, 1 insertion(+) diff --git a/worker/src/main/java/sbt/internal/worker1/ForkTestMain.java b/worker/src/main/java/sbt/internal/worker1/ForkTestMain.java index 1a63d1312..a362d3a66 100644 --- a/worker/src/main/java/sbt/internal/worker1/ForkTestMain.java +++ b/worker/src/main/java/sbt/internal/worker1/ForkTestMain.java @@ -325,6 +325,7 @@ public class ForkTestMain { } private void runTests(TestInfo info, ClassLoader classLoader) throws Exception { + Thread.currentThread().setContextClassLoader(classLoader); final ExecutorService executor = executorService(info.parallel); final TaskDef[] tests = info.taskDefs.toArray(new TaskDef[] {}); final int nFrameworks = info.testRunners.size(); From 4bcf866193a7b38e523c68b028e159aed28a6aa8 Mon Sep 17 00:00:00 2001 From: Anatolii Kmetiuk Date: Mon, 8 Dec 2025 14:35:31 +0900 Subject: [PATCH 2/2] Add regression test for #8345 --- .../src/sbt-test/tests/fork-main-resources/build.sbt | 6 ++++++ .../tests/fork-main-resources/src/main/resources/foo | 2 ++ .../src/test/scala/ResourceTest.scala | 10 ++++++++++ sbt-app/src/sbt-test/tests/fork-main-resources/test | 2 ++ 4 files changed, 20 insertions(+) create mode 100644 sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt create mode 100644 sbt-app/src/sbt-test/tests/fork-main-resources/src/main/resources/foo create mode 100644 sbt-app/src/sbt-test/tests/fork-main-resources/src/test/scala/ResourceTest.scala create mode 100644 sbt-app/src/sbt-test/tests/fork-main-resources/test diff --git a/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt b/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt new file mode 100644 index 000000000..08d15322b --- /dev/null +++ b/sbt-app/src/sbt-test/tests/fork-main-resources/build.sbt @@ -0,0 +1,6 @@ +val scalatest = "org.scalatest" %% "scalatest" % "3.2.19" + +scalaVersion := "3.7.3" +Test / fork := true +libraryDependencies += scalatest % Test + diff --git a/sbt-app/src/sbt-test/tests/fork-main-resources/src/main/resources/foo b/sbt-app/src/sbt-test/tests/fork-main-resources/src/main/resources/foo new file mode 100644 index 000000000..c6fe2dcd9 --- /dev/null +++ b/sbt-app/src/sbt-test/tests/fork-main-resources/src/main/resources/foo @@ -0,0 +1,2 @@ +test resource content + diff --git a/sbt-app/src/sbt-test/tests/fork-main-resources/src/test/scala/ResourceTest.scala b/sbt-app/src/sbt-test/tests/fork-main-resources/src/test/scala/ResourceTest.scala new file mode 100644 index 000000000..78bce7d8c --- /dev/null +++ b/sbt-app/src/sbt-test/tests/fork-main-resources/src/test/scala/ResourceTest.scala @@ -0,0 +1,10 @@ +import org.scalatest.funsuite.AnyFunSuite + +class ResourceTest extends AnyFunSuite { + test("access main resource from forked test") { + val loader = Thread.currentThread().getContextClassLoader() + val resource = loader.getResource("foo") + assert(resource != null, "Resource 'foo' from src/main/resources should be accessible in forked test execution") + } +} + diff --git a/sbt-app/src/sbt-test/tests/fork-main-resources/test b/sbt-app/src/sbt-test/tests/fork-main-resources/test new file mode 100644 index 000000000..c8987ae90 --- /dev/null +++ b/sbt-app/src/sbt-test/tests/fork-main-resources/test @@ -0,0 +1,2 @@ +> test +