[Gradle, Native] When running tool in-process, log the actual classpath
When running tool in-process, log the actual classpath extracted from the classloader, not the one that was intended. This helps to detect the cases when these two don't match.
This commit is contained in:
committed by
Space
parent
71af22dba0
commit
1c052ad448
+5
-4
@@ -36,7 +36,7 @@ internal abstract class KotlinToolRunner(
|
|||||||
open fun checkClasspath(): Unit = check(classpath.isNotEmpty()) { "Classpath of the tool is empty: $displayName" }
|
open fun checkClasspath(): Unit = check(classpath.isNotEmpty()) { "Classpath of the tool is empty: $displayName" }
|
||||||
|
|
||||||
abstract val isolatedClassLoaderCacheKey: Any
|
abstract val isolatedClassLoaderCacheKey: Any
|
||||||
private fun getIsolatedClassLoader(): ClassLoader = isolatedClassLoadersMap.computeIfAbsent(isolatedClassLoaderCacheKey) {
|
private fun getIsolatedClassLoader(): URLClassLoader = isolatedClassLoadersMap.computeIfAbsent(isolatedClassLoaderCacheKey) {
|
||||||
val arrayOfURLs = classpath.map { File(it.absolutePath).toURI().toURL() }.toTypedArray()
|
val arrayOfURLs = classpath.map { File(it.absolutePath).toURI().toURL() }.toTypedArray()
|
||||||
URLClassLoader(arrayOfURLs, null).apply {
|
URLClassLoader(arrayOfURLs, null).apply {
|
||||||
setDefaultAssertionStatus(enableAssertions)
|
setDefaultAssertionStatus(enableAssertions)
|
||||||
@@ -112,18 +112,19 @@ internal abstract class KotlinToolRunner(
|
|||||||
|
|
||||||
private fun runInProcess(args: List<String>) {
|
private fun runInProcess(args: List<String>) {
|
||||||
val transformedArgs = transformArgs(args)
|
val transformedArgs = transformArgs(args)
|
||||||
|
val isolatedClassLoader = getIsolatedClassLoader()
|
||||||
|
|
||||||
project.logger.info(
|
project.logger.info(
|
||||||
"""|Run in-process tool "$displayName"
|
"""|Run in-process tool "$displayName"
|
||||||
|Entry point method = $mainClass.$daemonEntryPoint
|
|Entry point method = $mainClass.$daemonEntryPoint
|
||||||
|Classpath = ${classpath.map { it.absolutePath }.toPrettyString()}
|
|Classpath = ${isolatedClassLoader.urLs.map { it.file }.toPrettyString()}
|
||||||
|Arguments = ${args.toPrettyString()}
|
|Arguments = ${args.toPrettyString()}
|
||||||
|Transformed arguments = ${if (transformedArgs == args) "same as arguments" else transformedArgs.toPrettyString()}
|
|Transformed arguments = ${if (transformedArgs == args) "same as arguments" else transformedArgs.toPrettyString()}
|
||||||
""".trimMargin()
|
""".trimMargin()
|
||||||
)
|
)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val mainClass = getIsolatedClassLoader().loadClass(mainClass)
|
val mainClass = isolatedClassLoader.loadClass(mainClass)
|
||||||
val entryPoint = mainClass.methods.single { it.name == daemonEntryPoint }
|
val entryPoint = mainClass.methods.single { it.name == daemonEntryPoint }
|
||||||
|
|
||||||
entryPoint.invoke(null, transformedArgs.toTypedArray())
|
entryPoint.invoke(null, transformedArgs.toTypedArray())
|
||||||
@@ -138,7 +139,7 @@ internal abstract class KotlinToolRunner(
|
|||||||
private fun Sequence<Pair<String, String>>.escapeQuotesForWindows() =
|
private fun Sequence<Pair<String, String>>.escapeQuotesForWindows() =
|
||||||
if (HostManager.hostIsMingw) map { (key, value) -> key.escapeQuotes() to value.escapeQuotes() } else this
|
if (HostManager.hostIsMingw) map { (key, value) -> key.escapeQuotes() to value.escapeQuotes() } else this
|
||||||
|
|
||||||
private val isolatedClassLoadersMap = ConcurrentHashMap<Any, ClassLoader>()
|
private val isolatedClassLoadersMap = ConcurrentHashMap<Any, URLClassLoader>()
|
||||||
|
|
||||||
private fun Map<String, String>.toPrettyString(): String = buildString {
|
private fun Map<String, String>.toPrettyString(): String = buildString {
|
||||||
append('[')
|
append('[')
|
||||||
|
|||||||
Reference in New Issue
Block a user