Skip to content

Commit e17138a

Browse files
committed
feat: Switch from JVM compatibility to JVM toolchains
Fixes #62
1 parent 8e8abb4 commit e17138a

File tree

6 files changed

+108
-13
lines changed

6 files changed

+108
-13
lines changed

CHANGELOG.md

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
## [Unreleased]
22

3+
### Added
4+
5+
- Support setting "api-version" containing a patch version for v1.20.5+
6+
7+
### Changed
8+
9+
- Set the default [JVM toolchain](https://docs.gradle.org/current/userguide/toolchains.html) version
10+
instead of setting JVM target and source compatibility to 1.8.
11+
The default JVM version depends on [Paper requirements](https://docs.papermc.io/paper/getting-started#requirements).
12+
313
### Fixed
414

515
- Fix compatibility with new versions of Shadow plugin

src/main/kotlin/BukkitGradlePlugin.kt

+24-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package ru.endlesscode.bukkitgradle
22

3-
import org.gradle.api.JavaVersion
43
import org.gradle.api.Plugin
54
import org.gradle.api.Project
65
import org.gradle.api.plugins.JavaPluginExtension
76
import org.gradle.api.tasks.compile.JavaCompile
7+
import org.gradle.jvm.toolchain.JavaLanguageVersion
88
import org.gradle.kotlin.dsl.*
99
import ru.endlesscode.bukkitgradle.dependencies.Dependencies
1010
import ru.endlesscode.bukkitgradle.meta.PluginMetaPlugin
1111
import ru.endlesscode.bukkitgradle.meta.extension.PluginMetaImpl
12+
import ru.endlesscode.bukkitgradle.meta.util.MinecraftVersion
1213
import ru.endlesscode.bukkitgradle.meta.util.StringUtils
14+
import ru.endlesscode.bukkitgradle.meta.util.parsedApiVersion
1315
import ru.endlesscode.bukkitgradle.server.DevServerPlugin
1416
import ru.endlesscode.bukkitgradle.server.extension.ServerConfigurationImpl
1517

@@ -28,7 +30,7 @@ public class BukkitGradlePlugin : Plugin<Project> {
2830

2931
/** Adds needed plugins. */
3032
private fun Project.addPlugins() {
31-
extensions.create<BukkitExtension>("bukkit", configurePluginMeta(), ServerConfigurationImpl())
33+
val bukkit = extensions.create<BukkitExtension>("bukkit", configurePluginMeta(), ServerConfigurationImpl())
3234

3335
with(plugins) {
3436
apply("java")
@@ -37,8 +39,9 @@ public class BukkitGradlePlugin : Plugin<Project> {
3739
}
3840

3941
extensions.configure<JavaPluginExtension> {
40-
sourceCompatibility = JavaVersion.VERSION_1_8
41-
targetCompatibility = JavaVersion.VERSION_1_8
42+
toolchain {
43+
languageVersion.convention(provider { resolveRecommendedJavaVersion(bukkit.parsedApiVersion) })
44+
}
4245
}
4346
}
4447

@@ -48,7 +51,7 @@ public class BukkitGradlePlugin : Plugin<Project> {
4851
description.convention(provider { project.description })
4952
main.convention(name.map { "${project.group}.${StringUtils.toPascalCase(it)}" })
5053
version.convention(provider { project.version.toString() })
51-
apiVersion.convention(provider { StringUtils.parseApiVersion(bukkit.apiVersion) })
54+
apiVersion.convention(provider { resolveDefaultApiVersion(bukkit.parsedApiVersion) })
5255
url.convention(provider { providers.gradleProperty("url").orNull })
5356
}
5457
}
@@ -66,4 +69,20 @@ public class BukkitGradlePlugin : Plugin<Project> {
6669
mavenCentral()
6770
}
6871
}
72+
73+
private fun resolveDefaultApiVersion(version: MinecraftVersion): String? = when {
74+
// "API version" has been introduced in Spigot 1.13
75+
version < MinecraftVersion.V1_13_0 -> null
76+
// From 1.20.5 and onward, a patch version is supported.
77+
version < MinecraftVersion.V1_20_5 -> version.withoutPatch().toString()
78+
else -> version.toString()
79+
}
80+
81+
// See: https://docs.papermc.io/paper/getting-started#requirements
82+
private fun resolveRecommendedJavaVersion(version: MinecraftVersion): JavaLanguageVersion = when {
83+
version >= MinecraftVersion.V1_17_1 -> JavaLanguageVersion.of(21)
84+
version >= MinecraftVersion.V1_16_5 -> JavaLanguageVersion.of(16)
85+
version >= MinecraftVersion.V1_12_0 -> JavaLanguageVersion.of(11)
86+
else -> JavaLanguageVersion.of(8)
87+
}
6988
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package ru.endlesscode.bukkitgradle.meta.util
2+
3+
import ru.endlesscode.bukkitgradle.Bukkit
4+
5+
@JvmInline
6+
internal value class MinecraftVersion(private val value: Int) : Comparable<MinecraftVersion> {
7+
private val major: Int get() = value / 1_00_00
8+
private val minor: Int get() = (value / 1_00) % 100
9+
private val patch: Int get() = value % 100
10+
11+
fun withoutPatch(): MinecraftVersion = MinecraftVersion(value - patch)
12+
13+
override fun toString(): String = if (patch == 0) "$major.$minor" else "$major.$minor.$patch"
14+
override fun compareTo(other: MinecraftVersion): Int = value.compareTo(other.value)
15+
16+
companion object {
17+
fun parse(version: String): MinecraftVersion {
18+
val versionParts = version.split('.').mapNotNull { it.toIntOrNull() }
19+
require(versionParts.size in 2..3) { "Unable to parse API version '$version'." }
20+
val (major, minor, patch) = versionParts + 0
21+
return MinecraftVersion(major * 1_00_00 + minor * 1_00 + patch)
22+
}
23+
24+
val V1_12_0 = MinecraftVersion(1_12_00)
25+
val V1_13_0 = MinecraftVersion(1_13_00)
26+
val V1_16_5 = MinecraftVersion(1_16_05)
27+
val V1_17_1 = MinecraftVersion(1_17_01)
28+
val V1_20_5 = MinecraftVersion(1_20_05)
29+
}
30+
}
31+
32+
internal val Bukkit.parsedApiVersion get() = MinecraftVersion.parse(apiVersion)

src/main/kotlin/meta/util/StringUtils.kt

-8
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,4 @@ internal object StringUtils {
88
val camelCaseText = text.replace(Regex("[ _-]([A-Za-z0-9])")) { match -> match.groupValues[1].uppercase() }
99
return camelCaseText.replaceFirstChar { it.uppercase() }
1010
}
11-
12-
@JvmStatic
13-
fun parseApiVersion(version: String): String? {
14-
val versionParts = version.split('.').mapNotNull { it.toIntOrNull() }
15-
require(versionParts.size in 2..3) { "Unable to parse API version '$version'." }
16-
val (major, minor) = versionParts
17-
return if (major >= 1 && minor >= 13) "$major.$minor" else null
18-
}
1911
}

src/test/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePluginSpec.groovy

+17
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,23 @@ class BukkitGradlePluginSpec extends PluginSpecification {
1212
project.pluginManager.hasPlugin("java")
1313
}
1414

15+
def "when initialized - should set default JVM toolchain"(String apiVersion, int jvmVersion) {
16+
when: "apiVersion is set to $apiVersion"
17+
project.bukkit.apiVersion = apiVersion
18+
19+
then: "JVM toolchain version should be"
20+
project.java.toolchain.languageVersion.get().asInt() == jvmVersion
21+
22+
where:
23+
apiVersion | jvmVersion
24+
"1.11" | 8
25+
"1.12" | 11
26+
"1.16.4" | 11
27+
"1.16.5" | 16
28+
"1.17" | 16
29+
"1.17.1" | 21
30+
}
31+
1532
def "when use custom repos extension - should add repos"() {
1633
when: "use repo extension"
1734
project.repositories.sk89q()

src/test/groovy/ru/endlesscode/bukkitgradle/meta/task/MergePluginMetaSpec.groovy

+25
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,31 @@ class MergePluginMetaSpec extends PluginSpecification {
6060
""".stripIndent().trim()
6161
}
6262

63+
def 'when merge meta - should set api-version'(String apiVersion, String expectedResult) {
64+
when: "api version is $apiVersion"
65+
buildFile << """
66+
bukkit.apiVersion = "$apiVersion"
67+
""".stripIndent()
68+
69+
and: "run generate meta task"
70+
run(TASK_PATH)
71+
72+
then: "meta file content corresponds to default config"
73+
metaFile.text == """
74+
main: "com.example.testplugin.TestPlugin"
75+
name: "test-plugin"
76+
version: "1.0"
77+
api-version: "$expectedResult"
78+
""".stripIndent().trim()
79+
80+
where:
81+
apiVersion | expectedResult
82+
"1.16.5" | "1.16"
83+
"1.20.4" | "1.20"
84+
"1.20.5" | "1.20.5"
85+
"1.21.1" | "1.21.1"
86+
}
87+
6388
def 'when merge meta - and generate it again - should skip second task run'() {
6489
when: "run generate meta task"
6590
run(TASK_PATH)

0 commit comments

Comments
 (0)