From 0ef91f6f4eb12c3e49c811090445fb8196bf6896 Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 2 Nov 2026 23:36:42 +0100 Subject: [PATCH 1/7] build: Update Gradle to 9.8.2 --- gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 48749 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 13 +-- gradlew.bat | 86 +++++++++++------- src/main/kotlin/extensions/Provider.kt | 2 +- .../kotlin/plugin/task/ParsePluginYaml.kt | 2 + .../task/CreateIdeaGradleRunConfiguration.kt | 2 + src/main/kotlin/server/task/PrepareServer.kt | 2 + 8 files changed, 67 insertions(+), 44 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..9fa7f288283f81eec4952784c271abd7e0938dee 100644 GIT binary patch delta 40570 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 delta 35682 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 M6y*Q_x+1*$59OICIsgCw diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b..91c4fc6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index faf9300..249efbb 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -29,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,8 +210,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..3185a43 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -19,12 +19,39 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions + +@rem Catch executions from older scripts and ensure they exit cleanly. +@rem This can be removed once we can be reasonably confident that few people +@rem will be migrating directly to this new wrapper. +goto afterSafetyNet +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +goto exitWithErrorLevel +:afterSafetyNet set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -45,13 +72,14 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +1>&2 echo. +1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +1>&2 echo. +1>&2 echo Please set the JAVA_HOME variable in your environment to match the +1>&2 echo location of your Java installation. -goto fail +"%COMSPEC%" /c exit 1 +goto exitWithErrorLevel :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -59,36 +87,26 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +1>&2 echo. +1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +1>&2 echo. +1>&2 echo Please set the JAVA_HOME variable in your environment to match the +1>&2 echo location of your Java installation. -goto fail +"%COMSPEC%" /c exit 1 +goto exitWithErrorLevel :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel & goto exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem This label must not be changed. We rely on old scripts being able to jump to this point. +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/src/main/kotlin/extensions/Provider.kt b/src/main/kotlin/extensions/Provider.kt index 005b546..30e623b 100644 --- a/src/main/kotlin/extensions/Provider.kt +++ b/src/main/kotlin/extensions/Provider.kt @@ -4,7 +4,7 @@ import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import java.util.* -internal fun Property.finalizeAndGet(): T { +internal fun Property.finalizeAndGet(): T { finalizeValue() return get() } diff --git a/src/main/kotlin/plugin/task/ParsePluginYaml.kt b/src/main/kotlin/plugin/task/ParsePluginYaml.kt index a61aaa9..3231f88 100644 --- a/src/main/kotlin/plugin/task/ParsePluginYaml.kt +++ b/src/main/kotlin/plugin/task/ParsePluginYaml.kt @@ -6,11 +6,13 @@ import org.gradle.api.GradleException import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.* +import org.gradle.work.DisableCachingByDefault import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT import ru.endlesscode.bukkitgradle.plugin.BukkitPluginYamlDefaults import xyz.jpenilla.resourcefactory.bukkit.BukkitPluginYaml import xyz.jpenilla.resourcefactory.bukkit.Permission +@DisableCachingByDefault(because = "Parsing a small file is faster than caching") internal abstract class ParsePluginYaml : DefaultTask() { private val yaml by lazy { diff --git a/src/main/kotlin/server/task/CreateIdeaGradleRunConfiguration.kt b/src/main/kotlin/server/task/CreateIdeaGradleRunConfiguration.kt index 4b9befe..e64d9e0 100644 --- a/src/main/kotlin/server/task/CreateIdeaGradleRunConfiguration.kt +++ b/src/main/kotlin/server/task/CreateIdeaGradleRunConfiguration.kt @@ -14,11 +14,13 @@ import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import org.gradle.kotlin.dsl.newInstance import org.gradle.kotlin.dsl.withGroovyBuilder +import org.gradle.work.DisableCachingByDefault import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT import ru.endlesscode.bukkitgradle.server.util.Idea import javax.inject.Inject /** Builds run configuration in IDEA .xml format and stores it to a file. */ +@DisableCachingByDefault(because = "Writes a small file to the local IDE configuration") @Suppress("LeakingThis") public abstract class CreateIdeaGradleRunConfiguration private constructor( idea: Idea, diff --git a/src/main/kotlin/server/task/PrepareServer.kt b/src/main/kotlin/server/task/PrepareServer.kt index 2a1aec9..e3ca3d5 100644 --- a/src/main/kotlin/server/task/PrepareServer.kt +++ b/src/main/kotlin/server/task/PrepareServer.kt @@ -8,9 +8,11 @@ import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction +import org.gradle.work.DisableCachingByDefault import ru.endlesscode.bukkitgradle.TASKS_GROUP_BUKKIT import java.util.* +@DisableCachingByDefault(because = "Writes files to the local server directory") internal abstract class PrepareServer : DefaultTask() { @get:Internal From 322d6c1b000fc2f9e1fe5b8f1ec6e0ba7b31ecfa Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 2 Nov 2026 23:43:46 +0100 Subject: [PATCH 2/7] feat: Support 26.1.+ versions --- README.md | 7 ++- src/main/kotlin/dependencies/Dependencies.kt | 12 ++++-- .../kotlin/plugin/util/MinecraftVersion.kt | 16 ++++--- .../BukkitGradlePluginSpec.groovy | 43 +++++++++++++++---- .../plugin/task/GeneratePluginYamlSpec.groovy | 2 + 5 files changed, 61 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index a9837af..e05fb90 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,10 @@ repositories { } ``` +> [!NOTE] +> `bukkit.apiVersion` should be a version published by Paper, for example `1.21`, `1.21.11` or `26.1.2`. +> Paper skipped 26.1 and 26.1.1 has only alpha builds, so use `26.1.2` to target 26.1. + That's it! During the plugin compilation `plugin.yml` will be generated with the following content: @@ -175,7 +179,8 @@ When adding dependencies, make sure you've added the corresponding repository. \* Spigot is available in `mavenLocal()` only if you've built it locally using [Spigot BuildTools][buildtools]. \ \*\* Bukkit should be built locally. However, some versions are available in `spigot()` repository. \ -\*\*\* `$apiVersion` - is `${version}-R0.1-SNAPSHOT` (where `$version` is `bukkit.apiVersion`). +\*\*\* `$apiVersion` - is `${version}-R0.1-SNAPSHOT` (where `$version` is `bukkit.apiVersion`). \ +Since 26.1, `paperApi` uses `${version}.+` instead to pick the latest Paper build, e.g. `26.1.2` -> `26.1.2.build.74-stable`. If you need more shortcuts, [file an issue][issue]. diff --git a/src/main/kotlin/dependencies/Dependencies.kt b/src/main/kotlin/dependencies/Dependencies.kt index 6faf345..aae0201 100644 --- a/src/main/kotlin/dependencies/Dependencies.kt +++ b/src/main/kotlin/dependencies/Dependencies.kt @@ -84,13 +84,12 @@ internal object Dependencies { } private fun Project.configureResolutionStrategy(bukkit: BukkitExtension) { - val bukkitVersion = bukkit.finalApiVersion - .map { "$it$BUKKIT_VERSION_SUFFIX" } + val apiVersion = bukkit.finalApiVersion configurations.configureEach { resolutionStrategy.eachDependency { val version = if (requested.version == BUKKIT_VERSION_PLACEHOLDER) { - bukkitVersion.get() + resolveBukkitVersion(requested.group, apiVersion.get()) } else { requested.version } @@ -114,4 +113,11 @@ internal object Dependencies { } } } + + private fun resolveBukkitVersion(group: String, apiVersion: String): String { + // Since 26.1, paper-api is published as '.build.-', e.g. '26.1.2.build.74-stable'. + // Prefix match picks the latest build. Without a patch, it picks the latest patch: '26.1' -> '26.1.2.build.74-stable' + val usesPaperVersioning = group == PAPER_GROUP && MinecraftVersion.parse(apiVersion) >= MinecraftVersion.V26_1_0 + return if (usesPaperVersioning) "$apiVersion.+" else "$apiVersion$BUKKIT_VERSION_SUFFIX" + } } diff --git a/src/main/kotlin/plugin/util/MinecraftVersion.kt b/src/main/kotlin/plugin/util/MinecraftVersion.kt index 412fd7a..affeb75 100644 --- a/src/main/kotlin/plugin/util/MinecraftVersion.kt +++ b/src/main/kotlin/plugin/util/MinecraftVersion.kt @@ -1,7 +1,6 @@ package ru.endlesscode.bukkitgradle.plugin.util import org.gradle.jvm.toolchain.JavaLanguageVersion -import ru.endlesscode.bukkitgradle.dependencies.Dependencies @JvmInline internal value class MinecraftVersion(private val value: Int) : Comparable { @@ -15,25 +14,28 @@ internal value class MinecraftVersion(private val value: Int) : Comparable= MinecraftVersion.V26_1_0 -> JavaLanguageVersion.of(25) // https://minecraft.wiki/w/Java_Edition_1.20.5#General_2 version >= MinecraftVersion.V1_20_5 -> JavaLanguageVersion.of(21) // https://minecraft.wiki/w/Java_Edition_1.18#General_2 diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePluginSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePluginSpec.groovy index c1838a9..79543a3 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePluginSpec.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/BukkitGradlePluginSpec.groovy @@ -31,6 +31,9 @@ class BukkitGradlePluginSpec extends PluginSpecification { "1.18" | 17 "1.20.4" | 17 "1.20.5" | 21 + "26.1" | 25 + "26.1.2" | 25 + "26.3" | 25 } def "when use custom repos extension - should add repos"() { @@ -49,7 +52,7 @@ class BukkitGradlePluginSpec extends PluginSpecification { dependency == 'org.bukkit:bukkit:{bukkit.apiVersion}' } - def "when using paper extension - should add paper dependency"(String apiVersion, String groupId) { + def "when using paper extension - should add paper dependency"(String apiVersion, String expectedDependency) { given: project.bukkit.apiVersion = apiVersion @@ -63,12 +66,33 @@ class BukkitGradlePluginSpec extends PluginSpecification { } then: "resolved paper dependency with correct groupId" - resolvedDependency().startsWith("$groupId:paper-api:$apiVersion-R0.1-SNAPSHOT") + resolvedDependency().startsWith(expectedDependency) where: - apiVersion | groupId - "1.16.5" | "com.destroystokyo.paper" - "1.18" | "io.papermc.paper" + apiVersion | expectedDependency + "1.16.5" | "com.destroystokyo.paper:paper-api:1.16.5-R0.1-SNAPSHOT" + "1.18" | "io.papermc.paper:paper-api:1.18-R0.1-SNAPSHOT" + "1.21.11" | "io.papermc.paper:paper-api:1.21.11-R0.1-SNAPSHOT" + "26.1" | "io.papermc.paper:paper-api:26.1." + "26.1.2" | "io.papermc.paper:paper-api:26.1.2.build." + "26.3" | "io.papermc.paper:paper-api:26.3.build." + } + + def "when using paper with non-release version - should keep the version"() { + given: + project.bukkit.apiVersion = "26.3" + + when: + project.dependencies { + compileOnly("io.papermc.paper:paper-api:26.3-pre-2.build.0-alpha") { transitive = false } + } + + project.repositories { + papermc() + } + + then: + resolvedDependency() == "io.papermc.paper:paper-api:26.3-pre-2.build.0-alpha" } def "when using paper with old group and new version - should fix the group"() { @@ -88,9 +112,9 @@ class BukkitGradlePluginSpec extends PluginSpecification { resolvedDependency().startsWith("io.papermc.paper:paper-api:1.17-R0.1-SNAPSHOT") } - def "when use bukkit extension - and bukkit version set - should return bukkit with specified version"() { + def "when use bukkit extension - and bukkit version set - should return bukkit with specified version"(String apiVersion) { given: "api version specified" - project.bukkit.apiVersion = "1.20.5" + project.bukkit.apiVersion = apiVersion when: "use bukkit extension" project.dependencies { @@ -102,7 +126,10 @@ class BukkitGradlePluginSpec extends PluginSpecification { } then: "resolved bukkit dependency with the specified version" - resolvedDependency().startsWith('org.spigotmc:spigot-api:1.20.5-R0.1-SNAPSHOT') + resolvedDependency().startsWith("org.spigotmc:spigot-api:$apiVersion-R0.1-SNAPSHOT") + + where: + apiVersion << ["1.20.5", "26.1"] } private String resolvedDependency() { diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy index 1975050..587345f 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy @@ -107,6 +107,8 @@ class GeneratePluginYamlSpec extends PluginSpecification { "1.20.4" | "'1.20'" "1.20.5" | "1.20.5" "1.21.1" | "1.21.1" + "26.1" | "'26.1'" + "26.1.2" | "26.1.2" } def 'when generate plugin.yml - and generate it again - should skip second task run'() { From 04100b27d074cf637857b3b7a6407a21ffd423f8 Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 2 Nov 2026 23:44:42 +0100 Subject: [PATCH 3/7] feat: Update run-paper to 3.1.0 --- .gitignore | 3 +++ CHANGELOG.md | 12 +++++++++++- README.md | 6 +++--- build.gradle.kts | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index af8e2f8..5557e5e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ build/ # IntelliJ out/ + +# Kotlin +.kotlin/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 304f17a..2d9b322 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ ## [Unreleased] -*No changes yet* +### Features + +- Support Paper 26.1+ + - `paperApi` resolves the latest Paper build for `bukkit.apiVersion`, e.g. `26.1.2` -> `26.1.2.build.74-stable` + - Use Java 25 by default for 26.1+ +- Update [jpenilla/run-task](https://github.com/jpenilla/run-task/) to 3.1.0. + It downloads Paper using the new Fill v3 API, so 26.x servers can be downloaded. + +### Housekeeping + +- **Breaking change!** BukkitGradle requires Gradle 9.7+ now ## [1.0.0] - 2025-04-18 diff --git a/README.md b/README.md index e05fb90..a6883b7 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Gradle utilities to simplify Bukkit/Spigot plugins writing and debugging. ## Installation > [!NOTE] -> BukkitGradle requires Gradle 8.0+ to run +> BukkitGradle requires Gradle 9.7+ to run ```kotlin plugins { @@ -259,9 +259,9 @@ bukkit { ### Upgrade from 0.10.x -1. Update Gradle to 8.0 or newer (the latest version is recommended): +1. Update Gradle to 9.7 or newer (the latest version is recommended): ```shell - ./gradlew wrapper --gradle-version 8.13 + ./gradlew wrapper --gradle-version latest ``` 2. Replace deprecated and removed APIs: diff --git a/build.gradle.kts b/build.gradle.kts index 5a617ab..1c33923 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,7 +28,7 @@ repositories { } dependencies { - implementation("xyz.jpenilla.run-paper:xyz.jpenilla.run-paper.gradle.plugin:2.3.1") + implementation("xyz.jpenilla.run-paper:xyz.jpenilla.run-paper.gradle.plugin:3.1.0") implementation("xyz.jpenilla.resource-factory:xyz.jpenilla.resource-factory.gradle.plugin:1.2.0") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1") implementation("com.charleskorn.kaml:kaml:0.74.0") From 253d8385cd94a216b4b69e7e45c5d6fd6d55bfa3 Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 2 Nov 2026 23:45:01 +0100 Subject: [PATCH 4/7] build: Update test dependencies --- build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1c33923..3dda12e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,9 +33,10 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1") implementation("com.charleskorn.kaml:kaml:0.74.0") testImplementation("junit:junit:4.13.1") - testImplementation(platform("org.spockframework:spock-bom:2.3-groovy-3.0")) + testImplementation(platform("org.spockframework:spock-bom:2.3-groovy-4.0")) testImplementation("org.spockframework:spock-core") testImplementation("org.spockframework:spock-junit4") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } val runningOnCi = System.getenv("CI") == "true" From 11ab2cd434a8a908029fb0945aa40e085a57582f Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Mon, 2 Nov 2026 23:47:45 +0100 Subject: [PATCH 5/7] fix: Run dev server with at least the project's Java toolchain version --- CHANGELOG.md | 5 +++++ src/main/kotlin/server/DevServerFeature.kt | 4 +++- .../server/task/RunServerSpec.groovy | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d9b322..97f93c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ - Update [jpenilla/run-task](https://github.com/jpenilla/run-task/) to 3.1.0. It downloads Paper using the new Fill v3 API, so 26.x servers can be downloaded. +### Fixed + +- Run dev server with at least the Java version used to build the plugin. + Previously, a plugin compiled with a newer Java than the server's minimal one failed to load. + ### Housekeeping - **Breaking change!** BukkitGradle requires Gradle 9.7+ now diff --git a/src/main/kotlin/server/DevServerFeature.kt b/src/main/kotlin/server/DevServerFeature.kt index 7dec434..374dc39 100644 --- a/src/main/kotlin/server/DevServerFeature.kt +++ b/src/main/kotlin/server/DevServerFeature.kt @@ -52,7 +52,9 @@ private fun Project.configureDefaultJvmForServer() { tasks.withType().configureEach { javaLauncher.convention( toolchains.launcherFor { - languageVersion.convention(version.map(::resolveMinimalJavaVersion)) + languageVersion.convention(version.map { + resolveMinimalJavaVersion(it).coerceAtLeast(spec.languageVersion.get()) + }) implementation.convention(spec.implementation) vendor.convention(spec.vendor) } diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/RunServerSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/RunServerSpec.groovy index 2d5dbd7..445a8d4 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/RunServerSpec.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/server/task/RunServerSpec.groovy @@ -15,4 +15,25 @@ class RunServerSpec extends PluginSpecification { expect: "runServer depends on prepareServer" task.dependsOn.collect { it.name } == ["prepareServer"] } + + def "when toolchain is newer than server minimal Java - should run server with toolchain Java"() { + given: "server requires Java 8, but plugin is compiled with Java 17" + //language=kotlin + buildFile << """ + bukkit.apiVersion = "1.16.5" + java.toolchain.languageVersion = JavaLanguageVersion.of(17) + + tasks.register("printServerJava") { + val launcher = tasks.named("$TASK_NAME") + .flatMap { it.javaLauncher } + doLast { println("Server Java: " + launcher.get().metadata.languageVersion) } + } + """.stripIndent() + + when: + run("printServerJava") + + then: "server runs with Java 17" + result.output.contains("Server Java: 17") + } } From 38ee9c07826ec59f08e10a1feb4cd1974e33da3d Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Tue, 3 Nov 2026 00:20:24 +0100 Subject: [PATCH 6/7] fix: Generate plugin.yml without modifying source resources Always generate plugin.yml into the build directory and use plugin.yml from resources only as defaults. Previously, the source plugin.yml was overwritten and other resources were deleted, and values from the previously generated plugin.yml took precedence over the new ones. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 5 ++ src/main/kotlin/plugin/PluginYamlFeature.kt | 31 ++++---- .../bukkitgradle/PluginSpecification.groovy | 5 ++ .../plugin/task/GeneratePluginYamlSpec.groovy | 77 ++++++++++++++++--- 4 files changed, 94 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97f93c0..a3f3920 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ - Run dev server with at least the Java version used to build the plugin. Previously, a plugin compiled with a newer Java than the server's minimal one failed to load. +- Don't modify `plugin.yml` and other files in `src/main/resources`. + Previously, if `plugin.yml` existed in resources, it was overwritten by the generated one, and other resources were deleted. + Now `plugin.yml` from resources is used only as defaults for the generated `plugin.yml`. +- Update the generated `plugin.yml` when the build configuration changes. + Previously, values from the earlier generated `plugin.yml` took precedence. ### Housekeeping diff --git a/src/main/kotlin/plugin/PluginYamlFeature.kt b/src/main/kotlin/plugin/PluginYamlFeature.kt index 0caf58b..cd4d765 100644 --- a/src/main/kotlin/plugin/PluginYamlFeature.kt +++ b/src/main/kotlin/plugin/PluginYamlFeature.kt @@ -32,13 +32,24 @@ internal fun Project.configurePluginYamlFeature(bukkit: BukkitExtension) { } (bukkit as ExtensionAware).extensions.add(PLUGIN_EXTENSION_NAME, bukkitPluginYaml) - val mainSourceSet = sourceSets.named(SOURCE_SET_NAME) { + val mainSourceSet = sourceSets.named(SOURCE_SET_NAME) + val sourcePluginYaml = findPluginYaml(mainSourceSet) + mainSourceSet.configure { resourceFactory.factory(bukkitPluginYaml.resourceFactory()) + + // Package only one plugin.yml: the generated one, or the source one if the generation is disabled. + // The generated plugin.yml may be left from previous builds even if the generation is disabled. + val sourcePluginYamlFile by lazy { sourcePluginYaml.orNull?.asFile } + resources.exclude { element -> + if (element.path != PLUGIN_YML) return@exclude false + val isSource = element.file == sourcePluginYamlFile + if (bukkit.generatePluginYaml.get()) isSource else !isSource + } } val parsePluginYamlProvider = tasks.register("parsePluginYaml") { pluginYaml.set(bukkitPluginYaml) - pluginYamlFile.set(findPluginYaml(mainSourceSet)) + pluginYamlFile.set(sourcePluginYaml) onlyIf { bukkit.generatePluginYaml.finalizeAndGet() } } @@ -49,24 +60,16 @@ internal fun Project.configurePluginYamlFeature(bukkit: BukkitExtension) { if (!generatePluginYaml) return@named val parsePluginYaml = parsePluginYamlProvider.get() - - // Switch to in-place generation mode if the plugin.yml exists - if (parsePluginYaml.pluginYamlFile.isPresent) { - dependsOn(parsePluginYaml) - - val pluginYamlFile = parsePluginYaml.pluginYamlFile.get().asFile - outputDir.set(pluginYamlFile.parentFile) - // Deduplicate resource dirs after changing outputDir - mainSourceSet.configure { - resources.setSrcDirs(resources.srcDirs.distinct()) - } - } + if (parsePluginYaml.pluginYamlFile.isPresent) dependsOn(parsePluginYaml) } } private fun Project.findPluginYaml(sourceSetProvider: Provider): Provider { + val buildDirectory = layout.buildDirectory val fileProvider = sourceSetProvider.mapNotNull { sourceSet -> sourceSet.resources.sourceDirectories + // Skip generated resources, otherwise the previously generated plugin.yml would be used as defaults + .filterNot { it.startsWith(buildDirectory.get().asFile) } .map { it.resolve(PLUGIN_YML) } .find { it.isFile } } diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/PluginSpecification.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/PluginSpecification.groovy index 963e36e..a8c626f 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/PluginSpecification.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/PluginSpecification.groovy @@ -58,6 +58,11 @@ class PluginSpecification extends Specification { return file } + /** Returns a file in the project directory without creating it. */ + File projectPath(String path) { + return new File(testProjectDir.root, path) + } + Project getProject() { if (project == null) { project = ProjectBuilder.builder() diff --git a/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy b/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy index 587345f..75ac8d0 100644 --- a/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy +++ b/src/test/groovy/ru/endlesscode/bukkitgradle/plugin/task/GeneratePluginYamlSpec.groovy @@ -12,9 +12,11 @@ class GeneratePluginYamlSpec extends PluginSpecification { private final static PARSE_PLUGIN_YAML = ':parsePluginYaml' private File pluginYamlFile + private File generatedPluginYamlFile def setup() { pluginYamlFile = file("src/main/resources/$PluginYamlFeatureKt.PLUGIN_YML") + generatedPluginYamlFile = projectPath("build/generated/resourceFactory/main/$PluginYamlFeatureKt.PLUGIN_YML") buildFile << """ bukkit.apiVersion = "1.16.2" @@ -46,6 +48,22 @@ class GeneratePluginYamlSpec extends PluginSpecification { taskOutcome(PARSE_PLUGIN_YAML) == null } + def 'when run processResources - and plugin.yml generation disabled - should use source plugin.yml'() { + given: "plugin.yml generated by a previous build" + run(':processResources') + + and: + def sourceContent = "name: SourcePlugin\n" + pluginYamlFile.text = sourceContent + buildFile << "bukkit.generatePluginYaml = false" + + when: + run(':processResources') + + then: + projectPath("build/resources/main/$PluginYamlFeatureKt.PLUGIN_YML").text == sourceContent + } + def 'when run processResources - and plugin.yml doesnt exist - should skip parsing'() { given: pluginYamlFile.delete() @@ -76,7 +94,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: "plugin file content corresponds to default config" - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.16' name: test-plugin version: '1.0' @@ -94,7 +112,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: "plugin file content corresponds to default config" - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: $expectedResult name: test-plugin version: '1.0' @@ -139,7 +157,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { taskOutcome(RESOURCE_FACTORY) == TaskOutcome.SUCCESS and: "plugin generated with new description" - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.16' name: test-plugin version: '1.0' @@ -148,6 +166,45 @@ class GeneratePluginYamlSpec extends PluginSpecification { """.stripIndent() } + void 'when generate plugin.yml - and changed api version - should update plugin.yml'(boolean hasSourceFile) { + given: + if (!hasSourceFile) pluginYamlFile.delete() + + when: + run(RESOURCE_FACTORY) + + and: "changed api version" + buildFile << 'bukkit.apiVersion = "1.20.4"' + + and: + run(RESOURCE_FACTORY) + + then: + generatedPluginYamlFile.readLines().first() == "api-version: '1.20'" + + where: + hasSourceFile << [true, false] + } + + void 'when generate plugin.yml - should keep source resources unchanged'() { + given: + def sourceContent = "depend: [Vault]\n" + pluginYamlFile.text = sourceContent + def configFile = file("src/main/resources/config.yml") + configFile.text = "key: value\n" + + when: + run(':processResources') + + then: "source files are not modified" + pluginYamlFile.text == sourceContent + configFile.text == "key: value\n" + + and: "the generated plugin.yml is packaged" + projectPath("build/resources/main/$PluginYamlFeatureKt.PLUGIN_YML").text == generatedPluginYamlFile.text + projectPath("build/resources/main/config.yml").isFile() + } + void 'when generate plugin.yml - and properties configured using set'() { given: //language=kotlin @@ -169,7 +226,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.13' name: TestPlugin version: '0.1' @@ -203,7 +260,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.13' name: TestPlugin version: '0.1' @@ -233,7 +290,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.16' name: test-plugin version: '1.0' @@ -271,7 +328,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { } then: - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.16' name: test-plugin version: '1.0' @@ -293,7 +350,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: "should write plugin and keep values of the source file" - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.16' name: SourceValue version: '1.2' @@ -338,7 +395,7 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: "should overwrite source fields" - pluginYamlFile.text == """\ + generatedPluginYamlFile.text == """\ api-version: '1.16' name: BuildscriptValue version: '1.3' @@ -412,6 +469,6 @@ class GeneratePluginYamlSpec extends PluginSpecification { run(RESOURCE_FACTORY) then: "the file content should remain the same" - pluginYamlFile.text == content + generatedPluginYamlFile.text == content } } From 96b80be0b9154767e4363d4c501716c38c9299c9 Mon Sep 17 00:00:00 2001 From: Osip Fatkullin Date: Tue, 3 Nov 2026 00:29:11 +0100 Subject: [PATCH 7/7] version: 1.1.0-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b9a2729..89f20f6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ group=ru.endlesscode description=Simple development of Bukkit plugins with Gradle -version=1.0.1-SNAPSHOT +version=1.1.0-SNAPSHOT org.gradle.jvmargs=-Xmx3G org.gradle.parallel=true org.gradle.daemon=true