Ver Fonte

Resources resolving

Karlatemp há 4 anos atrás
pai
commit
51c8684e22

+ 1 - 0
mirai-console/backend/integration-test/testers/service-loader/module-service-loader-impl/resources/test-res.txt

@@ -0,0 +1 @@
+service-loader-impl

+ 1 - 0
mirai-console/backend/integration-test/testers/service-loader/module-service-loader-typedef/resources/test-res.txt

@@ -0,0 +1 @@
+service-loader-typedef

+ 1 - 0
mirai-console/backend/integration-test/testers/service-loader/resources/test-res.txt

@@ -0,0 +1 @@
+from plugin

+ 1 - 0
mirai-console/backend/integration-test/testers/service-loader/service-loader-2dep-plugin/resources/test-res.txt

@@ -0,0 +1 @@
+from 2nd plugin

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

@@ -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"))
     }
 }

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

@@ -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)
     }
 }

+ 14 - 2
mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt

@@ -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 }