Improve classpath extraction from classloader:
- implement opt-in unpacking/caching of the jar collection archives, such as spring boot fat jars and WARs, to the temp dir, and creating a valid classpath from extracted archive - turning it on for the new default jsr223 engine - fallback to extracting classpath from resource URLs if the classloader is not known url-based one - refactor and optimize extraction - cache the last retrieved classpath in the default JSR-223 script engine factory
This commit is contained in:
+23
-1
@@ -6,10 +6,14 @@
|
||||
package kotlin.script.experimental.jsr223
|
||||
|
||||
import org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineFactoryBase
|
||||
import java.io.File
|
||||
import javax.script.ScriptEngine
|
||||
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
||||
import kotlin.script.experimental.jvm.JvmScriptCompilationConfigurationBuilder
|
||||
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
|
||||
import kotlin.script.experimental.jvm.jvm
|
||||
import kotlin.script.experimental.jvm.updateClasspath
|
||||
import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContext
|
||||
import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
|
||||
import kotlin.script.experimental.jvmhost.createJvmEvaluationConfigurationFromTemplate
|
||||
import kotlin.script.experimental.jvmhost.jsr223.KotlinJsr223ScriptEngineImpl
|
||||
@@ -18,13 +22,31 @@ class KotlinJsr223DefaultScriptEngineFactory : KotlinJsr223JvmScriptEngineFactor
|
||||
|
||||
private val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<KotlinJsr223DefaultScript>()
|
||||
private val evaluationConfiguration = createJvmEvaluationConfigurationFromTemplate<KotlinJsr223DefaultScript>()
|
||||
private var lastClassLoader: ClassLoader? = null
|
||||
private var lastClassPath: List<File>? = null
|
||||
|
||||
@Synchronized
|
||||
protected fun JvmScriptCompilationConfigurationBuilder.dependenciesFromCurrentContext() {
|
||||
val currentClassLoader = Thread.currentThread().contextClassLoader
|
||||
val classPath = if (lastClassLoader == null || lastClassLoader != currentClassLoader) {
|
||||
scriptCompilationClasspathFromContext(
|
||||
classLoader = currentClassLoader,
|
||||
wholeClasspath = true,
|
||||
unpackJarCollections = true
|
||||
).also {
|
||||
lastClassLoader = currentClassLoader
|
||||
lastClassPath = it
|
||||
}
|
||||
} else lastClassPath!!
|
||||
updateClasspath(classPath)
|
||||
}
|
||||
|
||||
override fun getScriptEngine(): ScriptEngine =
|
||||
KotlinJsr223ScriptEngineImpl(
|
||||
this,
|
||||
ScriptCompilationConfiguration(compilationConfiguration) {
|
||||
jvm {
|
||||
dependenciesFromCurrentContext(wholeClasspath = true)
|
||||
dependenciesFromCurrentContext()
|
||||
}
|
||||
},
|
||||
evaluationConfiguration
|
||||
|
||||
Reference in New Issue
Block a user