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.gradle_plugins.dsl.utils.ClassLoaderProvider
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
fun Iterable.forClassLoader(loadingOrder: (resourceName: String) -> LoadingOrder, parent: ClassLoader? = ClassLoaderProvider::class.java.classLoader, action: (classLoader: URLClassLoader) -> R): R {
val loadingOrderFactory = LoadingOrderFactory { resourceName ->
if (arrayOf(
"groovy/",
"org/gradle/",
"org/slf4j/",
"org/apache/log4j/",
"org/apache/logging/log4j/",
"org/apache/commons/logging/"
).any { resourceName.startsWith(it) }
) {
PARENT_FIRST
} else {
loadingOrder(resourceName)
}
}
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