diff --git a/main/src/main/java/sbt/internal/MetaBuildLoader.java b/main/src/main/java/sbt/internal/MetaBuildLoader.java index 7bc9beac9..46496ce89 100644 --- a/main/src/main/java/sbt/internal/MetaBuildLoader.java +++ b/main/src/main/java/sbt/internal/MetaBuildLoader.java @@ -66,8 +66,11 @@ public final class MetaBuildLoader extends URLClassLoader { * library. */ public static MetaBuildLoader makeLoader(final AppProvider appProvider) throws IOException { + // Every org.jline artifact must live in this tier together. The REPL's ScalaInstance + // loader is parented to it, so a partial match leaves the REPL running one JLine + // version's reader against another's terminal (#9317, #8294). final String jlineJars = - "jline-?[0-9.]+-sbt-.*|jline-terminal(-(jni))?-[0-9.]+|jline-native-[0-9.]+"; + "jline-?[0-9.]+-sbt-.*|jline-(terminal(-jni)?|native|reader|builtins|style)-[0-9.]+"; final String testInterfaceJars = "test-interface(-.*)?"; final String compilerInterfaceJars = "compiler-interface(-.*)?"; final String utilInterfaceJars = "util-interface(-.*)?"; diff --git a/sbt-app/src/sbt-test/console/jline-version-conflict/build.sbt b/sbt-app/src/sbt-test/console/jline-version-conflict/build.sbt new file mode 100644 index 000000000..bc22450cc --- /dev/null +++ b/sbt-app/src/sbt-test/console/jline-version-conflict/build.sbt @@ -0,0 +1,14 @@ +scalaVersion := "3.9.0-RC4" + +lazy val markerFile = settingKey[java.io.File]("marker file written by the console REPL once it starts") + +markerFile := target.value / "console-jline-ok" + +console / initialCommands := { + val path = markerFile.value.getAbsolutePath.replace("\\", "\\\\") + // Scala 3.9 ships JLine 4 while sbt 1.x ships JLine 3. A partial match in + // MetaBuildLoader's JLine tier used to leave the REPL running jline-reader 4.x + // against jline-terminal 3.x, which throws NoSuchMethodError before the prompt + // (#9317). The marker is only written if the REPL actually starts. + s"""java.nio.file.Files.write(java.nio.file.Paths.get("$path"), Array.emptyByteArray)""" +} diff --git a/sbt-app/src/sbt-test/console/jline-version-conflict/test b/sbt-app/src/sbt-test/console/jline-version-conflict/test new file mode 100644 index 000000000..065d0aa92 --- /dev/null +++ b/sbt-app/src/sbt-test/console/jline-version-conflict/test @@ -0,0 +1,2 @@ +> console +$ exists target/console-jline-ok