Skip to content

Commit e883a7c

Browse files
KarlatempHim188
authored andcommitted
[console] Add LegacyCompatibilityLayerClassLoader; Load ktor 1.6.8 as fallback; fix #2297
(cherry picked from commit d47221f)
1 parent 8a77902 commit e883a7c

File tree

3 files changed

+81
-22
lines changed

3 files changed

+81
-22
lines changed

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

+27-1
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,40 @@ internal class BuiltInJvmPluginLoaderImpl(
7575

7676

7777
internal val jvmPluginLoadingCtx: JvmPluginsLoadingCtx by lazy {
78+
val legacyCompatibilityLayerClassLoader = LegacyCompatibilityLayerClassLoader.newInstance(
79+
BuiltInJvmPluginLoaderImpl::class.java.classLoader,
80+
)
81+
7882
val classLoader = DynLibClassLoader.newInstance(
79-
BuiltInJvmPluginLoaderImpl::class.java.classLoader, "GlobalShared", "global-shared"
83+
legacyCompatibilityLayerClassLoader, "GlobalShared", "global-shared"
8084
)
8185
val ctx = JvmPluginsLoadingCtx(
86+
legacyCompatibilityLayerClassLoader,
8287
classLoader,
8388
mutableListOf(),
8489
JvmPluginDependencyDownloader(logger),
8590
)
91+
logger.debug { "Downloading legacy compatibility modules....." }
92+
ctx.downloader.resolveDependencies(
93+
sequenceOf(
94+
"client-core",
95+
"client-core-jvm",
96+
"client-okhttp",
97+
"utils",
98+
"utils-jvm",
99+
).map { "io.ktor:ktor-$it:1.6.8" }.asIterable()
100+
).let { rsp ->
101+
rsp.artifactResults.forEach {
102+
legacyCompatibilityLayerClassLoader.addLib(it.artifact.file)
103+
}
104+
if (logger.isVerboseEnabled) {
105+
logger.verbose("Legacy compatibility modules:")
106+
rsp.artifactResults.forEach { art ->
107+
logger.verbose(" `- ${art.artifact} -> ${art.artifact.file}")
108+
}
109+
}
110+
}
111+
86112
logger.verbose { "Plugin shared libraries: " + PluginManager.pluginSharedLibrariesFolder }
87113
PluginManager.pluginSharedLibrariesFolder.listFiles()?.asSequence().orEmpty()
88114
.onEach { logger.debug { "Peek $it in shared libraries" } }

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

+53-20
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Class resolving:
4141
*/
4242

4343
internal class JvmPluginsLoadingCtx(
44+
val consoleClassLoader: ClassLoader, // plugin system -> mirai-console classloader WRAPPER
4445
val sharedLibrariesLoader: DynLibClassLoader,
4546
val pluginClassLoaders: MutableList<JvmPluginClassLoaderN>,
4647
val downloader: JvmPluginDependencyDownloader,
@@ -51,17 +52,18 @@ internal class JvmPluginsLoadingCtx(
5152
}
5253
}
5354

54-
internal class DynLibClassLoader : URLClassLoader {
55-
private val clName: String?
56-
internal var dependencies: List<DynLibClassLoader> = emptyList()
55+
internal open class DynamicClasspathClassLoader : URLClassLoader {
56+
internal constructor(urls: Array<URL>, parent: ClassLoader?) : super(urls, parent)
5757

58-
private constructor(parent: ClassLoader?, clName: String?) : super(arrayOf(), parent) {
59-
this.clName = clName
58+
@Suppress("Since15")
59+
internal constructor(urls: Array<URL>, parent: ClassLoader?, vmName: String?) : super(vmName, urls, parent)
60+
61+
internal fun addLib(url: URL) {
62+
addURL(url)
6063
}
6164

62-
@Suppress("Since15")
63-
private constructor(parent: ClassLoader?, clName: String?, vmName: String?) : super(vmName, arrayOf(), parent) {
64-
this.clName = clName
65+
internal fun addLib(file: File) {
66+
addURL(file.toURI().toURL())
6567
}
6668

6769

@@ -72,7 +74,47 @@ internal class DynLibClassLoader : URLClassLoader {
7274
ClassLoader.registerAsParallelCapable()
7375
java9 = kotlin.runCatching { Class.forName("java.lang.Module") }.isSuccess
7476
}
77+
}
78+
}
79+
80+
internal class LegacyCompatibilityLayerClassLoader : DynamicClasspathClassLoader {
81+
private constructor(parent: ClassLoader?) : super(arrayOf(), parent)
82+
private constructor(parent: ClassLoader?, vmName: String?) : super(arrayOf(), parent, vmName)
83+
84+
override fun toString(): String {
85+
return "LegacyCompatibilityLayerClassLoader@" + hashCode()
86+
}
87+
88+
companion object {
89+
init {
90+
ClassLoader.registerAsParallelCapable()
91+
}
92+
93+
fun newInstance(parent: ClassLoader?): LegacyCompatibilityLayerClassLoader {
94+
return if (java9) {
95+
LegacyCompatibilityLayerClassLoader(parent, "legacy-compatibility-layer")
96+
} else {
97+
LegacyCompatibilityLayerClassLoader(parent)
98+
}
99+
}
100+
}
101+
}
75102

103+
104+
internal class DynLibClassLoader : DynamicClasspathClassLoader {
105+
private val clName: String?
106+
internal var dependencies: List<DynLibClassLoader> = emptyList()
107+
108+
private constructor(parent: ClassLoader?, clName: String?) : super(arrayOf(), parent) {
109+
this.clName = clName
110+
}
111+
112+
private constructor(parent: ClassLoader?, clName: String?, vmName: String?) : super(arrayOf(), parent, vmName) {
113+
this.clName = clName
114+
}
115+
116+
117+
companion object {
76118
fun newInstance(parent: ClassLoader?, clName: String?, vmName: String?): DynLibClassLoader {
77119
return when {
78120
java9 -> DynLibClassLoader(parent, clName, vmName)
@@ -87,7 +129,7 @@ internal class DynLibClassLoader : URLClassLoader {
87129
if (name.startsWith("io.netty") || name in AllDependenciesClassesHolder.allclasses) {
88130
return AllDependenciesClassesHolder.appClassLoader.loadClass(name)
89131
}
90-
if (name.startsWith("net.mamoe.mirai.")) { // Avoid plugin classing cheating
132+
if (name.startsWith("net.mamoe.mirai.") || name.startsWith("kotlin.") || name.startsWith("kotlinx.")) { // Avoid plugin classing cheating
91133
try {
92134
return AllDependenciesClassesHolder.appClassLoader.loadClass(name)
93135
} catch (ignored: ClassNotFoundException) {
@@ -112,14 +154,6 @@ internal class DynLibClassLoader : URLClassLoader {
112154
return null
113155
}
114156

115-
internal fun addLib(url: URL) {
116-
addURL(url)
117-
}
118-
119-
internal fun addLib(file: File) {
120-
addURL(file.toURI().toURL())
121-
}
122-
123157
override fun toString(): String {
124158
clName?.let { return "DynLibClassLoader{$it}" }
125159
return "DynLibClassLoader@" + hashCode()
@@ -180,7 +214,6 @@ internal class DynLibClassLoader : URLClassLoader {
180214
}
181215
}
182216

183-
@Suppress("JoinDeclarationAndAssignment")
184217
internal class JvmPluginClassLoaderN : URLClassLoader {
185218
val openaccess: JvmPluginClasspath = OpenAccess()
186219
val file: File
@@ -335,7 +368,7 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
335368

336369
fun newLoader(file: File, ctx: JvmPluginsLoadingCtx): JvmPluginClassLoaderN {
337370
return when {
338-
DynLibClassLoader.java9 -> JvmPluginClassLoaderN(file, ctx)
371+
DynamicClasspathClassLoader.java9 -> JvmPluginClassLoaderN(file, ctx)
339372
else -> JvmPluginClassLoaderN(file, ctx, Unit)
340373
}
341374
}
@@ -399,7 +432,7 @@ internal class JvmPluginClassLoaderN : URLClassLoader {
399432
}
400433
}
401434
}
402-
return AllDependenciesClassesHolder.appClassLoader.loadClass(name)
435+
return ctx.consoleClassLoader.loadClass(name)
403436
}
404437
}
405438

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ internal class JvmPluginDependencyDownloader(
254254
logger.debug { "Remote server: " + config.repoLoc }
255255
}
256256

257-
fun resolveDependencies(deps: Collection<String>, vararg filters: DependencyFilter): DependencyResult {
257+
fun resolveDependencies(deps: Iterable<String>, vararg filters: DependencyFilter): DependencyResult {
258258

259259
val dependencies: MutableList<Dependency> = ArrayList()
260260
for (library in deps) {

0 commit comments

Comments
 (0)