Improve standard libs search logic for script compilation:

- refactor appropriate functions to accept optional classloader (not used yet)
- try to load from thread context classloader first
- fallback to marker class classloader in the appropriate function
This commit is contained in:
Ilya Chernikov
2019-01-26 10:26:57 +01:00
parent 95d782b6ca
commit 4f9e844735
@@ -10,8 +10,8 @@ import java.io.FileNotFoundException
import java.net.URL
import java.net.URLClassLoader
import kotlin.reflect.KClass
import kotlin.script.experimental.jvm.impl.getResourcePathForClass
import kotlin.script.experimental.jvm.impl.toFile
import kotlin.script.experimental.jvm.impl.tryGetResourcePathForClass
import kotlin.script.experimental.jvm.impl.tryGetResourcePathForClassByName
import kotlin.script.templates.standard.ScriptTemplateWithArgs
@@ -186,13 +186,21 @@ object KotlinJars {
classpath!!
}
fun getLib(propertyName: String, jarName: String, markerClass: KClass<*>): File? =
fun getLib(propertyName: String, jarName: String, markerClass: KClass<*>, classLoader: ClassLoader? = null): File? =
getExplicitLib(propertyName, jarName)
?: getResourcePathForClass(markerClass.java).takeIf(File::exists)
?: run {
val requestedClassloader = classLoader ?: Thread.currentThread().contextClassLoader
val byName =
if (requestedClassloader == markerClass.java.classLoader) null
else tryGetResourcePathForClassByName(markerClass.java.name, requestedClassloader)
byName ?: tryGetResourcePathForClass(markerClass.java)
}?.takeIf(File::exists)
fun getLib(propertyName: String, jarName: String, markerClassName: String): File? =
fun getLib(propertyName: String, jarName: String, markerClassName: String, classLoader: ClassLoader? = null): File? =
getExplicitLib(propertyName, jarName)
?: tryGetResourcePathForClassByName(markerClassName, Thread.currentThread().contextClassLoader)?.takeIf(File::exists)
?: tryGetResourcePathForClassByName(
markerClassName, classLoader ?: Thread.currentThread().contextClassLoader
)?.takeIf(File::exists)
private fun getExplicitLib(propertyName: String, jarName: String) =
System.getProperty(propertyName)?.let(::File)?.takeIf(File::exists)