From 8ff94c63443cdc61f4b3e8ae8ea29a05a827b73d Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Mon, 14 Apr 2025 10:04:36 +0200 Subject: [PATCH] Update a bunch of dependencies Either to match Vanilla or to update our own --- build.gradle.kts | 255 ------------------ paper-api/build.gradle.kts | 18 +- paper-server/build.gradle.kts | 24 +- .../papermc/paper/util/ServerEnvironment.java | 2 +- .../profile/CraftPlayerProfile.java | 2 +- 5 files changed, 22 insertions(+), 279 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 25783b207e..42b17e13e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,15 +1,5 @@ -import io.papermc.paperweight.util.* -import io.papermc.paperweight.util.constants.* import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent -import java.io.IOException -import java.net.URI -import java.nio.file.FileVisitResult -import java.nio.file.Files -import java.nio.file.SimpleFileVisitor -import kotlin.io.path.* -import java.nio.file.Path -import kotlin.random.Random plugins { id("io.papermc.paperweight.core") version "2.0.0-beta.16" apply false @@ -82,248 +72,3 @@ tasks.register("printPaperVersion") { println(paperVersion.get()) } } - -/* -// Used when updating to a new Minecraft version -tasks.register("pickUpdateDirectory") { - val issue = providers.gradleProperty("updateTaskListIssue").get() - val patchesFolder = layout.projectDirectory.dir("paper-server/patches/").convertToPath() - val storage = layout.cache.resolve("last-updating-folder").also { it.parent.createDirectories() } - - doLast { - val html = URI(issue).toURL().readText() - - val beginMarker = "```[tasklist]" - val start = html.indexOf(beginMarker) - val end = html.indexOf("```", start + beginMarker.length) - val taskList = html.substring(start + beginMarker.length, end) - - // Extract all incomplete tasks and select a random one - val incompleteTasks = taskList.split("\\n").filter { it.startsWith("- [ ]") }.map { it.replace("- [ ] ", "") } - if (incompleteTasks.isEmpty()) { - error("No incomplete tasks found in the task list.") - } - - val next = incompleteTasks[Random.nextInt(incompleteTasks.size)] - - println("checking out $next...") - val dir = patchesFolder.resolve("unapplied").resolve(next) - if (!dir.exists()) { - error("Unapplied patch folder $next does not exist, did someone else already check it out and forgot to mark it?") - } - dir.listDirectoryEntries("*.patch").forEach { patch -> - patch.copyTo(patchesFolder.resolve("sources").resolve(next).resolve(patch.fileName).also { it.createDirectories() }, overwrite = true) - patch.deleteIfExists() - } - if (dir.listDirectoryEntries().isEmpty()) { - dir.deleteIfExists() - } - - storage.writeText(next) - println("please tick the box in the issue: $issue") - println("if you don't finish it, uncheck the task again after you commited") - } -} - -tasks.register("showUpdateDirectories") { - val patchDir = layout.projectDirectory.dir("paper-server/patches/unapplied/").convertToPath() - - doLast { - Files.walkFileTree(patchDir, object : SimpleFileVisitor() { - override fun postVisitDirectory(dir: Path?, exc: IOException?): FileVisitResult { - dir?.takeIf { it.listDirectoryEntries("*.patch").isNotEmpty() }?.let { - println("- [ ] ${patchDir.relativize(it).pathString.replace("\\", "/")}") - } - return FileVisitResult.CONTINUE - } - }) - } -} - -tasks.register("moveUpdateDirectory") { - notCompatibleWithConfigurationCache("This task is interactive") - fun expandUserHome(path: String): Path { - return Path.of(path.replaceFirst("^~".toRegex(), System.getProperty("user.home"))) - } - - val input = providers.fileContents(layout.projectDirectory.file("$CACHE_PATH/last-updating-folder")).asText.map { it.trim() } - val patchFolder = layout.projectDirectory.dir("paper-server/patches/sources").dir(input) - val sourceFolder = layout.projectDirectory.dir("paper-server/src/minecraft/java").dir(input) - val targetFolder = providers.gradleProperty("cleanPaperRepo").map { - expandUserHome(it).resolve(input.get()) - } - - fun copy(back: Boolean = false) { - patchFolder.path.listDirectoryEntries().forEach { - val relative = patchFolder.path.relativize(it).toString().replace(".patch", "") - val source = sourceFolder.path.resolve(relative) - val target = targetFolder.get().resolve(relative) - if (target.isDirectory()) { return@forEach } - if (back) { - target.copyTo(source, overwrite = true) - } else { - source.copyTo(target, overwrite = true) - } - } - } - - doLast { - if (!targetFolder.isPresent) { - error("cleanPaperRepo is required, define it in gradle.properties") - } - copy() - val files = patchFolder.path.listDirectoryEntries().map { it.fileName.toString().replace(".patch", "") } - println("Copied $files from $sourceFolder to $targetFolder") - println("Make the files compile, then press enter to copy them back!") - System.`in`.read() - copy(back = true) - println("copied back!") - } -} - -// see gradle.properties -if (providers.gradleProperty("updatingMinecraft").getOrElse("false").toBoolean()) { - tasks.collectAtsFromPatches { - val dir = layout.projectDirectory.dir("patches/unapplied/server") - if (dir.path.isDirectory()) { - extraPatchDir = dir - } - } - tasks.withType().configureEach { - filterPatches = false - } - tasks.register("continueServerUpdate", RebasePatches::class) { - description = "Moves the next X patches from unapplied to applied, and applies them. X being the number of patches that apply cleanly, plus the terminal failure if any." - projectDir = project.projectDir - appliedPatches = file("patches/server") - unappliedPatches = file("patches/unapplied/server") - applyTaskName = "applyServerPatches" - patchedDir = "Paper-Server" - } -} - -@UntrackedTask(because = "Does not make sense to track state") -abstract class RebasePatches : BaseTask() { - @get:Internal - abstract val projectDir: DirectoryProperty - - @get:InputFiles - abstract val appliedPatches: DirectoryProperty - - @get:InputFiles - abstract val unappliedPatches: DirectoryProperty - - @get:Input - abstract val applyTaskName: Property - - @get:Input - abstract val patchedDir: Property - - private fun unapplied(): List = - unappliedPatches.path.listDirectoryEntries("*.patch").sortedBy { it.name } - - private fun appliedLoc(patch: Path): Path = appliedPatches.path.resolve(unappliedPatches.path.relativize(patch)) - - companion object { - val regex = Pattern.compile("Patch failed at ([0-9]{4}) (.*)") - val continuationRegex = Pattern.compile("^\\s{1}.+\$") - const val subjectPrefix = "Subject: [PATCH] " - } - - @TaskAction - fun run() { - val patchedDirPath = projectDir.path.resolve(patchedDir.get()) - if (patchedDirPath.isDirectory()) { - val status = Git(patchedDirPath)("status").getText() - if (status.contains("You are in the middle of an am session.")) { - throw PaperweightException("Cannot continue update when $patchedDirPath is in the middle of an am session.") - } - } - - val unapplied = unapplied() - for (patch in unapplied) { - patch.copyTo(appliedLoc(patch)) - } - - val out = ByteArrayOutputStream() - val proc = ProcessBuilder() - .directory(projectDir.path) - .command("./gradlew", applyTaskName.get()) - .redirectErrorStream(true) - .start() - - val f = redirect(proc.inputStream, out) - - val exit = proc.waitFor() - f.get() - - if (exit != 0) { - val outStr = String(out.toByteArray()) - val matcher = regex.matcher(outStr) - if (!matcher.find()) error("Could not determine failure point") - val failedSubjectFragment = matcher.group(2) - val failed = unapplied.single { p -> - p.useLines { lines -> - val collect = mutableListOf() - for (line in lines) { - if (line.startsWith(subjectPrefix)) { - collect += line - } else if (collect.size == 1) { - if (continuationRegex.matcher(line).matches()) { - collect += line - } else { - break - } - } - } - val subjectLine = collect.joinToString("").substringAfter(subjectPrefix) - subjectLine.startsWith(failedSubjectFragment) - } - } - - // delete successful & failure point from unapplied patches dir - for (path in unapplied) { - path.deleteIfExists() - if (path == failed) { - break - } - } - - // delete failed from patches dir - var started = false - for (path in unapplied) { - if (path == failed) { - started = true - continue - } - if (started) { - appliedLoc(path).deleteIfExists() - } - } - - // Delete the build file before resetting the AM session in case it has compilation errors - patchedDirPath.resolve("build.gradle.kts").deleteIfExists() - // Apply again to reset the am session (so it ends on the failed patch, to allow us to rebuild after fixing it) - val apply2 = ProcessBuilder() - .directory(projectDir.path) - .command("./gradlew", applyTaskName.get()) - .redirectErrorStream(true) - .start() - - val f1 = redirect(apply2.inputStream, System.out) - apply2.waitFor() - f1.get() - - logger.lifecycle(outStr) - logger.lifecycle("Patch failed at $failed; See Git output above.") - } else { - unapplied.forEach { it.deleteIfExists() } - logger.lifecycle("All patches applied!") - } - - val git = Git(projectDir.path) - git("add", appliedPatches.path.toString() + "/*").runSilently() - git("add", unappliedPatches.path.toString() + "/*").runSilently() - } -} - */ diff --git a/paper-api/build.gradle.kts b/paper-api/build.gradle.kts index 461e8b87c5..a0c35b7cd9 100644 --- a/paper-api/build.gradle.kts +++ b/paper-api/build.gradle.kts @@ -9,13 +9,13 @@ java { withJavadocJar() } -val annotationsVersion = "26.0.1" +val annotationsVersion = "26.0.2" // Keep in sync with paper-server adventure-text-serializer-ansi dep val adventureVersion = "4.21.0-mc1215-SNAPSHOT" // FIXME move to release asap val adventureJavadocVersion = "4.20.0" // Fixme remove me val bungeeCordChatVersion = "1.21-R0.2-deprecated+build.21" -val slf4jVersion = "2.0.9" -val log4jVersion = "2.17.1" +val slf4jVersion = "2.0.16" +val log4jVersion = "2.24.1" val apiAndDocs: Configuration by configurations.creating { attributes { @@ -41,7 +41,6 @@ abstract class MockitoAgentProvider : CommandLineArgumentProvider { } dependencies { - // api dependencies are listed transitively to API consumers api("com.google.guava:guava:33.3.1-jre") api("com.google.code.gson:gson:2.11.0") @@ -49,9 +48,6 @@ dependencies { api("org.joml:joml:1.10.8") { isTransitive = false // https://github.com/JOML-CI/JOML/issues/352 } - api("com.googlecode.json-simple:json-simple:1.1.1") { - isTransitive = false // includes junit - } api("it.unimi.dsi:fastutil:8.5.15") api("org.apache.logging.log4j:log4j-api:$log4jVersion") api("org.slf4j:slf4j-api:$slf4jVersion") @@ -81,18 +77,18 @@ dependencies { compileOnly(annotations) testCompileOnly(annotations) - val checkerQual = "org.checkerframework:checker-qual:3.33.0" + val checkerQual = "org.checkerframework:checker-qual:3.49.2" compileOnlyApi(checkerQual) testCompileOnly(checkerQual) api("org.jspecify:jspecify:1.0.0") // Test dependencies - testImplementation("org.apache.commons:commons-lang3:3.12.0") - testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") + testImplementation("org.apache.commons:commons-lang3:3.17.0") + testImplementation("org.junit.jupiter:junit-jupiter:5.12.2") testImplementation("org.hamcrest:hamcrest:2.2") testImplementation("org.mockito:mockito-core:5.14.1") - testImplementation("org.ow2.asm:asm-tree:9.7.1") + testImplementation("org.ow2.asm:asm-tree:9.8") mockitoAgent("org.mockito:mockito-core:5.14.1") { isTransitive = false } // configure mockito agent that is needed in newer java versions testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/paper-server/build.gradle.kts b/paper-server/build.gradle.kts index de81c7506b..5b2b555e5b 100644 --- a/paper-server/build.gradle.kts +++ b/paper-server/build.gradle.kts @@ -144,35 +144,37 @@ dependencies { all its classes to check if they are plugins. Scanning takes about 1-2 seconds so adding this speeds up the server start. */ - implementation("org.apache.logging.log4j:log4j-core:2.19.0") - log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.19.0") // Needed to generate meta for our Log4j plugins + implementation("org.apache.logging.log4j:log4j-core:2.24.1") + log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.24.1") // Needed to generate meta for our Log4j plugins runtimeOnly(log4jPlugins.output) alsoShade(log4jPlugins.output) implementation("com.velocitypowered:velocity-native:3.4.0-SNAPSHOT") { isTransitive = false } - implementation("io.netty:netty-codec-haproxy:4.1.115.Final") // Add support for proxy protocol + implementation("io.netty:netty-codec-haproxy:4.1.118.Final") // Add support for proxy protocol implementation("org.apache.logging.log4j:log4j-iostreams:2.24.1") - implementation("org.ow2.asm:asm-commons:9.7.1") + implementation("org.ow2.asm:asm-commons:9.8") implementation("org.spongepowered:configurate-yaml:4.2.0-20250225.064233-199") implementation("org.spongepowered:configurate-core:4.2.0-20250225.064233-204") // Pinned dependency of above pinned yaml snapshot. - implementation("commons-lang:commons-lang:2.6") - runtimeOnly("org.xerial:sqlite-jdbc:3.47.0.0") - runtimeOnly("com.mysql:mysql-connector-j:9.1.0") + + // Deps that were previously in the API but have now been moved here for backwards compat, eventually to be removed + runtimeOnly("commons-lang:commons-lang:2.6") + runtimeOnly("org.xerial:sqlite-jdbc:3.49.1.0") + runtimeOnly("com.mysql:mysql-connector-j:9.2.0") runtimeOnly("com.lmax:disruptor:3.4.4") runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6") runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18") runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18") - testImplementation("io.github.classgraph:classgraph:4.8.47") // For mob goal test - testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") - testImplementation("org.junit.platform:junit-platform-suite-engine:1.10.0") + testImplementation("io.github.classgraph:classgraph:4.8.179") // For mob goal test + testImplementation("org.junit.jupiter:junit-jupiter:5.12.2") + testImplementation("org.junit.platform:junit-platform-suite-engine:1.12.2") testImplementation("org.hamcrest:hamcrest:2.2") testImplementation("org.mockito:mockito-core:5.14.1") mockitoAgent("org.mockito:mockito-core:5.14.1") { isTransitive = false } // Configure mockito agent that is needed in newer java versions - testImplementation("org.ow2.asm:asm-tree:9.7.1") + testImplementation("org.ow2.asm:asm-tree:9.8") testImplementation("org.junit-pioneer:junit-pioneer:2.2.0") // CartesianTest implementation("net.neoforged:srgutils:1.0.9") // Mappings handling diff --git a/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java b/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java index 2b7070e0ce..422f2d0aaf 100644 --- a/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java +++ b/paper-server/src/main/java/io/papermc/paper/util/ServerEnvironment.java @@ -3,7 +3,7 @@ package io.papermc.paper.util; import com.sun.security.auth.module.NTSystem; import com.sun.security.auth.module.UnixSystem; import java.util.Set; -import org.apache.commons.lang.SystemUtils; +import org.apache.commons.lang3.SystemUtils; public class ServerEnvironment { private static final boolean RUNNING_AS_ROOT_OR_ADMIN; diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java b/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java index ce799e6550..5abdcc7d91 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; import net.minecraft.Util; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.world.item.component.ResolvableProfile; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.craftbukkit.CraftServer;