From f04f49f0f9f56e68b94c5949bb0583cf5c9ecc32 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 13 Jan 2022 16:32:52 -0500 Subject: [PATCH] v1.2.0: simplified desktop gradle slightly and added windows jpackage --- desktop/build.gradle | 93 +++++++++++++++------- desktop/src/main/assets/icons/windows.ico | Bin 0 -> 17356 bytes 2 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 desktop/src/main/assets/icons/windows.ico diff --git a/desktop/build.gradle b/desktop/build.gradle index 33b7a6ae9..8601be4b5 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -1,4 +1,6 @@ -apply plugin: "java" +plugins { + id 'org.beryx.runtime' version '1.12.7' +} [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' sourceCompatibility = targetCompatibility = appJavaCompatibility @@ -9,36 +11,21 @@ processResources { from new File(project(':desktop').projectDir,"/src/main/assets") } -sourceSets { - debug - release -} - -task debug(dependsOn: classes, type: JavaExec) { - classpath = sourceSets.debug.runtimeClasspath + sourceSets.main.runtimeClasspath +task debug(type: JavaExec) { + classpath = sourceSets.main.runtimeClasspath ignoreExitValue = true main = appMainClass systemProperty 'Specification-Title', appName systemProperty 'Specification-Version', appVersionName + "-INDEV" systemProperty 'Implementation-Version', appVersionCode - - dependencies { - debugImplementation project(':services:updates:debugUpdates') - debugImplementation project(':services:news:debugNews') - } } -//need a separate task to compile dependencies first, seeing as we're setting them up in an odd way -task compileForRelease(dependsOn: classes, type: JavaCompile){ - classpath = sourceSets.release.runtimeClasspath + sourceSets.main.runtimeClasspath -} - -task release(dependsOn: compileForRelease, type: Jar) { +task release(type: Jar) { //FIXME this is now needed as of gradle 7.0, due to our weird sourceSets setup. Should see if there's a better way to do this setDuplicatesStrategy(DuplicatesStrategy.INCLUDE) from sourceSets.main.output - from { sourceSets.release.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) } } + dependsOn configurations.runtimeClasspath from { configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) } } manifest { @@ -47,11 +34,65 @@ task release(dependsOn: compileForRelease, type: Jar) { attributes 'Specification-Version': appVersionName attributes 'Implementation-Version': appVersionCode } +} +installDist.dependsOn release +startScripts.dependsOn release +jpackageImage.dependsOn release - dependencies { - releaseImplementation project(':services:updates:githubUpdates') - releaseImplementation project(':services:news:shatteredNews') +def osName = System.getProperty('os.name').toLowerCase(Locale.ROOT) +runtime { + modules = ['java.base', + 'java.desktop', + 'jdk.unsupported', + 'jdk.crypto.cryptoki'] + options = ['--strip-debug', + '--compress', '2', + '--no-header-files', + '--no-man-pages', + '--strip-native-commands', + '--vm', 'server'] + + jpackage { + mainClass = appMainClass + appVersion = (appVersionName =~ /\d+\.\d+\.\d+/)[0] + imageName = appName } + + if (osName.contains('windows')) { + targetPlatform("win") { + jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jdk_x64_windows_hotspot_16.0.1_9.zip") + javaHome = file("./build/jdks/win/jdk-16.0.1+9").getAbsolutePath() + jpackage { + jpackageHome = file("./build/jdks/win/jdk-16.0.1+9") + imageOptions = ["--icon", file("./src/main/assets/icons/windows.ico")] + + installerType = "msi" + installerName = appName + installerOptions = ["--win-dir-chooser", "--win-menu"] + } + } + } else if (osName.contains('linux')) { + //TODO testing + targetPlatform("linux") { + jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jdk_x64_linux_hotspot_16.0.1_9.tar.gz") + javaHome = file("./build/jdks/linux/jdk-16.0.1+9").getAbsolutePath() + jpackage { + jpackageHome = file("./build/jdks/linux/jdk-16.0.1+9") + //TODO config options + } + } + } else if (osName.contains('mac')) { + //TODO testing + targetPlatform("mac") { + jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jdk_x64_mac_hotspot_16.0.1_9.tar.gz") + javaHome = file("./build/jdks/mac/jdk-16.0.1+9").getAbsolutePath() + jpackage { + jpackageHome = file("./build/jdks/mac/jdk-16.0.1+9") + //TODO config options + } + } + } + } dependencies { @@ -68,8 +109,6 @@ dependencies { implementation "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-macos" implementation "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux" - //Need these at compile time to prevent errors there. - // The actual dependency used at runtime will vary based on source set. - compileOnly project(':services:updates:debugUpdates') - compileOnly project(':services:news:debugNews') + implementation project(':services:updates:githubUpdates') + implementation project(':services:news:shatteredNews') } \ No newline at end of file diff --git a/desktop/src/main/assets/icons/windows.ico b/desktop/src/main/assets/icons/windows.ico new file mode 100644 index 0000000000000000000000000000000000000000..6a75980a0440b04a3d5dbc8be2cc506a68bacbc1 GIT binary patch literal 17356 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 eyT_H!XaDf{?31GEKlUOS8D=f|4X=