Resources resolving

This commit is contained in:
Karlatemp 2022-03-12 17:19:54 +08:00
parent d6f4e2e567
commit 51c8684e22
No known key found for this signature in database
GPG Key ID: C6B606FF23D8FED7
7 changed files with 64 additions and 6 deletions

View File

@ -15,6 +15,8 @@ import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.utils.info
import java.util.*
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
internal class PS : ServiceTypedef
@ -32,9 +34,37 @@ internal object PMain : KotlinPlugin(JvmPluginDescription("net.mamoe.console.ite
services.forEach { service ->
logger.info { "Service: $service" }
}
assertEquals(mutableListOf(
"net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl",
"net.mamoe.console.itest.serviceloader.ndep.PS",
), services)
assertEquals(
mutableListOf(
"net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl",
"net.mamoe.console.itest.serviceloader.ndep.PS",
), services
)
assertEquals(
"from 2nd plugin",
javaClass.getResourceAsStream("/test-res.txt")!!.reader().use { it.readText() }.trim(),
)
val tstRes = javaClass.classLoader.getResources("test-res.txt").asSequence().onEach {
println(it)
}.toMutableList()
// /service-loader-2dep-plugin-0.0.0.jar!/test-res.txt
// /service-loader-0.0.0.jar!/test-res.txt
// /module-service-loader-typedef-0.0.0.jar!/test-res.txt
// /module-service-loader-impl-0.0.0.jar!/test-res.txt
assertEquals(4, tstRes.size)
assertNotNull(javaClass.getResource("/net/mamoe/console/it/psl/PluginSharedLib.class").also {
println(it)
})
assertEquals(
1,
javaClass.classLoader.getResources("net/mamoe/console/it/psl/PluginSharedLib.class")
.asSequence().toList()
.also {
println(it)
}.size
)
assertNull(javaClass.getResource("/net/mamoe/mirai/console/MiraiConsole.class"))
assertNull(javaClass.getResource("/net/mamoe/mirai/Bot.class"))
}
}

View File

@ -36,5 +36,17 @@ internal object PMain : KotlinPlugin(JvmPluginDescription("net.mamoe.console.ite
logger.info { "Service: $service" }
}
assertEquals(mutableListOf("net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl"), services)
assertEquals(
"from plugin",
javaClass.getResourceAsStream("/test-res.txt")!!.reader().use { it.readText() }.trim(),
)
val tstRes = javaClass.classLoader.getResources("test-res.txt").asSequence().onEach {
println(it)
}.toMutableList()
// /service-loader-0.0.0.jar!/test-res.txt
// /module-service-loader-typedef-0.0.0.jar!/test-res.txt
// /module-service-loader-impl-0.0.0.jar!/test-res.txt
assertEquals(3, tstRes.size)
}
}

View File

@ -301,8 +301,13 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
}
src.add(pluginIndependentCL.getResources(name))
val resolved = mutableSetOf<URL>()
src.forEach { nested -> nested.iterator().forEach { resolved.add(it) } }
val resolved = mutableListOf<URL>()
src.forEach { nested ->
nested.iterator().forEach { url ->
if (url !in resolved)
resolved.add(url)
}
}
return Collections.enumeration(resolved)
}
@ -312,6 +317,9 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
if (name.startsWith("META-INF/mirai-console-plugin/"))
return findResources(name)
// Avoid loading duplicated mirai-console plugins
if (name.startsWith("META-INF/services/net.mamoe.mirai.console.plugin."))
return findResources(name)
return getRes(name, true)
}
@ -320,6 +328,10 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
name ?: return null
if (name.startsWith("META-INF/mirai-console-plugin/"))
return findResource(name)
// Avoid loading duplicated mirai-console plugins
if (name.startsWith("META-INF/services/net.mamoe.mirai.console.plugin."))
return findResource(name)
findResource(name)?.let { return it }
// parent: ctx.sharedLibrariesLoader
sharedLibrariesLogger.getResource(name)?.let { return it }