From 008d185960140b75511d8f3125c68bbdf7e234dd Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Thu, 7 Dec 2023 18:46:33 +0100 Subject: [PATCH 1/8] Add org.jline as module to component directory --- distribution/bin/enso | 2 +- distribution/bin/enso.bat | 2 +- .../runtime/src/main/java/org/enso/ClassLoaderConstants.java | 4 ++-- project/JPMSUtils.scala | 4 +++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/distribution/bin/enso b/distribution/bin/enso index c32e6ad5b5d9..9d6d848247aa 100755 --- a/distribution/bin/enso +++ b/distribution/bin/enso @@ -8,5 +8,5 @@ for opt in "$@"; do done -exec java --module-path $COMP_PATH $EXTRA_OPTS $JAVA_OPTS -m org.enso.runtime/org.enso.EngineRunnerBootLoader "$@" +exec java --module-path $COMP_PATH --add-modules org.jline $EXTRA_OPTS $JAVA_OPTS -m org.enso.runtime/org.enso.EngineRunnerBootLoader "$@" exit diff --git a/distribution/bin/enso.bat b/distribution/bin/enso.bat index bc2867d4a16c..3b7c7c3b5db5 100644 --- a/distribution/bin/enso.bat +++ b/distribution/bin/enso.bat @@ -6,5 +6,5 @@ if /I %%A==--dump-graphs ( set EXTRA_OPTS=%EXTRA_OPTS% -Dgraal.Dump=Truffle:1 ) ) -java --module-path %comp-dir% -Dpolyglot.compiler.IterativePartialEscape=true %EXTRA_OPTS% %JAVA_OPTS% -m org.enso.runtime/org.enso.EngineRunnerBootLoader %* +java --module-path %comp-dir% --add-modules org.jline -Dpolyglot.compiler.IterativePartialEscape=true %EXTRA_OPTS% %JAVA_OPTS% -m org.enso.runtime/org.enso.EngineRunnerBootLoader %* exit /B %errorlevel% diff --git a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java index 9f933c1c9c3f..8eb7201abb5e 100644 --- a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java +++ b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java @@ -13,9 +13,9 @@ public class ClassLoaderConstants { * consistent. */ public static final List CLASS_DELEGATION_PATTERNS = - List.of("org.graalvm", "java", "org.slf4j", "ch.qos"); + List.of("org.graalvm", "java", "org.slf4j", "ch.qos", "org.jline"); - public static final List RESOURCE_DELEGATION_PATTERNS = List.of("org.slf4j", "ch.qos"); + public static final List RESOURCE_DELEGATION_PATTERNS = List.of("org.slf4j", "ch.qos", "org.jline"); /** * Path to the {@code runner.jar} fat jar. This must not be on the system's module-path, because * the JVM would not be able to boot. diff --git a/project/JPMSUtils.scala b/project/JPMSUtils.scala index 1adaba507263..0acf79870324 100644 --- a/project/JPMSUtils.scala +++ b/project/JPMSUtils.scala @@ -28,6 +28,7 @@ import java.nio.file.{ object JPMSUtils { val slf4jVersion = "2.0.9" val logbackClassicVersion = "1.3.7" + val jlineVersion = "3.23.0" /** The list of modules that are included in the `component` directory in engine distribution. * When invoking the `java` command, these modules need to be put on the module-path. @@ -36,7 +37,8 @@ object JPMSUtils { GraalVM.modules ++ GraalVM.langsPkgs ++ GraalVM.toolsPkgs ++ Seq( "org.slf4j" % "slf4j-api" % slf4jVersion, "ch.qos.logback" % "logback-classic" % logbackClassicVersion, - "ch.qos.logback" % "logback-core" % logbackClassicVersion + "ch.qos.logback" % "logback-core" % logbackClassicVersion, + "org.jline" % "jline" % jlineVersion ) /** Filters modules by their IDs from the given classpath. From 7d1feedebc1b98c4d30d43a51c194b4bf5779053 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 8 Dec 2023 16:10:52 +0100 Subject: [PATCH 2/8] Add --add-modules option to runner in project-manager --- .../scala/org/enso/runtimeversionmanager/runner/Runner.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala index 7dfe4669b679..5ceff930c6eb 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala @@ -187,6 +187,8 @@ class Runner( manifestOptions ++ environmentOptions ++ commandLineOptions if (shouldInvokeViaModulePath) { jvmArguments = jvmArguments :++ Seq( + "--add-modules", + "org.jline", "--module-path", engine.componentDirPath.toAbsolutePath.normalize.toString, "-m", From 04ad8b88e4c00c04745e0de248367dc9108c2e16 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Fri, 8 Dec 2023 16:13:27 +0100 Subject: [PATCH 3/8] fmt --- .../runtime/src/main/java/org/enso/ClassLoaderConstants.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java index 8eb7201abb5e..3652b32886c1 100644 --- a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java +++ b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java @@ -15,7 +15,8 @@ public class ClassLoaderConstants { public static final List CLASS_DELEGATION_PATTERNS = List.of("org.graalvm", "java", "org.slf4j", "ch.qos", "org.jline"); - public static final List RESOURCE_DELEGATION_PATTERNS = List.of("org.slf4j", "ch.qos", "org.jline"); + public static final List RESOURCE_DELEGATION_PATTERNS = + List.of("org.slf4j", "ch.qos", "org.jline"); /** * Path to the {@code runner.jar} fat jar. This must not be on the system's module-path, because * the JVM would not be able to boot. From b23313e7d423db60146b026e4d18e075f082c46f Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 13 Dec 2023 13:29:36 +0100 Subject: [PATCH 4/8] Do not delegate loading of org.jline classes to system class loader --- .../runtime/src/main/java/org/enso/ClassLoaderConstants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java index 3652b32886c1..554391e27f67 100644 --- a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java +++ b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java @@ -13,10 +13,10 @@ public class ClassLoaderConstants { * consistent. */ public static final List CLASS_DELEGATION_PATTERNS = - List.of("org.graalvm", "java", "org.slf4j", "ch.qos", "org.jline"); + List.of("org.graalvm", "java", "org.slf4j", "ch.qos"); public static final List RESOURCE_DELEGATION_PATTERNS = - List.of("org.slf4j", "ch.qos", "org.jline"); + List.of("org.slf4j", "ch.qos"); /** * Path to the {@code runner.jar} fat jar. This must not be on the system's module-path, because * the JVM would not be able to boot. From 5428f1f03b7884f42dc31803b7bef41f2b06fbc5 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 13 Dec 2023 13:29:55 +0100 Subject: [PATCH 5/8] Remove --add-modules org.jline option from the launchers --- distribution/bin/enso | 2 +- distribution/bin/enso.bat | 2 +- .../scala/org/enso/runtimeversionmanager/runner/Runner.scala | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/distribution/bin/enso b/distribution/bin/enso index 9d6d848247aa..c32e6ad5b5d9 100755 --- a/distribution/bin/enso +++ b/distribution/bin/enso @@ -8,5 +8,5 @@ for opt in "$@"; do done -exec java --module-path $COMP_PATH --add-modules org.jline $EXTRA_OPTS $JAVA_OPTS -m org.enso.runtime/org.enso.EngineRunnerBootLoader "$@" +exec java --module-path $COMP_PATH $EXTRA_OPTS $JAVA_OPTS -m org.enso.runtime/org.enso.EngineRunnerBootLoader "$@" exit diff --git a/distribution/bin/enso.bat b/distribution/bin/enso.bat index 3b7c7c3b5db5..bc2867d4a16c 100644 --- a/distribution/bin/enso.bat +++ b/distribution/bin/enso.bat @@ -6,5 +6,5 @@ if /I %%A==--dump-graphs ( set EXTRA_OPTS=%EXTRA_OPTS% -Dgraal.Dump=Truffle:1 ) ) -java --module-path %comp-dir% --add-modules org.jline -Dpolyglot.compiler.IterativePartialEscape=true %EXTRA_OPTS% %JAVA_OPTS% -m org.enso.runtime/org.enso.EngineRunnerBootLoader %* +java --module-path %comp-dir% -Dpolyglot.compiler.IterativePartialEscape=true %EXTRA_OPTS% %JAVA_OPTS% -m org.enso.runtime/org.enso.EngineRunnerBootLoader %* exit /B %errorlevel% diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala index 5ceff930c6eb..7dfe4669b679 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala @@ -187,8 +187,6 @@ class Runner( manifestOptions ++ environmentOptions ++ commandLineOptions if (shouldInvokeViaModulePath) { jvmArguments = jvmArguments :++ Seq( - "--add-modules", - "org.jline", "--module-path", engine.componentDirPath.toAbsolutePath.normalize.toString, "-m", From a6711e06a2dd2c0db3d4dc7aa2a8dc0812b52c10 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 13 Dec 2023 13:31:43 +0100 Subject: [PATCH 6/8] Set thread context classLoader for jline's initialization. --- engine/runner/src/main/scala/org/enso/runner/Repl.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/engine/runner/src/main/scala/org/enso/runner/Repl.scala b/engine/runner/src/main/scala/org/enso/runner/Repl.scala index 553c1958fd7f..16f050c9dbd6 100644 --- a/engine/runner/src/main/scala/org/enso/runner/Repl.scala +++ b/engine/runner/src/main/scala/org/enso/runner/Repl.scala @@ -96,6 +96,11 @@ case class SimpleReplIO(in: InputStream, out: OutputStream) extends ReplIO { /** An implementation of [[ReplIO]] using system terminal capabilities. */ case class TerminalIO(historyFilePath: Path) extends ReplIO { + // jline uses the class loader from `Thread.currentThread().getContextClassLoader()` to + // load services. We need to override the context class loader to be `IsolatedClassLoader` + // from the runner.jar class loader. + private val prevClassLoader = Thread.currentThread().getContextClassLoader + Thread.currentThread().setContextClassLoader(classOf[TerminalIO].getClassLoader) private val terminal: Terminal = TerminalBuilder.builder().system(true).build() private val parser: DefaultParser = new DefaultParser() @@ -109,6 +114,7 @@ case class TerminalIO(historyFilePath: Path) extends ReplIO { .history(history) .terminal(terminal) .build() + Thread.currentThread().setContextClassLoader(prevClassLoader) Runtime.getRuntime.addShutdownHook(new Thread() { override def run(): Unit = { From 515010ebe9b2fe7f655ee771e370d7ff10822be9 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 13 Dec 2023 13:31:52 +0100 Subject: [PATCH 7/8] Remove jline from component modules --- project/JPMSUtils.scala | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/project/JPMSUtils.scala b/project/JPMSUtils.scala index 0acf79870324..1adaba507263 100644 --- a/project/JPMSUtils.scala +++ b/project/JPMSUtils.scala @@ -28,7 +28,6 @@ import java.nio.file.{ object JPMSUtils { val slf4jVersion = "2.0.9" val logbackClassicVersion = "1.3.7" - val jlineVersion = "3.23.0" /** The list of modules that are included in the `component` directory in engine distribution. * When invoking the `java` command, these modules need to be put on the module-path. @@ -37,8 +36,7 @@ object JPMSUtils { GraalVM.modules ++ GraalVM.langsPkgs ++ GraalVM.toolsPkgs ++ Seq( "org.slf4j" % "slf4j-api" % slf4jVersion, "ch.qos.logback" % "logback-classic" % logbackClassicVersion, - "ch.qos.logback" % "logback-core" % logbackClassicVersion, - "org.jline" % "jline" % jlineVersion + "ch.qos.logback" % "logback-core" % logbackClassicVersion ) /** Filters modules by their IDs from the given classpath. From 79b836fa69bee493ba437a43877bc1248f2f0198 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 13 Dec 2023 13:32:37 +0100 Subject: [PATCH 8/8] fmt --- engine/runner/src/main/scala/org/enso/runner/Repl.scala | 4 +++- .../runtime/src/main/java/org/enso/ClassLoaderConstants.java | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/engine/runner/src/main/scala/org/enso/runner/Repl.scala b/engine/runner/src/main/scala/org/enso/runner/Repl.scala index 16f050c9dbd6..bf299c454942 100644 --- a/engine/runner/src/main/scala/org/enso/runner/Repl.scala +++ b/engine/runner/src/main/scala/org/enso/runner/Repl.scala @@ -100,7 +100,9 @@ case class TerminalIO(historyFilePath: Path) extends ReplIO { // load services. We need to override the context class loader to be `IsolatedClassLoader` // from the runner.jar class loader. private val prevClassLoader = Thread.currentThread().getContextClassLoader - Thread.currentThread().setContextClassLoader(classOf[TerminalIO].getClassLoader) + Thread + .currentThread() + .setContextClassLoader(classOf[TerminalIO].getClassLoader) private val terminal: Terminal = TerminalBuilder.builder().system(true).build() private val parser: DefaultParser = new DefaultParser() diff --git a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java index 554391e27f67..9f933c1c9c3f 100644 --- a/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java +++ b/engine/runtime/src/main/java/org/enso/ClassLoaderConstants.java @@ -15,8 +15,7 @@ public class ClassLoaderConstants { public static final List CLASS_DELEGATION_PATTERNS = List.of("org.graalvm", "java", "org.slf4j", "ch.qos"); - public static final List RESOURCE_DELEGATION_PATTERNS = - List.of("org.slf4j", "ch.qos"); + public static final List RESOURCE_DELEGATION_PATTERNS = List.of("org.slf4j", "ch.qos"); /** * Path to the {@code runner.jar} fat jar. This must not be on the system's module-path, because * the JVM would not be able to boot.