From c5b971d5ae01c6d5329659ffb5006e2ea70fefa3 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 25 Jul 2026 18:22:12 +0200 Subject: [PATCH 1/7] Update github actions. --- .github/workflows/gradle.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 8e361ebff..0659ccd79 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -14,16 +14,16 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: fetch-depth: 0 - name: Set up JDK 17 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v6 with: cache-read-only: ${{ github.ref != 'refs/heads/master' && github.ref != 'refs/heads/chunky-2.4.x' }} - name: Grant execute permission for gradlew @@ -46,12 +46,12 @@ jobs: ;; esac - name: Upload build - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: Chunky Build path: build/installer - name: Upload build - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: Chunky Core path: build/chunky-core-*.jar From d3eb7f6fce256500e4f0180f3dfef0ccf8cd9b6a Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 25 Jul 2026 18:51:22 +0200 Subject: [PATCH 2/7] Update to java 25. --- .github/workflows/gradle.yml | 2 +- build.gradle | 6 +++--- chunky/build.gradle | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 0659ccd79..1aaecce46 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -21,7 +21,7 @@ jobs: uses: actions/setup-java@v5 with: distribution: 'temurin' - java-version: '17' + java-version: '25' - name: Setup Gradle uses: gradle/actions/setup-gradle@v6 with: diff --git a/build.gradle b/build.gradle index cffaaf328..29a76bb2a 100644 --- a/build.gradle +++ b/build.gradle @@ -33,19 +33,19 @@ subprojects { java { toolchain { // default java version for the project - languageVersion = JavaLanguageVersion.of(17) + languageVersion = JavaLanguageVersion.of(25) } } compileTestJava { // compile tests using more recent features javaCompiler = javaToolchains.compilerFor { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(27) } } test { // run tests using more recent features javaLauncher = javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(27) } useJUnitPlatform() diff --git a/chunky/build.gradle b/chunky/build.gradle index a71bd7026..9504a82c8 100644 --- a/chunky/build.gradle +++ b/chunky/build.gradle @@ -29,7 +29,7 @@ dependencies { } javafx { - version = '17.0.11' + version = '25' configuration = 'implementation' modules = ['javafx.base', 'javafx.controls', 'javafx.fxml'] } From 69689c050ca53dd898715f65e3591c89d2a3fa5f Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 25 Jul 2026 20:24:37 +0200 Subject: [PATCH 3/7] Update gradle for java 25, use java 25 for testing too. --- build.gradle | 38 ++++++------- chunky/build.gradle | 68 ++++++++++++++---------- gradle/wrapper/gradle-wrapper.properties | 2 +- launcher/build.gradle | 6 ++- settings.gradle | 2 +- 5 files changed, 64 insertions(+), 52 deletions(-) diff --git a/build.gradle b/build.gradle index 29a76bb2a..a48b5a62d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ -project.version = getVersion() -println "Building version ${project.version}" +def projectVersion = getVersion().toString() +println "Building version ${projectVersion}" allprojects { repositories { @@ -15,7 +15,7 @@ buildscript { } } dependencies { - classpath 'org.openjfx:javafx-plugin:0.0.13' + classpath 'org.openjfx:javafx-plugin:0.1.0' classpath 'com.github.ben-manes:gradle-versions-plugin:0.46.0' } } @@ -36,17 +36,7 @@ subprojects { languageVersion = JavaLanguageVersion.of(25) } } - compileTestJava { - // compile tests using more recent features - javaCompiler = javaToolchains.compilerFor { - languageVersion = JavaLanguageVersion.of(27) - } - } test { - // run tests using more recent features - javaLauncher = javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(27) - } useJUnitPlatform() // Always run tests, even when nothing changed. @@ -113,7 +103,7 @@ defaultTasks 'release' task releaseVersion { doLast { - tryCommand([ 'git', 'tag', '-a', "${project.version}", '-m', "Version ${project.version}" ], true) + tryCommand([ 'git', 'tag', '-a', "${projectVersion}", '-m', "Version ${projectVersion}" ], true) } } @@ -121,11 +111,14 @@ task versionInfo(type: JavaExec) { dependsOn 'copyArtifacts' outputs.upToDateWhen { false } - outputs.files file("build/chunky-${project.version}.jar") - description 'Writes build/chunky-VERSION.jar, latest.json and updates chunky-core-VERSION.jar/version.json' + outputs.file(layout.buildDirectory.file("chunky-${projectVersion}.jar")) + + description = 'Writes build/chunky-VERSION.jar, latest.json and updates chunky-core-VERSION.jar/version.json' + classpath = project(':releasetools').sourceSets.main.runtimeClasspath mainClass.set('releasetools.ReleaseBuilder') - args "${project.version}", "release_notes-${project.version}.txt" + + args projectVersion, "release_notes-${projectVersion}.txt" } task release { @@ -138,30 +131,33 @@ task release { destinationDirectory.mkdirs() file("./latest.json").renameTo("${destinationDirectory}/latest.json") fileTree(buildDir).matching { - include "*-${project.version}.*" + include "*-${projectVersion}.*" }.each { it.renameTo("${destinationDirectory}/${it.name}") } } } +def launcherArchives = project(':launcher').configurations.archives + task buildReleaseJar(type: Jar) { dependsOn ':launcher:assembleDist' dependsOn 'versionInfo' - archiveFileName = "chunky-${project.version}.jar" + archiveFileName = "chunky-${projectVersion}.jar" destinationDirectory = file('build/installer') manifest { attributes('Main-Class': 'se.llbit.chunky.launcher.ChunkyLauncher') + duplicatesStrategy = DuplicatesStrategy.EXCLUDE } into('lib') { from fileTree('chunky/lib').include('*.jar') - from file("build/chunky-core-${project.version}.jar") + from file("build/chunky-core-${projectVersion}.jar") } from { - project(':launcher').configurations.archives.allArtifacts.files.collect { + launcherArchives.allArtifacts.files.collect { zipTree(it) } } diff --git a/chunky/build.gradle b/chunky/build.gradle index 9504a82c8..4e04a04dd 100644 --- a/chunky/build.gradle +++ b/chunky/build.gradle @@ -2,8 +2,13 @@ apply plugin: 'application' apply plugin: 'maven-publish' apply plugin: 'org.openjfx.javafxplugin' -mainClassName = 'se.llbit.chunky.main.Chunky' -archivesBaseName = 'chunky-core' +application { + mainClass = 'se.llbit.chunky.main.Chunky' +} + +base { + archivesName = 'chunky-core' +} configurations { implementation.extendsFrom configurations.jsonlib @@ -52,7 +57,7 @@ jar { zipTree(it) } manifest { - attributes('Main-Class': mainClassName) + attributes('Main-Class': application.mainClass) } into('se/llbit/chunky/main') { from file("src/gen-res/Version.properties") @@ -78,25 +83,35 @@ sourceSets { processResources.dependsOn 'updateVersionString' +def projectVersion = providers.provider { + version.toString() +} + task updateVersionString { - description 'Store the current version string in src/gen-res/Version.properties' + description = 'Store the current version string in src/gen-res/Version.properties' + + def versionFile = layout.projectDirectory.file('src/gen-res/Version.properties') outputs.upToDateWhen { def props = new Properties() - def output = file('src/gen-res/Version.properties') - if (output.isFile()) { - output.withInputStream { stream -> props.load(stream) } + if (versionFile.asFile.isFile()) { + versionFile.asFile.withInputStream { stream -> + props.load(stream) + } } - props['version'] == project.version + props['version'] == projectVersion.get() } doLast { - file('src/gen-res').mkdirs() - def date = new Date() - def versionFile = file('src/gen-res/Version.properties') - ant.propertyfile(file: versionFile) { - entry(key: 'version', value: project.version) - entry(key: 'gitSha', value: tryCommand(['git', 'rev-parse', 'HEAD']).trim()) + versionFile.asFile.parentFile.mkdirs() + + def gitSha = rootProject.tryCommand( + ['git', 'rev-parse', 'HEAD'] + ).trim() + + ant.propertyfile(file: versionFile.asFile) { + entry(key: 'version', value: projectVersion.get()) + entry(key: 'gitSha', value: gitSha) } } } @@ -112,12 +127,13 @@ task sourcesJar(type: Jar) { } task copyExternalDependencies(type: Copy) { - into "${buildDir}/${libsDirName}" + into layout.buildDirectory.dir("libs") from configurations.externalDependencies } -artifacts { - archives javadocJar, sourcesJar +tasks.named("assemble") { + dependsOn(javadocJar) + dependsOn(sourcesJar) } publishing { @@ -129,7 +145,7 @@ publishing { packaging = "jar" description = "Minecraft mapping and rendering tool" url = "http://chunky.llbit.se" - artifactId = archivesBaseName + artifactId = base.archivesName version = "2.5.0-SNAPSHOT" licenses { @@ -156,22 +172,20 @@ publishing { // fix dependency scopes (see https://discuss.gradle.org/t/maven-publish-plugin-generated-pom-making-dependency-scope-runtime/7494/9) // and filter dependencies + def implementationDependencies = configurations.implementation.allDependencies publishing.publications.all { pom.withXml { - asNode().dependencies.'*'.findAll() { - it.scope.text() == 'runtime' && project.configurations.implementation.allDependencies.find { dep -> + asNode().dependencies.'*'.findAll { + it.scope.text() == 'runtime' && + implementationDependencies.find { dep -> dep.name == it.artifactId.text() } - }.each() { + }.each { if (it.groupId.text() == "org.openjfx") { - // remove javafx dependencies for now (maybe make them optional in the future?) it.parent().remove(it) - // it.appendNode('optional', 'true') } else if (it.groupId.text() == "se.llbit") { - // se.llbit dependencies are included in chunky-core it.parent().remove(it) } else { - // everything else is a dependency as usual it.scope*.value = 'compile' } } @@ -181,8 +195,8 @@ publishing { repositories { maven { - name 'Build' - url layout.buildDirectory.dir('maven') + name = 'Build' + url = layout.buildDirectory.dir('maven') } } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bdc9a83b1..0feaf0e65 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/launcher/build.gradle b/launcher/build.gradle index 26b483e1f..ec5db95a0 100644 --- a/launcher/build.gradle +++ b/launcher/build.gradle @@ -1,7 +1,9 @@ apply plugin: 'application' apply plugin: 'org.openjfx.javafxplugin' -mainClassName = 'se.llbit.chunky.launcher.ChunkyLauncher' +application { + mainClass = 'se.llbit.chunky.launcher.ChunkyLauncher' +} configurations { bundled @@ -51,7 +53,7 @@ sourceSets { } jar { - manifest.attributes 'Main-Class': mainClassName + manifest.attributes 'Main-Class': application.mainClass // Include classes from the common library. from project(':lib').configurations.archives.allArtifacts.files.collect { diff --git a/settings.gradle b/settings.gradle index 8863763fd..aa69042eb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' // java toolchain resolver + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' // java toolchain resolver } rootProject.name = 'chunky' From 6e26c9c97486c929be3d40260c8571965679c1de Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 25 Jul 2026 20:25:20 +0200 Subject: [PATCH 4/7] Remove obsolete names from setup-java and setup-gradle actions. --- .github/workflows/gradle.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 1aaecce46..0d5f90d58 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -17,13 +17,11 @@ jobs: - uses: actions/checkout@v7 with: fetch-depth: 0 - - name: Set up JDK 17 - uses: actions/setup-java@v5 + - uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '25' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 + - uses: gradle/actions/setup-gradle@v6 with: cache-read-only: ${{ github.ref != 'refs/heads/master' && github.ref != 'refs/heads/chunky-2.4.x' }} - name: Grant execute permission for gradlew From 091fe65071ecaddcbd04e67fca29a2fd45886e82 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 25 Jul 2026 20:28:58 +0200 Subject: [PATCH 5/7] Update JaCoCo for Java 25 support. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a48b5a62d..418a81bde 100644 --- a/build.gradle +++ b/build.gradle @@ -45,7 +45,7 @@ subprojects { finalizedBy jacocoTestReport // report is always generated after tests run (it's very cheap) } jacoco { - toolVersion = "0.8.11" + toolVersion = "0.8.15" } jacocoTestReport { dependsOn test // tests are required to run before generating the report From 559a6b792c106bc86d75464a08623843703a84c8 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 25 Jul 2026 20:46:11 +0200 Subject: [PATCH 6/7] Use JUnit 5 for the launcher, too. --- launcher/build.gradle | 1 - .../se/llbit/chunky/launcher/ChunkyLauncherCliParseTest.java | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/launcher/build.gradle b/launcher/build.gradle index ec5db95a0..2500b63bb 100644 --- a/launcher/build.gradle +++ b/launcher/build.gradle @@ -18,7 +18,6 @@ dependencies { implementation project(':lib') testImplementation 'com.google.truth:truth:1.1.3' - testImplementation 'junit:junit:4.13.2' } java { diff --git a/launcher/test/se/llbit/chunky/launcher/ChunkyLauncherCliParseTest.java b/launcher/test/se/llbit/chunky/launcher/ChunkyLauncherCliParseTest.java index a0cde5750..148086638 100644 --- a/launcher/test/se/llbit/chunky/launcher/ChunkyLauncherCliParseTest.java +++ b/launcher/test/se/llbit/chunky/launcher/ChunkyLauncherCliParseTest.java @@ -20,10 +20,9 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.ParseException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertThrows; public class ChunkyLauncherCliParseTest { @Test From eaf263cdc9d6a27d0cbd5b54999339c2ef3219e4 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Wed, 29 Jul 2026 01:23:30 +0200 Subject: [PATCH 7/7] Copy versioned chunky-core.jar into build directory and fix generating latest.json file. --- build.gradle | 32 +++++++++++++++++++++++++++++--- chunky/.gitignore | 1 + 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 418a81bde..18d232e41 100644 --- a/build.gradle +++ b/build.gradle @@ -107,8 +107,23 @@ task releaseVersion { } } +task prepareReleaseLibraries { + dependsOn ':chunky:copyExternalDependencies' + outputs.upToDateWhen { false } + + doLast { + def libDir = file('chunky/lib') + libDir.mkdirs() + copy { + from project(':chunky').tasks.named('copyExternalDependencies').get().outputs.files + into libDir + } + } +} + task versionInfo(type: JavaExec) { dependsOn 'copyArtifacts' + dependsOn 'prepareReleaseLibraries' outputs.upToDateWhen { false } outputs.file(layout.buildDirectory.file("chunky-${projectVersion}.jar")) @@ -142,6 +157,7 @@ def launcherArchives = project(':launcher').configurations.archives task buildReleaseJar(type: Jar) { dependsOn ':launcher:assembleDist' + dependsOn 'prepareReleaseLibraries' dependsOn 'versionInfo' archiveFileName = "chunky-${projectVersion}.jar" @@ -166,10 +182,20 @@ task buildReleaseJar(type: Jar) { rename "latest.json", "version.json" } -task copyArtifacts(type: Copy) { +task copyArtifacts { dependsOn subprojects.jar - from subprojects.jar - into buildDir + dependsOn ':chunky:jar' + outputs.upToDateWhen { false } + + doLast { + def sourceJar = project(':chunky').tasks.named('jar').get().archiveFile.get().asFile + def rootJar = file("build/chunky-core-${projectVersion}.jar") + copy { + from sourceJar + into rootJar.parentFile + rename { rootJar.name } + } + } } /** Helper function to run a command. Returns the command output if the command succeeded. */ diff --git a/chunky/.gitignore b/chunky/.gitignore index 0cdf65487..7e3963237 100644 --- a/chunky/.gitignore +++ b/chunky/.gitignore @@ -1,3 +1,4 @@ /bin/ /build/ +/lib/ /src/gen-res/