From 6b5f9e2eef299a5b4e237c1aa87b92b2ba9668d9 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 1 May 2022 17:59:05 +0100
Subject: [PATCH] Change file suffix of new plugins to '.mirai2.jar'. Ignore
 '.mirai.jar' if its '.mirai2.jar' counterparts loaded. Close #1999

---
 ...t.mamoe.mirai.console.plugin.jvm.JvmPlugin | 10 ++++++
 .../src/After211NoNew.kt                      | 31 +++++++++++++++++
 .../mirai-jar-after-2_11/build.gradle.kts     | 31 +++++++++++++++++
 ...t.mamoe.mirai.console.plugin.jvm.JvmPlugin | 10 ++++++
 .../mirai-jar-after-2_11/src/After211.kt      | 33 +++++++++++++++++++
 .../mirai-jar-before-2_11/build.gradle.kts    | 31 +++++++++++++++++
 ...t.mamoe.mirai.console.plugin.jvm.JvmPlugin | 10 ++++++
 .../mirai-jar-before-2_11/src/Before211.kt    | 32 ++++++++++++++++++
 .../compatibility-validation/jvm/api/jvm.api  |  2 +-
 .../plugin/BuiltInJvmPluginLoaderImpl.kt      | 23 ++++++++++++-
 .../src/plugin/loader/FilePluginLoader.kt     |  6 ++--
 .../plugin/BuiltInJvmPluginLoaderImplTest.kt  | 16 +++++++++
 .../src/integTest/kotlin/TestBuildPlugin.kt   |  2 +-
 .../src/main/kotlin/BuildMiraiPluginV2.kt     |  6 +++-
 .../main/kotlin/MiraiConsoleGradlePlugin.kt   | 10 +++---
 15 files changed, 243 insertions(+), 10 deletions(-)
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
 create mode 100644 mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt
 create mode 100644 mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt

diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
new file mode 100644
index 000000000..ffb44fdc2
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
@@ -0,0 +1,10 @@
+#
+# Copyright 2019-2022 Mamoe Technologies and contributors.
+#
+# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+#
+# https://github.com/mamoe/mirai/blob/dev/LICENSE
+#
+
+mirai.jar.before211.nonew.After211NoNew
\ No newline at end of file
diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt
new file mode 100644
index 000000000..e7c89ddf4
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11-without-new/src/After211NoNew.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
+ */
+
+package mirai.jar.before211.nonew
+
+import net.mamoe.mirai.console.plugin.PluginManager
+import net.mamoe.mirai.console.plugin.id
+import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
+import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
+import kotlin.test.assertTrue
+
+/*
+ * 2.11 及以后打包的插件, 无新插件替代
+ */
+internal object After211NoNew : KotlinPlugin(
+    JvmPluginDescription(
+        id = "net.mamoe.tester.before211.nonew",
+        version = "1.0.0",
+        name = "Test Plugin",
+    )
+) {
+    override fun onEnable() {
+        assertTrue("net.mamoe.tester.after211 is not loaded") { PluginManager.plugins.any { it.id == "net.mamoe.tester.after211" } }
+    }
+}
diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts
new file mode 100644
index 000000000..dca5a11c2
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/build.gradle.kts
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
+ */
+
+@file:Suppress("UnusedImport")
+
+plugins {
+    kotlin("jvm")
+    kotlin("plugin.serialization")
+    id("java")
+}
+
+version = "0.0.0"
+
+kotlin {
+    explicitApiWarning()
+}
+
+dependencies {
+    api(project(":mirai-console.integration-test"))
+}
+
+tasks.getByName("jar", Jar::class) {
+    archiveBaseName.set("mirai-jar-compatibility-211")
+    archiveExtension.set("mirai2.jar")
+}
\ No newline at end of file
diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
new file mode 100644
index 000000000..b9b9578f6
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
@@ -0,0 +1,10 @@
+#
+# Copyright 2019-2022 Mamoe Technologies and contributors.
+#
+# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+#
+# https://github.com/mamoe/mirai/blob/dev/LICENSE
+#
+
+mirai.jar.after211.After211
\ No newline at end of file
diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt
new file mode 100644
index 000000000..5773b3442
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-after-2_11/src/After211.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
+ */
+
+package mirai.jar.after211
+
+import net.mamoe.mirai.console.plugin.PluginManager
+import net.mamoe.mirai.console.plugin.id
+import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
+import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+/*
+ * 2.11 及以后打包的插件, 有 net.mamoe.tester.after211 替代
+ */
+internal object After211 : KotlinPlugin(
+    JvmPluginDescription(
+        id = "net.mamoe.tester.after211",
+        version = "1.0.0",
+        name = "Test Plugin",
+    )
+) {
+    override fun onEnable() {
+        assertFalse("net.mamoe.tester.before211 is loaded") { PluginManager.plugins.any { it.id == "net.mamoe.tester.before211" } }
+        assertTrue("net.mamoe.tester.before211.nonew is not loaded") { PluginManager.plugins.any { it.id == "net.mamoe.tester.before211.nonew" } }
+    }
+}
diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts
new file mode 100644
index 000000000..f25925ea5
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/build.gradle.kts
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
+ */
+
+@file:Suppress("UnusedImport")
+
+plugins {
+    kotlin("jvm")
+    kotlin("plugin.serialization")
+    id("java")
+}
+
+version = "0.0.0"
+
+kotlin {
+    explicitApiWarning()
+}
+
+dependencies {
+    api(project(":mirai-console.integration-test"))
+}
+
+tasks.getByName("jar", Jar::class) {
+    archiveBaseName.set("mirai-jar-compatibility-211")
+    archiveExtension.set("mirai.jar")
+}
\ No newline at end of file
diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
new file mode 100644
index 000000000..4dbd503d4
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
@@ -0,0 +1,10 @@
+#
+# Copyright 2019-2022 Mamoe Technologies and contributors.
+#
+# 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+# Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+#
+# https://github.com/mamoe/mirai/blob/dev/LICENSE
+#
+
+mirai.jar.before211.Before211
\ No newline at end of file
diff --git a/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt
new file mode 100644
index 000000000..1b2b76d20
--- /dev/null
+++ b/mirai-console/backend/integration-test/testers/mirai-jar-before-2_11/src/Before211.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
+ */
+
+package mirai.jar.before211
+
+import net.mamoe.mirai.console.plugin.PluginManager
+import net.mamoe.mirai.console.plugin.id
+import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
+import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
+import kotlin.test.assertFalse
+
+/*
+ * 2.11 以前打包的插件
+ */
+internal object Before211 : KotlinPlugin(
+    JvmPluginDescription(
+        id = "net.mamoe.tester.before211",
+        version = "1.0.0",
+        name = "Test Plugin",
+    )
+) {
+    override fun onEnable() {
+        assertFalse("Both before211 and after211 are loaded.") { PluginManager.plugins.any { it.id == "net.mamoe.tester.after211" } }
+        throw AssertionError("Only net.mamoe.tester.before211 is loaded.")
+    }
+}
diff --git a/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api b/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api
index d191b99d4..48948b450 100644
--- a/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api
+++ b/mirai-console/backend/mirai-console/compatibility-validation/jvm/api/jvm.api
@@ -2288,7 +2288,7 @@ public abstract class net/mamoe/mirai/console/plugin/loader/AbstractFilePluginLo
 	public fun <init> (Ljava/lang/String;)V
 	protected abstract fun extractPlugins (Lkotlin/sequences/Sequence;)Ljava/util/List;
 	public fun getFileSuffix ()Ljava/lang/String;
-	public final fun listPlugins ()Ljava/util/List;
+	public fun listPlugins ()Ljava/util/List;
 }
 
 public abstract interface class net/mamoe/mirai/console/plugin/loader/FilePluginLoader : net/mamoe/mirai/console/plugin/loader/PluginLoader {
diff --git a/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt b/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt
index 7c7d02830..c49922eb1 100644
--- a/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt
+++ b/mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt
@@ -25,7 +25,6 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoadException
 import net.mamoe.mirai.console.plugin.name
 import net.mamoe.mirai.utils.*
 import java.io.File
-import java.io.InputStream
 import java.nio.file.Path
 import java.util.concurrent.ConcurrentHashMap
 import kotlin.coroutines.CoroutineContext
@@ -44,6 +43,28 @@ internal class BuiltInJvmPluginLoaderImpl(
         internal val logger: MiraiLogger = MiraiConsole.createLogger(JvmPluginLoader::class.simpleName!!)
     }
 
+    fun pluginsFilesSequence(
+        files: Sequence<File> = PluginManager.pluginsFolder.listFiles().orEmpty().asSequence()
+    ): Sequence<File> {
+        val raw = files
+            .filter { it.isFile && it.name.endsWith(fileSuffix, ignoreCase = true) }
+            .toMutableList()
+
+        val mirai2List = raw.filter { it.name.endsWith(".mirai2.jar", ignoreCase = true) }
+        for (mirai2Plugin in mirai2List) {
+            val name = mirai2Plugin.name.substringBeforeLast('.').substringBeforeLast('.') // without ext.
+            raw.removeAll {
+                it !== mirai2Plugin && it.name.substringBeforeLast('.').substringBeforeLast('.') == name
+            } // remove those with .mirai.jar
+        }
+
+        return raw.asSequence()
+    }
+
+    override fun listPlugins(): List<JvmPlugin> {
+        return pluginsFilesSequence().extractPlugins()
+    }
+
     override val configStorage: PluginDataStorage
         get() = MiraiConsoleImplementation.getInstance().configStorageForJvmPluginLoader
 
diff --git a/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt b/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt
index f9b96bad5..ca5ac9263 100644
--- a/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt
+++ b/mirai-console/backend/mirai-console/src/plugin/loader/FilePluginLoader.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019-2021 Mamoe Technologies and contributors.
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
  *
  * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@@ -13,6 +13,7 @@ import net.mamoe.mirai.console.plugin.Plugin
 import net.mamoe.mirai.console.plugin.PluginManager
 import net.mamoe.mirai.console.plugin.description.PluginDescription
 import net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader
+import net.mamoe.mirai.utils.NotStableForInheritance
 import java.io.File
 
 /**
@@ -48,5 +49,6 @@ public abstract class AbstractFilePluginLoader<P : Plugin, D : PluginDescription
      */
     protected abstract fun Sequence<File>.extractPlugins(): List<P>
 
-    public final override fun listPlugins(): List<P> = pluginsFilesSequence().extractPlugins()
+    @NotStableForInheritance // made non-final in 2.11
+    public override fun listPlugins(): List<P> = pluginsFilesSequence().extractPlugins()
 }
\ No newline at end of file
diff --git a/mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt b/mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt
new file mode 100644
index 000000000..ef3d131b1
--- /dev/null
+++ b/mirai-console/backend/mirai-console/test/plugin/BuiltInJvmPluginLoaderImplTest.kt
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2019-2022 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
+ */
+
+package net.mamoe.mirai.console.plugin
+
+import net.mamoe.mirai.console.testFramework.AbstractConsoleInstanceTest
+
+internal class BuiltInJvmPluginLoaderImplTest : AbstractConsoleInstanceTest() {
+
+}
\ No newline at end of file
diff --git a/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt b/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt
index 139b273ff..f77482d4a 100644
--- a/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt
+++ b/mirai-console/tools/gradle-plugin/src/integTest/kotlin/TestBuildPlugin.kt
@@ -204,7 +204,7 @@ class TestBuildPlugin : AbstractTest() {
         }
     }
 
-    private fun findJar(): File = tempDir.resolve("build/mirai").listFiles()!!.first { it.name.endsWith(".mirai.jar") }
+    private fun findJar(): File = tempDir.resolve("build/mirai").listFiles()!!.first { it.name.endsWith(".mirai2.jar") }
 
     private fun checkOutput() {
         val jar = findJar()
diff --git a/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt b/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt
index caf1cc028..d0595e2e9 100644
--- a/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt
+++ b/mirai-console/tools/gradle-plugin/src/main/kotlin/BuildMiraiPluginV2.kt
@@ -35,6 +35,9 @@ import javax.inject.Inject
 
 @Suppress("RedundantLambdaArrow", "RemoveExplicitTypeArguments")
 public open class BuildMiraiPluginV2 : Jar() {
+    public companion object {
+        public const val FILE_SUFFIX: String = "mirai2.jar"
+    }
 
     // @get:Internal
     private lateinit var metadataTask: GenMetadataTask
@@ -243,7 +246,7 @@ public open class BuildMiraiPluginV2 : Jar() {
 
     internal fun init(target: KotlinTarget) {
         dependsOn(metadataTask)
-        archiveExtension.set("mirai.jar")
+        archiveExtension.set(FILE_SUFFIX)
         duplicatesStrategy = DuplicatesStrategy.WARN
 
         val compilations = target.compilations.filter { it.name == KotlinCompilation.MAIN_COMPILATION_NAME }
@@ -256,4 +259,5 @@ public open class BuildMiraiPluginV2 : Jar() {
             elm.path.startsWith("META-INF/") && elm.name.endsWith(".sf", ignoreCase = true)
         }
     }
+
 }
\ No newline at end of file
diff --git a/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt b/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt
index 0664cfcd7..d8ad01a62 100644
--- a/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt
+++ b/mirai-console/tools/gradle-plugin/src/main/kotlin/MiraiConsoleGradlePlugin.kt
@@ -30,9 +30,11 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
 import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
 
 public class MiraiConsoleGradlePlugin : Plugin<Project> {
-    internal companion object {
-        const val MIRAI_SHADOW_CONF_NAME: String = "shadowLink"
-        const val MIRAI_AS_NORMAL_DEP_CONF_NAME: String = "asNormalDep"
+    public companion object {
+        internal const val MIRAI_SHADOW_CONF_NAME: String = "shadowLink"
+        internal const val MIRAI_AS_NORMAL_DEP_CONF_NAME: String = "asNormalDep"
+
+        public const val FILE_SUFFIX: String = "mirai.jar"
     }
 
     private fun KotlinSourceSet.configureSourceSet(project: Project, target: KotlinTarget) {
@@ -137,7 +139,7 @@ public class MiraiConsoleGradlePlugin : Plugin<Project> {
             ).apply shadow@{
                 group = "mirai"
 
-                archiveExtension.set("legacy.mirai.jar")
+                archiveExtension.set(FILE_SUFFIX)
 
                 val compilations = target.compilations.filter { it.name == MAIN_COMPILATION_NAME }