@@ -4,14 +4,17 @@ import dev.arbjerg.lavalink.gradle.tasks.*
44import org.gradle.api.Plugin
55import org.gradle.api.Project
66import org.gradle.api.artifacts.Dependency
7+ import org.gradle.api.artifacts.ModuleVersionIdentifier
78import org.gradle.api.provider.Provider
89import org.gradle.api.publish.PublishingExtension
910import org.gradle.api.publish.maven.MavenPublication
1011import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
1112import org.gradle.api.tasks.Copy
1213import org.gradle.api.tasks.SourceSetContainer
13- import org.gradle.jvm.tasks.Jar
14+ import org.gradle.api.tasks.bundling.Jar
15+ import org.gradle.api.tasks.bundling.Zip
1416import org.gradle.kotlin.dsl.*
17+ import org.gradle.language.base.plugins.LifecycleBasePlugin
1518
1619private const val lavalinkExtensionName = " lavalinkPlugin"
1720
@@ -22,10 +25,10 @@ class LavalinkGradlePlugin : Plugin<Project> {
2225 override fun apply (target : Project ) {
2326 with (target) {
2427 check(plugins.hasPlugin(" org.gradle.java" )) { " Please apply the Java/Kotlin plugin before Lavalink" }
25- configureExtension()
28+ val extension = configureExtension()
2629 configurePublishing()
2730 val serverDependency = configureDependencies()
28- configureTasks(serverDependency)
31+ configureTasks(extension, serverDependency)
2932 configureSourceSets()
3033 }
3134 }
@@ -36,12 +39,14 @@ class LavalinkGradlePlugin : Plugin<Project> {
3639}
3740
3841private fun Project.configureExtension (): LavalinkExtension {
42+ @Suppress(" DEPRECATION" )
3943 return extensions.create<LavalinkExtension >(lavalinkExtensionName).apply {
4044 version.convention(provider { project.version.toString() })
4145 name.convention(project.name)
4246 path.convention(provider { project.group.toString() })
4347 serverVersion.convention(apiVersion)
4448 configurePublishing.convention(true )
49+ requires.convention(serverVersion)
4550 }
4651}
4752
@@ -75,6 +80,7 @@ private fun Project.configurePublishing() {
7580 publications {
7681 create<MavenPublication >(" maven" ) {
7782 from(components[" java" ])
83+ artifact(tasks.named(" assemblePlugin" ))
7884 }
7985 }
8086 }
@@ -92,67 +98,79 @@ private fun Project.configureSourceSets() {
9298 }
9399}
94100
95- private fun Project.configureTasks (serverDependency : Provider <Dependency >) {
101+ private fun Project.configureTasks (extension : LavalinkExtension , serverDependency : Provider <Dependency >) {
96102 tasks {
97103 val generatePluginProperties by registering(GeneratePluginPropertiesTask ::class )
98104 named(" processResources" ) {
99105 dependsOn(generatePluginProperties)
100106 }
101107
102- val jar by named<Jar >(" jar" ) {
103- configurations.getByName(" runtimeClasspath" )
104- .incoming
105- .artifactView {
106- // componentFilter { it !is ProjectComponentIdentifier }
107- }.artifacts
108- .forEach {
109- from(zipTree(it.file)) {
110- exclude(" META-INF/**" )
108+ val jar by getting(Jar ::class )
109+ val collectPluginDependencies by registering(Copy ::class ) {
110+ val destinationDirectory = layout.buildDirectory.dir(" dependencies" )
111+ delete(destinationDirectory) // Delete old data
112+
113+ from({
114+ val dependency =
115+ dependencies.create(" dev.arbjerg.lavalink:Lavalink-Server:${extension.serverVersion.get()} " ) {
116+ // Old sedmelluq artifacts are still referenced at some places
117+ // but do not resolve anymore since jcenter is dead
118+ exclude(group = " com.sedmelluq" )
111119 }
112- }
113120
114- // configurations.getByName("runtimeClasspath")
115- // .allDependencies
116- // .filterIsInstance<ProjectDependency>()
117- // .forEach { dependency ->
118- // val project = dependency.dependencyProject
119- // if (project.plugins.hasPlugin("org.jetbrains.kotlin.multiplatform")) {
120- // val compilationName = provider {
121- // project.extensions.getByType<KotlinMultiplatformExtension>()
122- // .targets
123- // .first { it is KotlinJvmTarget }
124- // .name
125- // }
126- // dependsOn(compilationName.flatMap { project.tasks.named("${it}MainClasses") })
127- // from(compilationName.flatMap { targetName -> project.layout.buildDirectory.file("classes/kotlin/$targetName/main") }) {
128- // include("**/*.class")
129- // }
130- // } else {
131- // dependsOn(project.tasks.named("classes"))
132- // from(project.layout.buildDirectory.dir("classes")) {
133- // include("**/main/**/*.class")
134- // eachFile {
135- // path = path.substringAfter("main/")
136- // }
137- // }
138- // }
139- // }
121+ // Collect all dependencies lavalink depends on
122+ val serverDependencies = configurations
123+ .detachedConfiguration(dependency)
124+ .resolvedConfiguration
125+ .resolvedArtifacts
126+ .map { it.moduleVersion.id.dependencyNotation }
127+
128+ // Remove them from the jar, to avoid conflicts
129+ configurations.getByName(" runtimeClasspath" )
130+ .resolvedConfiguration
131+ .resolvedArtifacts
132+ .asSequence()
133+ .filter { it.moduleVersion.id.dependencyNotation !in serverDependencies }
134+ .mapNotNull { it.file }
135+ .toList()
136+
137+ })
138+ into(destinationDirectory)
140139 }
141140
142- val installPlugin by registering(Copy ::class ) {
143- from(jar)
144- into(project.testServerFolder)
145- // This always deletes old versions of the plugin in the test server
146- // So we don't install the same plugin twice
147- rename { " plugin.jar" }
141+ register<Zip >(" assemblePlugin" ) {
142+ group = LifecycleBasePlugin .BUILD_GROUP
143+ destinationDirectory = layout.buildDirectory.dir(" distributions" )
144+ archiveBaseName = extension.name.map { " plugin-$it " }
145+
146+ dependsOn(jar)
147+
148+ into(" classes" ) {
149+ with (jar)
150+ exclude(" plugin.properties" )
151+ // Do not include legacy manifest
152+ exclude(" lavalink-plugins/**" )
153+ }
154+
155+ into(" lib" ) {
156+ from(collectPluginDependencies)
157+ }
158+
159+ from(generatePluginProperties)
148160 }
149161
150162 val downloadLavalink by registering(DownloadLavalinkTask ::class ) {
151163 dependencyProvider = serverDependency
152164 }
153165
166+ val classes by existing
167+ val processResources by existing
168+
154169 register<RunLavalinkTask >(" runLavaLink" ) {
155- dependsOn(installPlugin, downloadLavalink )
170+ dependsOn(downloadLavalink, classes, processResources )
156171 }
157172 }
158173}
174+
175+ val ModuleVersionIdentifier .dependencyNotation: String
176+ get() = " $group :$name "
0 commit comments