Browse Source

Fix ktor 2.0.0 linking (#2051); Improve console plugin classloader logic

- Drop `io.ktor` in consoleRuntimeClasspath included by `core-api: api(io.ktor)`; Fix #2051
- Fix IT.plugin-resolve-self-dependencies-over-console-ones
- Fix IT.plugin-use-console-deps-fallback
- Fix plugin dependencies linked to AppClassLoader if any external dependencies used
Karlatemp 3 năm trước cách đây
mục cha
commit
6d0e5adf95

+ 3 - 0
mirai-console/backend/integration-test/testers/plugin-resolve-self-dependencies-over-console-ones/resources/META-INF/mirai-console-plugin/dependencies-private.txt

@@ -0,0 +1,3 @@
+io.ktor:ktor-client-core-jvm:2.0.0
+io.ktor:ktor-client-java-jvm:2.0.0
+io.ktor:ktor-client-resources-jvm:2.0.0

+ 1 - 0
mirai-console/backend/integration-test/testers/plugin-resolve-self-dependencies-over-console-ones/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin

@@ -0,0 +1 @@
+pluginresolveselfdepoverconsoleones.PluginResolveSelfDependenciesOverConsoleOnes

+ 2 - 0
mirai-console/backend/integration-test/testers/plugin-resolve-self-dependencies-over-console-ones/src/PluginResolveSelfDependenciesOverConsoleOnes.kt

@@ -7,6 +7,8 @@
  * https://github.com/mamoe/mirai/blob/dev/LICENSE
  */
 
+package pluginresolveselfdepoverconsoleones
+
 import io.ktor.client.*
 import io.ktor.client.engine.java.*
 import io.ktor.client.plugins.resources.*

+ 1 - 0
mirai-console/backend/integration-test/testers/plugin-use-console-deps-fallback/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin

@@ -0,0 +1 @@
+pluginuseconsoledepsfallback.PluginUseConsoleDepsFallback

+ 2 - 0
mirai-console/backend/integration-test/testers/plugin-use-console-deps-fallback/src/PluginUseConsoleDepsFallback.kt

@@ -7,6 +7,8 @@
  * https://github.com/mamoe/mirai/blob/dev/LICENSE
  */
 
+package pluginuseconsoledepsfallback
+
 import io.ktor.client.*
 import io.ktor.client.engine.okhttp.*
 import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription

+ 2 - 0
mirai-console/backend/mirai-console/build.gradle.kts

@@ -36,6 +36,8 @@ configurations.create("consoleRuntimeClasspath").attributes {
     attribute(Usage.USAGE_ATTRIBUTE,
         project.objects.named(Usage::class.java, Usage.JAVA_API)
     )
+}.also { consoleRuntimeClasspath ->
+    consoleRuntimeClasspath.exclude(group = "io.ktor")
 }
 
 dependencies {

+ 6 - 4
mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt

@@ -105,6 +105,8 @@ internal class DynLibClassLoader(
     }
 
     internal fun findButNoSystem(name: String): Class<*>? {
+        if (name.startsWith("java.")) return null
+
         val pt = this.parent
         if (pt is DynLibClassLoader) {
             pt.findButNoSystem(name)?.let { return it }
@@ -280,10 +282,10 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
 
     internal fun resolvePluginSharedLibAndPluginClass(name: String): Class<*>? {
         return try {
-            pluginSharedCL.loadClass(name)
+            pluginSharedCL.findButNoSystem(name)
         } catch (e: ClassNotFoundException) {
-            resolvePluginPublicClass(name)
-        }
+            null
+        } ?: resolvePluginPublicClass(name)
     }
 
     internal fun resolvePluginPublicClass(name: String): Class<*>? {
@@ -322,7 +324,7 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
         // Search in independent class loader
         // @context: pluginIndependentCL.parent = pluinSharedCL
         try {
-            return pluginIndependentCL.loadClass(name)
+            pluginIndependentCL.findButNoSystem(name)?.let { return it }
         } catch (ignored: ClassNotFoundException) {
         }