mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-27 23:10:16 +01:00
36723cdd60
Rewrite console improvements (console colors, tab completion, persistent input line, ...) using JLine 3.x and TerminalConsoleAppender. Also uses the new ANSIComponentSerializer to serialize components when logging them via the ComponentLogger, or when sending messages to the console, for hex color support. New features: - Support console colors for Vanilla commands - Add console colors for warnings and errors - Server can now be turned off safely using CTRL + C. JLine catches the signal and the implementation shuts down the server cleanly. - Support console colors and persistent input line when running in IntelliJ IDEA Other changes: - Server starts 1-2 seconds faster thanks to optimizations in Log4j configuration Co-Authored-By: Emilia Kond <emilia@rymiel.space>
206 lines
8.1 KiB
Text
206 lines
8.1 KiB
Text
import io.papermc.paperweight.util.*
|
|
|
|
plugins {
|
|
java
|
|
`maven-publish`
|
|
}
|
|
|
|
val log4jPlugins = sourceSets.create("log4jPlugins")
|
|
configurations.named(log4jPlugins.compileClasspathConfigurationName) {
|
|
extendsFrom(configurations.compileClasspath.get())
|
|
}
|
|
val alsoShade: Configuration by configurations.creating
|
|
|
|
// Paper start - configure mockito agent that is needed in newer java versions
|
|
val mockitoAgent = configurations.register("mockitoAgent")
|
|
abstract class MockitoAgentProvider : CommandLineArgumentProvider {
|
|
@get:CompileClasspath
|
|
abstract val fileCollection: ConfigurableFileCollection
|
|
|
|
override fun asArguments(): Iterable<String> {
|
|
return listOf("-javaagent:" + fileCollection.files.single().absolutePath)
|
|
}
|
|
}
|
|
// Paper end - configure mockito agent that is needed in newer java versions
|
|
|
|
dependencies {
|
|
implementation(project(":paper-api"))
|
|
implementation("ca.spottedleaf:concurrentutil:0.0.2") // Paper - Add ConcurrentUtil dependency
|
|
// Paper start
|
|
implementation("org.jline:jline-terminal-ffm:3.27.1") // use ffm on java 22+
|
|
implementation("org.jline:jline-terminal-jni:3.27.1") // fall back to jni on java 21
|
|
implementation("net.minecrell:terminalconsoleappender:1.3.0")
|
|
implementation("net.kyori:adventure-text-serializer-ansi:4.17.0") // Keep in sync with adventureVersion from Paper-API build file
|
|
/*
|
|
Required to add the missing Log4j2Plugins.dat file from log4j-core
|
|
which has been removed by Mojang. Without it, log4j has to classload
|
|
all its classes to check if they are plugins.
|
|
Scanning takes about 1-2 seconds so adding this speeds up the server start.
|
|
*/
|
|
runtimeOnly("org.apache.logging.log4j:log4j-core:2.19.0")
|
|
log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.19.0") // Paper - Needed to generate meta for our Log4j plugins
|
|
runtimeOnly(log4jPlugins.output)
|
|
alsoShade(log4jPlugins.output)
|
|
// Paper end
|
|
implementation("org.apache.logging.log4j:log4j-iostreams:2.24.1") // Paper - remove exclusion
|
|
implementation("org.ow2.asm:asm-commons:9.7.1")
|
|
implementation("org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT") // Paper - config files
|
|
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")
|
|
|
|
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("org.junit.jupiter:junit-jupiter:5.10.2")
|
|
testImplementation("org.junit.platform:junit-platform-suite-engine:1.10.0")
|
|
testImplementation("org.hamcrest:hamcrest:2.2")
|
|
testImplementation("org.mockito:mockito-core:5.14.1")
|
|
mockitoAgent("org.mockito:mockito-core:5.14.1") { isTransitive = false } // Paper - configure mockito agent that is needed in newer java versions
|
|
testImplementation("org.ow2.asm:asm-tree:9.7.1")
|
|
testImplementation("org.junit-pioneer:junit-pioneer:2.2.0") // Paper - CartesianTest
|
|
}
|
|
|
|
paperweight {
|
|
craftBukkitPackageVersion.set("v1_21_R3") // also needs to be updated in MappingEnvironment
|
|
}
|
|
|
|
tasks.jar {
|
|
archiveClassifier.set("dev")
|
|
|
|
manifest {
|
|
val git = Git(rootProject.layout.projectDirectory.path)
|
|
val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim()
|
|
val implementationVersion = System.getenv("BUILD_NUMBER") ?: "\"$gitHash\""
|
|
val date = git("show", "-s", "--format=%ci", gitHash).getText().trim() // Paper
|
|
val gitBranch = git("rev-parse", "--abbrev-ref", "HEAD").getText().trim() // Paper
|
|
attributes(
|
|
"Main-Class" to "org.bukkit.craftbukkit.Main",
|
|
"Implementation-Title" to "CraftBukkit",
|
|
"Implementation-Version" to "git-Paper-$implementationVersion",
|
|
"Implementation-Vendor" to date, // Paper
|
|
"Specification-Title" to "Bukkit",
|
|
"Specification-Version" to project.version,
|
|
"Specification-Vendor" to "Bukkit Team",
|
|
"Git-Branch" to gitBranch, // Paper
|
|
"Git-Commit" to gitHash, // Paper
|
|
"CraftBukkit-Package-Version" to paperweight.craftBukkitPackageVersion.get(), // Paper
|
|
)
|
|
for (tld in setOf("net", "com", "org")) {
|
|
attributes("$tld/bukkit", "Sealed" to true)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Paper start - compile tests with -parameters for better junit parameterized test names
|
|
tasks.compileTestJava {
|
|
options.compilerArgs.add("-parameters")
|
|
}
|
|
// Paper end
|
|
|
|
publishing {
|
|
publications.create<MavenPublication>("maven") {
|
|
}
|
|
}
|
|
|
|
// Paper start
|
|
val scanJar = tasks.register("scanJarForBadCalls", io.papermc.paperweight.tasks.ScanJarForBadCalls::class) {
|
|
badAnnotations.add("Lio/papermc/paper/annotation/DoNotUse;")
|
|
jarToScan.set(tasks.serverJar.flatMap { it.archiveFile })
|
|
classpath.from(configurations.compileClasspath)
|
|
}
|
|
tasks.check {
|
|
dependsOn(scanJar)
|
|
}
|
|
// Paper end
|
|
// Paper start - use TCA for console improvements
|
|
tasks.serverJar {
|
|
from(alsoShade.elements.map {
|
|
it.map { f ->
|
|
if (f.asFile.isFile) {
|
|
zipTree(f.asFile)
|
|
} else {
|
|
f.asFile
|
|
}
|
|
}
|
|
})
|
|
}
|
|
// Paper end - use TCA for console improvements
|
|
|
|
tasks.test {
|
|
include("**/**TestSuite.class")
|
|
workingDir = temporaryDir
|
|
useJUnitPlatform {
|
|
forkEvery = 1
|
|
excludeTags("Slow")
|
|
}
|
|
// Paper start - configure mockito agent that is needed in newer java versions
|
|
val provider = objects.newInstance<MockitoAgentProvider>()
|
|
provider.fileCollection.from(mockitoAgent)
|
|
jvmArgumentProviders.add(provider)
|
|
// Paper end - configure mockito agent that is needed in newer java versions
|
|
}
|
|
|
|
fun TaskContainer.registerRunTask(
|
|
name: String,
|
|
block: JavaExec.() -> Unit
|
|
): TaskProvider<JavaExec> = register<JavaExec>(name) {
|
|
group = "paper"
|
|
mainClass.set("org.bukkit.craftbukkit.Main")
|
|
standardInput = System.`in`
|
|
workingDir = rootProject.layout.projectDirectory
|
|
.dir(providers.gradleProperty("paper.runWorkDir").getOrElse("run"))
|
|
.asFile
|
|
javaLauncher.set(project.javaToolchains.launcherFor {
|
|
languageVersion.set(JavaLanguageVersion.of(21))
|
|
vendor.set(JvmVendorSpec.JETBRAINS)
|
|
})
|
|
jvmArgs("-XX:+AllowEnhancedClassRedefinition", "-XX:+AllowRedefinitionToAddDeleteMethods")
|
|
|
|
if (rootProject.childProjects["test-plugin"] != null) {
|
|
val testPluginJar = rootProject.project(":test-plugin").tasks.jar.flatMap { it.archiveFile }
|
|
inputs.file(testPluginJar)
|
|
args("-add-plugin=${testPluginJar.get().asFile.absolutePath}")
|
|
}
|
|
|
|
args("--nogui")
|
|
systemProperty("net.kyori.adventure.text.warnWhenLegacyFormattingDetected", true)
|
|
if (providers.gradleProperty("paper.runDisableWatchdog").getOrElse("false") == "true") {
|
|
systemProperty("disable.watchdog", true)
|
|
}
|
|
systemProperty("io.papermc.paper.suppress.sout.nags", true)
|
|
|
|
val memoryGb = providers.gradleProperty("paper.runMemoryGb").getOrElse("2")
|
|
minHeapSize = "${memoryGb}G"
|
|
maxHeapSize = "${memoryGb}G"
|
|
|
|
doFirst {
|
|
workingDir.mkdirs()
|
|
}
|
|
|
|
block(this)
|
|
}
|
|
|
|
val runtimeClasspathWithoutVanillaServer = configurations.runtimeClasspath.flatMap { it.elements }
|
|
.zip(configurations.vanillaServer.map { it.singleFile.absolutePath }) { runtime, vanilla ->
|
|
runtime.filterNot { it.asFile.absolutePath == vanilla }
|
|
}
|
|
|
|
tasks.registerRunTask("runServerJar") {
|
|
description = "Spin up a test server from the serverJar archiveFile"
|
|
classpath(tasks.serverJar.flatMap { it.archiveFile })
|
|
classpath(runtimeClasspathWithoutVanillaServer)
|
|
}
|
|
|
|
tasks.registerRunTask("runReobf") {
|
|
description = "Spin up a test server from the reobfJar output jar"
|
|
classpath(tasks.reobfJar.flatMap { it.outputJar })
|
|
classpath(runtimeClasspathWithoutVanillaServer)
|
|
}
|
|
|
|
tasks.registerRunTask("runDev") {
|
|
description = "Spin up a non-relocated Mojang-mapped test server"
|
|
classpath(sourceSets.main.map { it.runtimeClasspath })
|
|
jvmArgs("-DPaper.pushPaperAssetsRoot=true")
|
|
}
|