From a049900b74857af919303f2daaa80e6c77b2b628 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Thu, 30 Jul 2026 17:58:36 +0100 Subject: [PATCH 1/5] build!: upgrade Gradle to version 9.6.1 --- build-logic/build.gradle | 6 ++--- .../main/groovy/destination-sol-ide.gradle | 6 +++++ .../main/groovy/destination-sol-jre.gradle | 5 ++-- .../src/main/groovy/terasology-metrics.gradle | 25 +++++++++++-------- desktop/build.gradle | 13 ++++++---- .../destinationsol/desktop/SolDesktop.java | 2 +- engine/build.gradle | 15 +++++------ gradle/wrapper/gradle-wrapper.properties | 2 +- libs/subprojects.gradle | 4 ++- 9 files changed, 46 insertions(+), 32 deletions(-) diff --git a/build-logic/build.gradle b/build-logic/build.gradle index 4f9797e62..e21074954 100644 --- a/build-logic/build.gradle +++ b/build-logic/build.gradle @@ -12,7 +12,7 @@ compileJava { } dependencies { - implementation 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.0.13' - implementation 'de.undercouch:gradle-download-task:5.3.0' - implementation 'gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext:1.1.7' + implementation 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.2.3' + implementation 'de.undercouch:gradle-download-task:5.7.0' + implementation 'gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext:1.4.1' } \ No newline at end of file diff --git a/build-logic/src/main/groovy/destination-sol-ide.gradle b/build-logic/src/main/groovy/destination-sol-ide.gradle index e06142d3c..869e29732 100644 --- a/build-logic/src/main/groovy/destination-sol-ide.gradle +++ b/build-logic/src/main/groovy/destination-sol-ide.gradle @@ -4,6 +4,9 @@ plugins { id 'org.jetbrains.gradle.plugin.idea-ext' } +import groovy.xml.XmlParser +import groovy.xml.XmlNodePrinter + ext { ideaPatchAnnotationProcessors = { XmlProvider provider -> var profile = provider.asNode().component @@ -45,6 +48,9 @@ ext { ideaPatchEntryPoints = { XmlProvider provider -> var component = provider.asNode().component .find { it.@name == 'EntryPointsManager' } + if (component == null) { + return; + } if (component.list.size() != 0) { component.remove(component.list) } diff --git a/build-logic/src/main/groovy/destination-sol-jre.gradle b/build-logic/src/main/groovy/destination-sol-jre.gradle index 502f5fa52..6dcc638d1 100644 --- a/build-logic/src/main/groovy/destination-sol-jre.gradle +++ b/build-logic/src/main/groovy/destination-sol-jre.gradle @@ -34,14 +34,12 @@ tasks.register('downloadJreAll') { } jreUrlFilenames.each { os, file -> - def packedJre = new File("$rootDir/jre/$jreVersion/$file") - def unpackedJre = new File("${distsDirectory.getAsFile().get()}/app/$os") - def downloadTask = tasks.register("downloadJre$os") { group 'Download' description "Downloads JRE for $os" doFirst { + def packedJre = new File("$rootDir/jre/$jreVersion/$file") download.run { src "$jreUrlBase-$file" dest packedJre @@ -51,6 +49,7 @@ jreUrlFilenames.each { os, file -> doLast { // Unpack the JRE + def unpackedJre = new File(base.distsDirectory.dir('app/$os')) if (!unpackedJre.exists()) { unpackedJre.mkdirs() copy { diff --git a/build-logic/src/main/groovy/terasology-metrics.gradle b/build-logic/src/main/groovy/terasology-metrics.gradle index a14e24f7b..b4418f523 100644 --- a/build-logic/src/main/groovy/terasology-metrics.gradle +++ b/build-logic/src/main/groovy/terasology-metrics.gradle @@ -16,14 +16,15 @@ configurations { dependencies { // Config for our code analytics lives in a centralized repo: https://github.com/MovingBlocks/TeraConfig - codeMetrics(group: 'org.terasology.config', name: 'codemetrics', version: '1.6.3', ext: 'zip') + codeMetrics(group: 'org.terasology.config', name: 'codemetrics', version: '2.2.0', ext: 'zip') - pmd('net.sourceforge.pmd:pmd-core:6.15.0') - pmd('net.sourceforge.pmd:pmd-java:6.15.0') + pmd("net.sourceforge.pmd:pmd-ant:7.26.0") + pmd("net.sourceforge.pmd:pmd-core:7.26.0") + pmd("net.sourceforge.pmd:pmd-java:7.26.0") } jacoco { - toolVersion = "0.8.5" + toolVersion = "0.8.15" } jacocoTestReport { @@ -39,6 +40,8 @@ jacocoTestReport { checkstyle { ignoreFailures = true configFile = new File(rootDir, 'config/metrics/checkstyle/checkstyle.xml') + toolVersion = "10.2" + configDirectory.set(configFile.parentFile) configProperties.samedir = checkstyle.configFile.parentFile } @@ -50,16 +53,14 @@ pmd { } spotbugs { - toolVersion = '4.0.0' + toolVersion = '4.8.1' ignoreFailures = true excludeFilter = new File(rootDir, "config/metrics/findbugs/findbugs-exclude.xml") } -spotbugsMain { - reports { - xml { - enabled = true - destination = file("$buildDir/reports/spotbugs/main/spotbugs.xml") - } +tasks.spotbugsMain { + reports.create('xml') { + enabled = true + outputLocation = file("$buildDir/reports/spotbugs/main/spotbugs.xml") } } @@ -87,10 +88,12 @@ tasks.withType(Checkstyle).configureEach { } tasks.withType(Pmd).configureEach { + dependsOn extractMetricsConfig group = 'Reporting' } tasks.withType(SpotBugsTask).configureEach { + dependsOn extractMetricsConfig group = 'Reporting' } diff --git a/desktop/build.gradle b/desktop/build.gradle index 71c6ab12e..c838ea2c0 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -19,6 +19,9 @@ plugins { id 'destination-sol-jre' } +import groovy.xml.XmlParser +import groovy.xml.XmlNodePrinter + project.ext.mainClassName = "org.destinationsol.desktop.SolDesktop" dependencies { @@ -61,7 +64,7 @@ jar { } tasks.register('moduleDist', Copy) { - into("${distsDirectory.getAsFile().get()}/app/modules") + into("${base.distsDirectory.getAsFile().get()}/app/modules") rootProject.destinationSolModules().each { module -> dependsOn ":modules:$module.name" + ":jar" from("$rootDir/modules/${module.name}/build/libs") { @@ -75,7 +78,7 @@ tasks.register('copyLaunchers', Copy) { from("$rootDir/launcher") include("*.sh", "*.exe") - into("${distsDirectory.getAsFile().get()}/app") + into("${base.distsDirectory.getAsFile().get()}/app") } tasks.register('libsDist', Copy) { @@ -85,7 +88,7 @@ tasks.register('libsDist', Copy) { from jar from configurations.runtimeClasspath - into("${distsDirectory.getAsFile().get()}/app/libs") + into("${base.distsDirectory.getAsFile().get()}/app/libs") } tasks.register('distUnbundledJRE') { @@ -102,7 +105,7 @@ tasks.register('distZipUnbundledJRE', Zip) { group 'Distribution' dependsOn distUnbundledJRE - from "${distsDirectory.getAsFile().get()}/app" + from "${base.distsDirectory.getAsFile().get()}/app" archiveFileName = "DestinationSol.zip" } @@ -119,7 +122,7 @@ tasks.register('distZipBundleJREs', Zip) { group 'Distribution' dependsOn distBundleJREs - from "${distsDirectory.getAsFile().get()}/app" + from "${base.distsDirectory.getAsFile().get()}/app" archiveFileName = "DestinationSol.zip" } diff --git a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java index 97ce2e947..ae849b5c0 100644 --- a/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java +++ b/desktop/src/main/java/org/destinationsol/desktop/SolDesktop.java @@ -94,7 +94,7 @@ public static void main(String[] argv) { try { splash = SplashScreen.getSplashScreen(); } catch (Exception e) { - e.printStackTrace(); + logger.error("Failed to open splash screen", e); } boolean useSplash = (splash != null) && Stream.of(argv).noneMatch(s -> s.equals(NO_SPLASH_SCREEN)); diff --git a/engine/build.gradle b/engine/build.gradle index e54bf0991..83287e243 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -80,13 +80,14 @@ dependencies { testImplementation "com.badlogicgames.gdx-controllers:gdx-controllers-desktop:$gdxControllersVersion" // Test lib dependencies - testImplementation("org.junit.jupiter:junit-jupiter-api:5.5.2") - testImplementation("org.junit.jupiter:junit-jupiter-params:5.5.2") - testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.2.0' - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.5.2") - - testImplementation group: 'org.jboss.shrinkwrap', name: 'shrinkwrap-depchain-java7', version: '1.1.3' - testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.9.0' + testImplementation("org.junit.jupiter:junit-jupiter-api:6.1.2") + testImplementation("org.junit.jupiter:junit-jupiter-params:6.1.2") + testImplementation "org.mockito:mockito-junit-jupiter:5.23.0" + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:6.1.2") + testRuntimeOnly('org.junit.platform:junit-platform-launcher:6.1.2') + + testImplementation "org.jboss.shrinkwrap:shrinkwrap-depchain-java7:1.1.3" + testImplementation "org.assertj:assertj-core:3.27.7" } // Adds Resources as parameter for AnnotationProcessor (gather ResourceIndex, diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dcf0f19c5..f98345f0f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-all.zip diff --git a/libs/subprojects.gradle b/libs/subprojects.gradle index ffd8c7703..07598e541 100644 --- a/libs/subprojects.gradle +++ b/libs/subprojects.gradle @@ -5,9 +5,11 @@ // https://docs.gradle.org/6.4.1/userguide/composite_builds.html file(".").eachDir { possibleIncludedBuildDirectory -> File buildFile = new File(possibleIncludedBuildDirectory, "build.gradle") + File buildFileKts = new File(possibleIncludedBuildDirectory, "build.gradle.kts") File settingsFile = new File(possibleIncludedBuildDirectory, "settings.gradle") + File settingsFileKts = new File(possibleIncludedBuildDirectory, "settings.gradle.kts") - if (buildFile.exists() && settingsFile.exists()) { + if ((buildFile.exists() || buildFileKts.exists()) && (settingsFile.exists() || settingsFileKts.exists())) { logger.info("{} will be included in the composite build.", rootDir.relativePath(possibleIncludedBuildDirectory)) includeBuild(possibleIncludedBuildDirectory) From 857eda1dde4bd0f03bca7a5912515eb6ba23b92f Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Thu, 30 Jul 2026 18:10:16 +0100 Subject: [PATCH 2/5] build!: upgrade to Java 17" -m "This is required for continued compatibility with newer versions of Gestalt. --- README.md | 2 +- build-logic/build.gradle | 5 +++-- .../src/main/groovy/destination-sol-java.gradle | 16 ++++++++-------- .../src/main/groovy/terasology-metrics.gradle | 8 ++++++++ desktop/build.gradle | 5 +++++ 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cac93b6a2..40e9b2684 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Note: You can select either pure keyboard, keyboard + mouse, or controller (in t Building and running from source -------- -You only need Java 11 installed to run Destination Sol from source. +You only need Java 17 installed to run Destination Sol from source. Run any commands in the project root directory (where you cloned / extracted the project to, using a command prompt / terminal). diff --git a/build-logic/build.gradle b/build-logic/build.gradle index e21074954..11671d72d 100644 --- a/build-logic/build.gradle +++ b/build-logic/build.gradle @@ -7,12 +7,13 @@ repositories { } compileJava { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } dependencies { implementation 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.2.3' + implementation 'ru.vyarus:gradle-animalsniffer-plugin:2.0.1' implementation 'de.undercouch:gradle-download-task:5.7.0' implementation 'gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext:1.4.1' } \ No newline at end of file diff --git a/build-logic/src/main/groovy/destination-sol-java.gradle b/build-logic/src/main/groovy/destination-sol-java.gradle index fcbc7dd04..7c8f31a1b 100644 --- a/build-logic/src/main/groovy/destination-sol-java.gradle +++ b/build-logic/src/main/groovy/destination-sol-java.gradle @@ -3,8 +3,8 @@ plugins { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 withJavadocJar() withSourcesJar() @@ -12,22 +12,22 @@ java { compileJava { options.encoding = 'UTF-8' - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 // The release flag is required for Java 9+. if (JavaVersion.current().isJava9Compatible()) { - options.release = 8 + options.release = 17 } } compileTestJava { options.encoding = 'UTF-8' - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 // The release flag is required for Java 9+. if (JavaVersion.current().isJava9Compatible()) { - options.release = 8 + options.release = 17 } } \ No newline at end of file diff --git a/build-logic/src/main/groovy/terasology-metrics.gradle b/build-logic/src/main/groovy/terasology-metrics.gradle index b4418f523..72fba40ad 100644 --- a/build-logic/src/main/groovy/terasology-metrics.gradle +++ b/build-logic/src/main/groovy/terasology-metrics.gradle @@ -8,6 +8,7 @@ plugins { id 'pmd' id 'com.github.spotbugs' id 'jacoco' + id 'ru.vyarus.animalsniffer' } configurations { @@ -21,6 +22,13 @@ dependencies { pmd("net.sourceforge.pmd:pmd-ant:7.26.0") pmd("net.sourceforge.pmd:pmd-core:7.26.0") pmd("net.sourceforge.pmd:pmd-java:7.26.0") + + signature('com.toasttab.android:gummy-bears-api-24:0.15.0:coreLib2@signature') +} + +animalsniffer { + // java.nio.* APIs can be desugared by D8. java.io.File.toPath() also needs to be excluded. + ignore = ["java.nio.file.*", "java.io.File"] } jacoco { diff --git a/desktop/build.gradle b/desktop/build.gradle index c838ea2c0..8a8746c49 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -35,6 +35,11 @@ dependencies { implementation group: 'org.terasology.crashreporter', name: 'cr-destsol', version: '4.0.0' } +tasks.withType(ru.vyarus.gradle.plugin.animalsniffer.AnimalSniffer) { + // The desktop facade does not run on Android, so we do not have to fulfil its constraints. + exclude("**/*") +} + tasks.register('run', JavaExec) { dependsOn classes //TODO: Remove extra args when the splash screen works on Macs again - see https://github.com/MovingBlocks/DestinationSol/issues/414 From 27e83842642c4ada8b4ae9f42eebcf52f980127c Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Thu, 30 Jul 2026 19:18:16 +0100 Subject: [PATCH 3/5] build: fix JRE downloads from distribution --- build-logic/src/main/groovy/destination-sol-jre.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build-logic/src/main/groovy/destination-sol-jre.gradle b/build-logic/src/main/groovy/destination-sol-jre.gradle index 6dcc638d1..186c5aa0a 100644 --- a/build-logic/src/main/groovy/destination-sol-jre.gradle +++ b/build-logic/src/main/groovy/destination-sol-jre.gradle @@ -38,8 +38,10 @@ jreUrlFilenames.each { os, file -> group 'Download' description "Downloads JRE for $os" + def packedJre = new File("$rootDir/jre/$jreVersion/$file") + def unpackedJre = base.distsDirectory.dir('app/$os').get().asFile + doFirst { - def packedJre = new File("$rootDir/jre/$jreVersion/$file") download.run { src "$jreUrlBase-$file" dest packedJre @@ -49,7 +51,6 @@ jreUrlFilenames.each { os, file -> doLast { // Unpack the JRE - def unpackedJre = new File(base.distsDirectory.dir('app/$os')) if (!unpackedJre.exists()) { unpackedJre.mkdirs() copy { From bef7948eacf00e6876ca3828e1eeceeae2e43dc6 Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Thu, 30 Jul 2026 20:09:04 +0100 Subject: [PATCH 4/5] fix: update Gestalt to version 8.0.2-SNAPSHOT --- build-logic/src/main/groovy/destination-sol-constants.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-logic/src/main/groovy/destination-sol-constants.gradle b/build-logic/src/main/groovy/destination-sol-constants.gradle index bfb515634..fbea5790f 100644 --- a/build-logic/src/main/groovy/destination-sol-constants.gradle +++ b/build-logic/src/main/groovy/destination-sol-constants.gradle @@ -2,7 +2,7 @@ ext { appName = 'DestinationSol' engineVersion = '2.1.0' - gestaltVersion = '8.0.0-SNAPSHOT' + gestaltVersion = '8.0.2-SNAPSHOT' gdxVersion = '1.12.1' // The LibGDX controllers library is versioned differently to the main LibGDX versions. // See https://github.com/libgdx/gdx-controllers/wiki/Compatibility for compatible versions. From 8db2e7c6f86763343c4afe072136789ec80f749e Mon Sep 17 00:00:00 2001 From: Benjamin Amos Date: Fri, 14 Aug 2026 13:35:38 +0100 Subject: [PATCH 5/5] build: fix jre dist directory path --- build-logic/src/main/groovy/destination-sol-jre.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-logic/src/main/groovy/destination-sol-jre.gradle b/build-logic/src/main/groovy/destination-sol-jre.gradle index 186c5aa0a..bdf6bd01a 100644 --- a/build-logic/src/main/groovy/destination-sol-jre.gradle +++ b/build-logic/src/main/groovy/destination-sol-jre.gradle @@ -39,7 +39,7 @@ jreUrlFilenames.each { os, file -> description "Downloads JRE for $os" def packedJre = new File("$rootDir/jre/$jreVersion/$file") - def unpackedJre = base.distsDirectory.dir('app/$os').get().asFile + def unpackedJre = base.distsDirectory.dir("app/$os").get().asFile doFirst { download.run {