Skip to content

Commit 2704b3c

Browse files
committed
Resources resolving
1 parent 1dc0b3c commit 2704b3c

File tree

7 files changed

+64
-6
lines changed

7 files changed

+64
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
service-loader-impl
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
service-loader-typedef
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from plugin
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from 2nd plugin

mirai-console/backend/integration-test/testers/service-loader/service-loader-2dep-plugin/src/PMain.kt

+34-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
1515
import net.mamoe.mirai.utils.info
1616
import java.util.*
1717
import kotlin.test.assertEquals
18+
import kotlin.test.assertNotNull
19+
import kotlin.test.assertNull
1820

1921

2022
internal class PS : ServiceTypedef
@@ -32,9 +34,37 @@ internal object PMain : KotlinPlugin(JvmPluginDescription("net.mamoe.console.ite
3234
services.forEach { service ->
3335
logger.info { "Service: $service" }
3436
}
35-
assertEquals(mutableListOf(
36-
"net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl",
37-
"net.mamoe.console.itest.serviceloader.ndep.PS",
38-
), services)
37+
assertEquals(
38+
mutableListOf(
39+
"net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl",
40+
"net.mamoe.console.itest.serviceloader.ndep.PS",
41+
), services
42+
)
43+
assertEquals(
44+
"from 2nd plugin",
45+
javaClass.getResourceAsStream("/test-res.txt")!!.reader().use { it.readText() }.trim(),
46+
)
47+
val tstRes = javaClass.classLoader.getResources("test-res.txt").asSequence().onEach {
48+
println(it)
49+
}.toMutableList()
50+
// /service-loader-2dep-plugin-0.0.0.jar!/test-res.txt
51+
// /service-loader-0.0.0.jar!/test-res.txt
52+
// /module-service-loader-typedef-0.0.0.jar!/test-res.txt
53+
// /module-service-loader-impl-0.0.0.jar!/test-res.txt
54+
assertEquals(4, tstRes.size)
55+
56+
assertNotNull(javaClass.getResource("/net/mamoe/console/it/psl/PluginSharedLib.class").also {
57+
println(it)
58+
})
59+
assertEquals(
60+
1,
61+
javaClass.classLoader.getResources("net/mamoe/console/it/psl/PluginSharedLib.class")
62+
.asSequence().toList()
63+
.also {
64+
println(it)
65+
}.size
66+
)
67+
assertNull(javaClass.getResource("/net/mamoe/mirai/console/MiraiConsole.class"))
68+
assertNull(javaClass.getResource("/net/mamoe/mirai/Bot.class"))
3969
}
4070
}

mirai-console/backend/integration-test/testers/service-loader/src/PMain.kt

+12
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,17 @@ internal object PMain : KotlinPlugin(JvmPluginDescription("net.mamoe.console.ite
3636
logger.info { "Service: $service" }
3737
}
3838
assertEquals(mutableListOf("net.mamoe.console.integrationtest.mod.serviceimpl.ServiceImpl"), services)
39+
40+
assertEquals(
41+
"from plugin",
42+
javaClass.getResourceAsStream("/test-res.txt")!!.reader().use { it.readText() }.trim(),
43+
)
44+
val tstRes = javaClass.classLoader.getResources("test-res.txt").asSequence().onEach {
45+
println(it)
46+
}.toMutableList()
47+
// /service-loader-0.0.0.jar!/test-res.txt
48+
// /module-service-loader-typedef-0.0.0.jar!/test-res.txt
49+
// /module-service-loader-impl-0.0.0.jar!/test-res.txt
50+
assertEquals(3, tstRes.size)
3951
}
4052
}

mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt

+14-2
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,13 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
301301
}
302302
src.add(pluginIndependentCL.getResources(name))
303303

304-
val resolved = mutableSetOf<URL>()
305-
src.forEach { nested -> nested.iterator().forEach { resolved.add(it) } }
304+
val resolved = mutableListOf<URL>()
305+
src.forEach { nested ->
306+
nested.iterator().forEach { url ->
307+
if (url !in resolved)
308+
resolved.add(url)
309+
}
310+
}
306311

307312
return Collections.enumeration(resolved)
308313
}
@@ -312,6 +317,9 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
312317

313318
if (name.startsWith("META-INF/mirai-console-plugin/"))
314319
return findResources(name)
320+
// Avoid loading duplicated mirai-console plugins
321+
if (name.startsWith("META-INF/services/net.mamoe.mirai.console.plugin."))
322+
return findResources(name)
315323

316324
return getRes(name, true)
317325
}
@@ -320,6 +328,10 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
320328
name ?: return null
321329
if (name.startsWith("META-INF/mirai-console-plugin/"))
322330
return findResource(name)
331+
// Avoid loading duplicated mirai-console plugins
332+
if (name.startsWith("META-INF/services/net.mamoe.mirai.console.plugin."))
333+
return findResource(name)
334+
323335
findResource(name)?.let { return it }
324336
// parent: ctx.sharedLibrariesLoader
325337
sharedLibrariesLogger.getResource(name)?.let { return it }

0 commit comments

Comments
 (0)