[REPL] Stop old classpath calculation on the base classloader
The mechanism of the recursive classpath checking is intended for the "inner" scripting/REPL classloaders and should not touch anything beyond.
This commit is contained in:
committed by
teamcityserver
parent
4608ca15eb
commit
bab5d16001
@@ -42,7 +42,7 @@ class BasicJvmReplEvaluator(val scriptEvaluator: ScriptEvaluator = BasicJvmScrip
|
|||||||
}
|
}
|
||||||
if (lastSnippetClass != null) {
|
if (lastSnippetClass != null) {
|
||||||
jvm {
|
jvm {
|
||||||
baseClassLoader(lastSnippetClass.java.classLoader)
|
lastSnippetClassLoader(lastSnippetClass.java.classLoader)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-5
@@ -119,13 +119,14 @@ fun KJvmCompiledScript.getOrCreateActualClassloader(evaluationConfiguration: Scr
|
|||||||
val module = compiledModule
|
val module = compiledModule
|
||||||
?: throw IllegalStateException("Illegal call sequence, actualClassloader should be set before calling function on the class without module")
|
?: throw IllegalStateException("Illegal call sequence, actualClassloader should be set before calling function on the class without module")
|
||||||
val baseClassLoader = evaluationConfiguration[ScriptEvaluationConfiguration.jvm.baseClassLoader]
|
val baseClassLoader = evaluationConfiguration[ScriptEvaluationConfiguration.jvm.baseClassLoader]
|
||||||
|
val lastClassLoader = evaluationConfiguration[ScriptEvaluationConfiguration.jvm.lastSnippetClassLoader] ?: baseClassLoader
|
||||||
val classLoaderWithDeps =
|
val classLoaderWithDeps =
|
||||||
if (evaluationConfiguration[ScriptEvaluationConfiguration.jvm.loadDependencies] == false) baseClassLoader
|
if (evaluationConfiguration[ScriptEvaluationConfiguration.jvm.loadDependencies] == false) baseClassLoader
|
||||||
else makeClassLoaderFromDependencies(baseClassLoader)
|
else makeClassLoaderFromDependencies(baseClassLoader, lastClassLoader)
|
||||||
return module.createClassLoader(classLoaderWithDeps)
|
return module.createClassLoader(classLoaderWithDeps)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun CompiledScript.makeClassLoaderFromDependencies(baseClassLoader: ClassLoader?): ClassLoader? {
|
private fun CompiledScript.makeClassLoaderFromDependencies(baseClassLoader: ClassLoader?, lastClassLoader: ClassLoader?): ClassLoader? {
|
||||||
val processedScripts = mutableSetOf<CompiledScript>()
|
val processedScripts = mutableSetOf<CompiledScript>()
|
||||||
fun recursiveScriptsSeq(res: Sequence<CompiledScript>, script: CompiledScript): Sequence<CompiledScript> =
|
fun recursiveScriptsSeq(res: Sequence<CompiledScript>, script: CompiledScript): Sequence<CompiledScript> =
|
||||||
if (processedScripts.add(script)) script.otherScripts.asSequence().fold(res + script, ::recursiveScriptsSeq)
|
if (processedScripts.add(script)) script.otherScripts.asSequence().fold(res + script, ::recursiveScriptsSeq)
|
||||||
@@ -139,17 +140,17 @@ private fun CompiledScript.makeClassLoaderFromDependencies(baseClassLoader: Clas
|
|||||||
val processedClasspathElements = mutableSetOf<URL>()
|
val processedClasspathElements = mutableSetOf<URL>()
|
||||||
fun recursiveClassPath(res: Sequence<URL>, classLoader: ClassLoader?): Sequence<URL> =
|
fun recursiveClassPath(res: Sequence<URL>, classLoader: ClassLoader?): Sequence<URL> =
|
||||||
when (classLoader) {
|
when (classLoader) {
|
||||||
null -> res
|
null, baseClassLoader -> res
|
||||||
is DualClassLoader -> recursiveClassPath(res, classLoader.parent) +
|
is DualClassLoader -> recursiveClassPath(res, classLoader.parent) +
|
||||||
recursiveClassPath(emptySequence(), classLoader.fallbackClassLoader)
|
recursiveClassPath(emptySequence(), classLoader.fallbackClassLoader)
|
||||||
is URLClassLoader -> recursiveClassPath(res + classLoader.urLs, classLoader.parent)
|
is URLClassLoader -> recursiveClassPath(res + classLoader.urLs, classLoader.parent)
|
||||||
else -> recursiveClassPath(res, classLoader.parent)
|
else -> recursiveClassPath(res, classLoader.parent)
|
||||||
}
|
}
|
||||||
recursiveClassPath(emptySequence(), baseClassLoader).forEach { processedClasspathElements.add(it) }
|
recursiveClassPath(emptySequence(), lastClassLoader).forEach { processedClasspathElements.add(it) }
|
||||||
|
|
||||||
val processedClassloaders = mutableSetOf<ClassLoader>()
|
val processedClassloaders = mutableSetOf<ClassLoader>()
|
||||||
|
|
||||||
return dependenciesWithConfigurations.fold(baseClassLoader) { parentClassLoader, (compilationConfiguration, scriptDependency) ->
|
return dependenciesWithConfigurations.fold(lastClassLoader) { parentClassLoader, (compilationConfiguration, scriptDependency) ->
|
||||||
when (scriptDependency) {
|
when (scriptDependency) {
|
||||||
is JvmDependency -> {
|
is JvmDependency -> {
|
||||||
scriptDependency.classpath.mapNotNull {
|
scriptDependency.classpath.mapNotNull {
|
||||||
|
|||||||
@@ -33,6 +33,11 @@ val JvmScriptEvaluationConfigurationKeys.baseClassLoader by PropertiesCollection
|
|||||||
isTransient = true
|
isTransient = true
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classloader of the last snippet (supposed to be used in REPL)
|
||||||
|
*/
|
||||||
|
val JvmScriptEvaluationConfigurationKeys.lastSnippetClassLoader by PropertiesCollection.key<ClassLoader?>(isTransient = true)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load script dependencies before evaluation, true by default
|
* Load script dependencies before evaluation, true by default
|
||||||
* If false, it is assumed that the all dependencies will be provided via baseClassLoader
|
* If false, it is assumed that the all dependencies will be provided via baseClassLoader
|
||||||
|
|||||||
Reference in New Issue
Block a user