name.remal.gradle_plugins.dsl.extensions.kotlin.collections.Iterable-java.io.File.kt Maven / Gradle / Ivy
package name.remal.gradle_plugins.dsl.extensions
import name.remal.forThreadContextClassLoader
import name.remal.reflection.ExtendedURLClassLoader
import name.remal.reflection.ExtendedURLClassLoader.LoadingOrder
import name.remal.reflection.ExtendedURLClassLoader.LoadingOrder.PARENT_FIRST
import name.remal.reflection.ExtendedURLClassLoader.LoadingOrderFactory
import java.io.File
import java.net.URLClassLoader
internal class ClassLoaderProvider
fun Iterable.forClassLoader(loadingOrder: (className: String) -> LoadingOrder, parent: ClassLoader? = ClassLoaderProvider::class.java.classLoader, action: (classLoader: URLClassLoader) -> R): R {
val loadingOrderFactory = LoadingOrderFactory { className ->
if (className.startsWith("org.gradle.")) return@LoadingOrderFactory PARENT_FIRST
if (className.startsWith("org.slf4j.")) return@LoadingOrderFactory PARENT_FIRST
if (className.startsWith("org.apache.log4j.")) return@LoadingOrderFactory PARENT_FIRST
if (className.startsWith("org.apache.logging.log4j.")) return@LoadingOrderFactory PARENT_FIRST
if (className.startsWith("org.apache.commons.logging.")) return@LoadingOrderFactory PARENT_FIRST
return@LoadingOrderFactory loadingOrder(className)
}
val urls = map { it.toURI().toURL() }
ExtendedURLClassLoader(loadingOrderFactory, urls, parent).use { classLoader ->
forThreadContextClassLoader(classLoader) {
return action(classLoader)
}
}
}
fun Iterable.forClassLoader(loadingOrder: LoadingOrder, parent: ClassLoader? = ClassLoaderProvider::class.java.classLoader, action: (classLoader: URLClassLoader) -> R): R {
return forClassLoader({ loadingOrder }, parent, action)
}
fun Iterable.forClassLoader(parent: ClassLoader? = ClassLoaderProvider::class.java.classLoader, action: (classLoader: URLClassLoader) -> R): R {
return forClassLoader(PARENT_FIRST, parent, action)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy