From 792fc756079a259b02f406449bf249fa9be24f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Ladst=C3=A4tter?= Date: Sun, 18 Jul 2021 13:35:17 +0200 Subject: [PATCH] #27: adds basic macos app-image generation for macOsX based on JPackageScriptFx --- .../main/scala/app/logorrr/LogoRRRApp.scala | 2 + .../app/logorrr/LogoRRRAppLauncher.scala | 10 ++ dist/dist-osx/installer-osx/build_app.sh | 101 ++++++++++++++++++ dist/dist-osx/installer-osx/pom.xml | 76 +++++++++++++ .../src/main/resources/logorrr-icon-256.icns | Bin 0 -> 13204 bytes dist/dist-osx/pom.xml | 1 + 6 files changed, 190 insertions(+) create mode 100644 app/src/main/scala/app/logorrr/LogoRRRAppLauncher.scala create mode 100755 dist/dist-osx/installer-osx/build_app.sh create mode 100644 dist/dist-osx/installer-osx/pom.xml create mode 100644 dist/dist-osx/installer-osx/src/main/resources/logorrr-icon-256.icns diff --git a/app/src/main/scala/app/logorrr/LogoRRRApp.scala b/app/src/main/scala/app/logorrr/LogoRRRApp.scala index cc1f2de2..bf2cb0ac 100644 --- a/app/src/main/scala/app/logorrr/LogoRRRApp.scala +++ b/app/src/main/scala/app/logorrr/LogoRRRApp.scala @@ -9,6 +9,8 @@ import javafx.stage.{Stage, WindowEvent} import java.nio.file.Paths + + object LogoRRRApp { /** application name */ diff --git a/app/src/main/scala/app/logorrr/LogoRRRAppLauncher.scala b/app/src/main/scala/app/logorrr/LogoRRRAppLauncher.scala new file mode 100644 index 00000000..82d611f1 --- /dev/null +++ b/app/src/main/scala/app/logorrr/LogoRRRAppLauncher.scala @@ -0,0 +1,10 @@ +package app.logorrr + +object LogoRRRAppLauncher { + + /** launcher for macos installer */ + def main(args: Array[String]): Unit = { + LogoRRRApp.main(args) + } + +} diff --git a/dist/dist-osx/installer-osx/build_app.sh b/dist/dist-osx/installer-osx/build_app.sh new file mode 100755 index 00000000..651da826 --- /dev/null +++ b/dist/dist-osx/installer-osx/build_app.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +# ------ ENVIRONMENT -------------------------------------------------------- +# The script depends on various environment variables to exist in order to +# run properly. The java version we want to use, the location of the java +# binaries (java home), and the project version as defined inside the pom.xml +# file, e.g. 1.0-SNAPSHOT. +# +# PROJECT_VERSION: version used in pom.xml, e.g. 1.0-SNAPSHOT +# APP_VERSION: the application version, e.g. 1.0.0, shown in "about" dialog +PROJECT_VERSION=21.3.1-SNAPSHOT +APP_VERSION=23.3.1 +JAVA_VERSION=16 +MAIN_JAR="app-$PROJECT_VERSION.jar" + +# Set desired installer type: "app-image", "dmg", "pkg", "rpm" or "deb". +INSTALLER_TYPE=app-image + +echo "java home: $JAVA_HOME" +echo "project version: $PROJECT_VERSION" +echo "app version: $APP_VERSION" +echo "main JAR file: $MAIN_JAR" + +# ------ SETUP DIRECTORIES AND FILES ---------------------------------------- +# Remove previously generated java runtime and installers. Copy all required +# jar files into the input/libs folder. + +rm -rfd ./target/java-runtime/ +rm -rfd target/installer/ + +mkdir -p target/installer/input/libs/ + +cp target/libs/* target/installer/input/libs/ +#cp target/${MAIN_JAR} target/installer/input/libs/ + +# ------ REQUIRED MODULES --------------------------------------------------- +# Use jlink to detect all modules that are required to run the application. +# Starting point for the jdep analysis is the set of jars being used by the +# application. + +echo "detecting required modules" +detected_modules=`$JAVA_HOME/bin/jdeps \ + -q \ + --multi-release ${JAVA_VERSION} \ + --ignore-missing-deps \ + --print-module-deps \ + --class-path "target/installer/input/libs/*" \ + /Users/lad/gh/LogoRRR/app/target/classes/app/logorrr/LogoRRRApp.class` +echo "detected modules: ${detected_modules}" + + +# ------ MANUAL MODULES ----------------------------------------------------- +# jdk.crypto.ec has to be added manually bound via --bind-services or +# otherwise HTTPS does not work. +# +# See: https://bugs.openjdk.java.net/browse/JDK-8221674 +# +# In addition we need jdk.localedata if the application is localized. +# This can be reduced to the actually needed locales via a jlink paramter, +# e.g., --include-locales=en,de. + +manual_modules=jdk.crypto.ec,jdk.localedata +echo "manual modules: ${manual_modules}" + +# ------ RUNTIME IMAGE ------------------------------------------------------ +# Use the jlink tool to create a runtime image for our application. We are +# doing this is a separate step instead of letting jlink do the work as part +# of the jpackage tool. This approach allows for finer configuration and also +# works with dependencies that are not fully modularized, yet. + +echo "creating java runtime image" +$JAVA_HOME/bin/jlink \ + --strip-native-commands \ + --no-header-files \ + --no-man-pages \ + --compress=2 \ + --strip-debug \ + --add-modules "${detected_modules},${manual_modules}" \ + --include-locales=en,de \ + --output target/java-runtime + +# ------ PACKAGING ---------------------------------------------------------- +# In the end we will find the package inside the target/installer directory. + +echo "Creating installer of type $INSTALLER_TYPE" + +$JAVA_HOME/bin/jpackage \ +--type $INSTALLER_TYPE \ +--dest target/installer \ +--input target/installer/input/libs \ +--name LogoRRR \ +--main-class app.logorrr.LogoRRRAppLauncher \ +--main-jar ${MAIN_JAR} \ +--java-options -Xmx2048m \ +--runtime-image target/java-runtime \ +--icon src/main/resources/logorrr-icon-256.icns \ +--app-version ${APP_VERSION} \ +--vendor "app.logorrr" \ +--copyright "Copyright © 2021 Logorrr.app" \ +--mac-package-identifier app.logorrr \ +--mac-package-name LogoRRR diff --git a/dist/dist-osx/installer-osx/pom.xml b/dist/dist-osx/installer-osx/pom.xml new file mode 100644 index 00000000..0cb10561 --- /dev/null +++ b/dist/dist-osx/installer-osx/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + app.logorrr.dist.osx + dist-osx + ${revision}${changelist} + + + installer-osx + app.logorrr.dist.osx.installer + + + + app.logorrr + app + + + + + + + org.openjfx + javafx-maven-plugin + + app.logorrr.LogoRRRApp + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/libs + false + false + true + compile + runtime + + + + + + org.codehaus.mojo + exec-maven-plugin + + + create osx-installer + package + + exec + + + + + ${project.basedir} + ./build_app.sh + + 21.3.1 + ${project.version} + + + + + + + \ No newline at end of file diff --git a/dist/dist-osx/installer-osx/src/main/resources/logorrr-icon-256.icns b/dist/dist-osx/installer-osx/src/main/resources/logorrr-icon-256.icns new file mode 100644 index 0000000000000000000000000000000000000000..e2b598baf19a18daf1d984a28af26445c359f03a GIT binary patch literal 13204 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 binary-osx + installer-osx \ No newline at end of file