From d0bb30487b9d10e4598e74ed7c0a499a525805ad Mon Sep 17 00:00:00 2001 From: Petr Panteleyev Date: Fri, 4 Nov 2022 16:54:50 +0300 Subject: [PATCH] JPackage Gradle Plugin 1.5.0 * Introduced jpackage version check for parameters * Added: --about-url --app-content --bind-services --jlink-options --launcher-as-service --linux-package-deps --mac-app-category --mac-app-store --mac-dmg-content --mac-entitlements --win-help-url --win-shortcut-prompt --win-update-url --- README.md | 131 +++--- build.gradle.kts | 4 +- settings.gradle.kts | 4 +- .../jpackage/CommandLineParameter.java | 112 +++++ .../org/panteleyev/jpackage/JPackageTask.java | 440 +++++++++++++++--- 5 files changed, 555 insertions(+), 136 deletions(-) create mode 100644 src/main/java/org/panteleyev/jpackage/CommandLineParameter.java diff --git a/README.md b/README.md index bc403e3..ca0f321 100644 --- a/README.md +++ b/README.md @@ -47,58 +47,72 @@ windows { ### Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterTypeJPackage Argument
Generic
typeImageType--type <type>
appNameString--name <name>
appVersionString--app-version <version>
copyrightString--copyright <copyright string>
appDescriptionString--description <description string>
vendorString--vendor <vendor string>
installDirString--install-dir <file path>
moduleString--module <module name>[/<main class>]
mainClassString--main-class <class name>
mainJarString--main-jar <main jar file>
verboseBoolean--verbose
argumentsString--arguments <main class arguments>
addModulesString--add-modules <module>[,<module>]
appImageString (*)--app-image <name>
destinationString (*)--dest <destination path>
fileAssociationsString (*)--file-associations <file association property file>
iconString (*)--icon <icon file path>
inputString (*)--input <input path>
licenseFileString (*)--license-file <license file path>
modulePathsString (*)--module-path <module path>
resourceDirString (*)--resource-dir <resource dir path>
runtimeImageString (*)--runtime-image <file path>
tempString (*)--temp <temp dir path>
launchersLauncher (*)--add-launcher <name>=<property file>
Windows
winMenuBoolean--win-menu
winDirChooserBoolean--win-dir-chooser
winUpgradeUuidString--win-upgrade-uuid <id string>
winMenuGroupString--win-menu-group <menu group name>
winShortcutBoolean--win-shortcut
winPerUserInstallBoolean--win-per-user-install
winConsoleBoolean--win-console
OS X
macPackageIdentifierString--mac-package-identifier <ID string>
macPackageNameString--mac-package-name <name string>
macPackageSigningPrefixString--mac-package-signing-prefix <prefix string>
macSignBoolean--mac-sign
macSigningKeychainString (*)--mac-signing-keychain <file path>
macSigningKeyUserNameString--mac-signing-key-user-name <team name>
Linux
linuxPackageNameString--linux-package-name <package name>
linuxDebMaintainerString--linux-deb-maintainer <email address>
linuxMenuGroupString--linux-menu-group <menu-group-name>
linuxRpmLicenseTypeString--linux-rpm-license-type <type string>
linuxAppReleaseString--linux-app-release <release value>
linuxAppCategoryString--linux-app-category <category value>
linuxShortcutBoolean--linux-shortcut
ParameterTypeJPackage ArgumentMin VersionMax Version
Generic
aboutUrlString--about-url <url>17*
addModulesList<String>--add-modules <module>[,<module>]14*
appDescriptionString--description <description string>14*
appContentList<String> (*)--app-content additional-content[,additional-content...]18*
appImageString (*)--app-image <name>14*
appNameString--name <name>14*
appVersionString--app-version <version>14*
argumentsList<String>--arguments <main class arguments>14*
bindServicesBoolean--bind-services1415
copyrightString--copyright <copyright string>14*
destinationString (*)--dest <destination path>14*
fileAssociationsList<String> (*)--file-associations <file association property file>14*
iconString (*)--icon <icon file path>14*
inputString (*)--input <input path>14*
installDirString--install-dir <file path>14*
jLinkOptionsList<String>--jlink-options <options>16*
launchersList<Launcher> (*)--add-launcher <name>=<property file>14*
launcherAsServiceBoolean--launcher-as-service19*
licenseFileString (*)--license-file <license file path>14*
mainClassString--main-class <class name>14*
mainJarString--main-jar <main jar file>14*
moduleString--module <module name>[/<main class>]14*
modulePathsList<String> (*)--module-path <module path>14*
resourceDirString (*)--resource-dir <resource dir path>14*
runtimeImageString (*)--runtime-image <file path>14*
tempString (*)--temp <temp dir path>14*
typeImageType--type <type>14*
vendorString--vendor <vendor string>14*
verboseBoolean--verbose14*
Windows
winConsoleBoolean--win-console14*
winDirChooserBoolean--win-dir-chooser14*
winHelpUrlString--win-help-url <url>17*
winMenuBoolean--win-menu14*
winMenuGroupString--win-menu-group <menu group name>14*
winPerUserInstallBoolean--win-per-user-install14*
winShortcutBoolean--win-shortcut14*
winShortcutPromptBoolean--win-shortcut-prompt17*
winUpdateUrlString--win-update-url <url>17*
winUpgradeUuidString--win-upgrade-uuid <id string>14*
OS X
macAppCategoryString-mac-app-category <category string>17*
macAppStoreBoolean--mac-app-store17*
macBundleSigningPrefixString--mac-bundle-signing-prefix <prefix string>1416
macDmgContentList<String> (*)--mac-dmg-content additional-content[,additional-content...]18*
macEntitlementsString (*)--mac-entitlements <file path>17*
macPackageIdentifierString--mac-package-identifier <ID string>14*
macPackageNameString--mac-package-name <name string>14*
macPackageSigningPrefixString--mac-package-signing-prefix <prefix string>17*
macSignBoolean--mac-sign14*
macSigningKeychainString (*)--mac-signing-keychain <file path>14*
macSigningKeyUserNameString--mac-signing-key-user-name <team name>14*
Linux
linuxAppCategoryString--linux-app-category <category value>14*
linuxAppReleaseString--linux-app-release <release value>14*
linuxDebMaintainerString--linux-deb-maintainer <email address>14*
linuxMenuGroupString--linux-menu-group <menu-group-name>14*
linuxPackageNameString--linux-package-name <package name>14*
linuxPackageDepsBoolean--linux-package-deps14*
linuxRpmLicenseTypeString--linux-rpm-license-type <type string>14*
linuxShortcutBoolean--linux-shortcut14*
@@ -133,17 +147,16 @@ argumens = listOf( ) ``` -### Additional Parameters +### jlink options -Additional parameters allow passing ```jpackage``` command line options not supported by the plugin. These parameters -are passed as is without any transformation. +Options that are passed to underlying jlink call. _Example:_ ```kotlin -additionalParameters = listOf( - "--jlink-options", - "--bind-services" +jLinkOptions = listOf( + "--strip-native-commands", + "--strip-debug" ) ``` @@ -185,4 +198,4 @@ $ ./gradlew clean build jpackage --info -Djpackage.dryRun=true ## References -[Packaging Tool User's Guide](https://docs.oracle.com/en/java/javase/16/jpackage/packaging-tool-user-guide.pdf) +[Packaging Tool User's Guide](https://docs.oracle.com/en/java/javase/19/jpackage/packaging-tool-user-guide.pdf) diff --git a/build.gradle.kts b/build.gradle.kts index 77e0430..a4032f7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ SPDX-License-Identifier: BSD-2-Clause */ group = "org.panteleyev" -version = "1.4.1" +version = "1.5.0" plugins { java @@ -17,7 +17,7 @@ repositories { } dependencies { - testImplementation("org.testng:testng:7.3.0") + testImplementation("org.testng:testng:7.6.1") } java { diff --git a/settings.gradle.kts b/settings.gradle.kts index e7dc844..a9dc40a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ /* - Copyright (c) Petr Panteleyev. All rights reserved. - Licensed under the BSD license. See LICENSE file in the project root for full license information. + Copyright © 2020 Petr Panteleyev + SPDX-License-Identifier: BSD-2-Clause */ rootProject.name = "jpackage-gradle-plugin" diff --git a/src/main/java/org/panteleyev/jpackage/CommandLineParameter.java b/src/main/java/org/panteleyev/jpackage/CommandLineParameter.java new file mode 100644 index 0000000..cca34c5 --- /dev/null +++ b/src/main/java/org/panteleyev/jpackage/CommandLineParameter.java @@ -0,0 +1,112 @@ +/* + Copyright © 2022 Petr Panteleyev + SPDX-License-Identifier: BSD-2-Clause + */ +package org.panteleyev.jpackage; + +import org.gradle.api.GradleException; + +import static org.panteleyev.jpackage.JPackageTask.EXECUTABLE; + +enum CommandLineParameter { + NAME("--name"), + DESTINATION("--dest"), + VERBOSE("--verbose"), + TYPE("--type"), + APP_VERSION("--app-version"), + COPYRIGHT("--copyright"), + DESCRIPTION("--description"), + RUNTIME_IMAGE("--runtime-image"), + INPUT("--input"), + INSTALL_DIR("--install-dir"), + RESOURCE_DIR("--resource-dir"), + VENDOR("--vendor"), + MODULE("--module"), + MAIN_CLASS("--main-class"), + MAIN_JAR("--main-jar"), + TEMP("--temp"), + ICON("--icon"), + LICENSE_FILE("--license-file"), + APP_IMAGE("--app-image"), + MODULE_PATH("--module-path"), + ADD_MODULES("--add-modules"), + JAVA_OPTIONS("--java-options"), + ARGUMENTS("--arguments"), + FILE_ASSOCIATIONS("--file-associations"), + ADD_LAUNCHER("--add-launcher"), + BIND_SERVICES("--bind-services", 14, 15), + JLINK_OPTIONS("--jlink-options", 16), + ABOUT_URL("--about-url", 17), + APP_CONTENT("--app-content", 18), + LAUNCHER_AS_SERVICE("--launcher-as-service", 19), + // Mac + MAC_PACKAGE_IDENTIFIER("--mac-package-identifier"), + MAC_PACKAGE_NAME("--mac-package-name"), + MAC_BUNDLE_SIGNING_PREFIX("--mac-bundle-signing-prefix", 14, 16), + MAC_PACKAGE_SIGNING_PREFIX("--mac-package-signing-prefix", 17), + MAC_APP_STORE("--mac-app-store", 17), + MAC_ENTITLEMENTS("--mac-entitlements", 17), + MAC_APP_CATEGORY("--mac-app-category", 17), + MAC_SIGN("--mac-sign"), + MAC_SIGNING_KEYCHAIN("--mac-signing-keychain"), + MAC_SIGNING_KEY_USER_NAME("--mac-signing-key-user-name"), + MAC_DMG_CONTENT("--mac-dmg-content", 18), + // Windows + WIN_CONSOLE("--win-console"), + WIN_DIR_CHOOSER("--win-dir-chooser"), + WIN_HELP_URL("--win-help-url", 17), + WIN_MENU("--win-menu"), + WIN_MENU_GROUP("--win-menu-group"), + WIN_PER_USER_INSTALL("--win-per-user-install"), + WIN_SHORTCUT("--win-shortcut"), + WIN_SHORTCUT_PROMPT("--win-shortcut-prompt", 17), + WIN_UPDATE_URL("--win-update-url", 17), + WIN_UPGRADE_UUID("--win-upgrade-uuid"), + // Linux + LINUX_PACKAGE_NAME("--linux-package-name"), + LINUX_DEB_MAINTAINER("--linux-deb-maintainer"), + LINUX_MENU_GROUP("--linux-menu-group"), + LINUX_PACKAGE_DEPS("--linux-package-deps"), + LINUX_RPM_LICENSE_TYPE("--linux-rpm-license-type"), + LINUX_APP_RELEASE("--linux-app-release"), + LINUX_APP_CATEGORY("--linux-app-category"), + LINUX_SHORTCUT("--linux-shortcut"); + + private final String name; + private final int minVersion; + private final int maxVersion; + + CommandLineParameter(String name, int minVersion, int maxVersion) { + this.name = name; + this.minVersion = minVersion; + this.maxVersion = maxVersion; + } + + CommandLineParameter(String name, int minVersion) { + this(name, minVersion, Integer.MAX_VALUE); + } + + CommandLineParameter(String name) { + this(name, 14, Integer.MAX_VALUE); + } + + public String getName() { + return name; + } + + public void checkVersion(int version) throws GradleException { + if (version < minVersion || version > maxVersion) { + throw new GradleException( + "Parameter \"" + + name + + "\" requires " + + EXECUTABLE + + " versions: [" + + minVersion + + ".." + + (maxVersion == Integer.MAX_VALUE ? "*" : maxVersion) + + "]" + ); + } + } +} diff --git a/src/main/java/org/panteleyev/jpackage/JPackageTask.java b/src/main/java/org/panteleyev/jpackage/JPackageTask.java index 6154906..49a9330 100644 --- a/src/main/java/org/panteleyev/jpackage/JPackageTask.java +++ b/src/main/java/org/panteleyev/jpackage/JPackageTask.java @@ -19,11 +19,69 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import static org.panteleyev.jpackage.CommandLineParameter.ABOUT_URL; +import static org.panteleyev.jpackage.CommandLineParameter.ADD_LAUNCHER; +import static org.panteleyev.jpackage.CommandLineParameter.ADD_MODULES; +import static org.panteleyev.jpackage.CommandLineParameter.APP_CONTENT; +import static org.panteleyev.jpackage.CommandLineParameter.APP_IMAGE; +import static org.panteleyev.jpackage.CommandLineParameter.APP_VERSION; +import static org.panteleyev.jpackage.CommandLineParameter.ARGUMENTS; +import static org.panteleyev.jpackage.CommandLineParameter.BIND_SERVICES; +import static org.panteleyev.jpackage.CommandLineParameter.COPYRIGHT; +import static org.panteleyev.jpackage.CommandLineParameter.DESCRIPTION; +import static org.panteleyev.jpackage.CommandLineParameter.DESTINATION; +import static org.panteleyev.jpackage.CommandLineParameter.FILE_ASSOCIATIONS; +import static org.panteleyev.jpackage.CommandLineParameter.ICON; +import static org.panteleyev.jpackage.CommandLineParameter.INPUT; +import static org.panteleyev.jpackage.CommandLineParameter.INSTALL_DIR; +import static org.panteleyev.jpackage.CommandLineParameter.JAVA_OPTIONS; +import static org.panteleyev.jpackage.CommandLineParameter.JLINK_OPTIONS; +import static org.panteleyev.jpackage.CommandLineParameter.LAUNCHER_AS_SERVICE; +import static org.panteleyev.jpackage.CommandLineParameter.LICENSE_FILE; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_APP_CATEGORY; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_APP_RELEASE; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_DEB_MAINTAINER; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_MENU_GROUP; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_PACKAGE_DEPS; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_PACKAGE_NAME; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_RPM_LICENSE_TYPE; +import static org.panteleyev.jpackage.CommandLineParameter.LINUX_SHORTCUT; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_APP_CATEGORY; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_APP_STORE; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_BUNDLE_SIGNING_PREFIX; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_DMG_CONTENT; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_ENTITLEMENTS; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_PACKAGE_IDENTIFIER; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_PACKAGE_NAME; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_PACKAGE_SIGNING_PREFIX; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_SIGN; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_SIGNING_KEYCHAIN; +import static org.panteleyev.jpackage.CommandLineParameter.MAC_SIGNING_KEY_USER_NAME; +import static org.panteleyev.jpackage.CommandLineParameter.MAIN_CLASS; +import static org.panteleyev.jpackage.CommandLineParameter.MAIN_JAR; +import static org.panteleyev.jpackage.CommandLineParameter.MODULE; +import static org.panteleyev.jpackage.CommandLineParameter.MODULE_PATH; +import static org.panteleyev.jpackage.CommandLineParameter.NAME; +import static org.panteleyev.jpackage.CommandLineParameter.RESOURCE_DIR; +import static org.panteleyev.jpackage.CommandLineParameter.RUNTIME_IMAGE; +import static org.panteleyev.jpackage.CommandLineParameter.TEMP; +import static org.panteleyev.jpackage.CommandLineParameter.TYPE; +import static org.panteleyev.jpackage.CommandLineParameter.VENDOR; +import static org.panteleyev.jpackage.CommandLineParameter.VERBOSE; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_CONSOLE; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_DIR_CHOOSER; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_HELP_URL; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_MENU; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_MENU_GROUP; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_PER_USER_INSTALL; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_SHORTCUT; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_SHORTCUT_PROMPT; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_UPDATE_URL; +import static org.panteleyev.jpackage.CommandLineParameter.WIN_UPGRADE_UUID; import static org.panteleyev.jpackage.OsUtil.isLinux; import static org.panteleyev.jpackage.OsUtil.isMac; import static org.panteleyev.jpackage.OsUtil.isWindows; @@ -31,7 +89,7 @@ @SuppressWarnings({"SameParameterValue", "unused"}) public class JPackageTask extends DefaultTask { - private static final String EXECUTABLE = "jpackage"; + static final String EXECUTABLE = "jpackage"; private boolean verbose; private ImageType type = ImageType.DEFAULT; @@ -58,6 +116,11 @@ public class JPackageTask extends DefaultTask { private List fileAssociations; private List launchers; private List addModules; + private boolean bindServices; + private List jLinkOptions; + private String aboutUrl; + private boolean launcherAsService; + private List appContent; // Windows specific parameters private boolean winMenu; @@ -67,14 +130,22 @@ public class JPackageTask extends DefaultTask { private boolean winShortcut; private boolean winPerUserInstall; private boolean winConsole; + private String winHelpUrl; + private boolean winShortcutPrompt; + private String winUpdateUrl; // OS X specific parameters private String macPackageIdentifier; private String macPackageName; private String macPackageSigningPrefix; + private String macBundleSigningPrefix; private boolean macSign; private String macSigningKeychain; private String macSigningKeyUserName; + private boolean macAppStore; + private String macAppCategory; + private String macEntitlements; + private List macDmgContent; // Linux specific parameters private String linuxPackageName; @@ -84,6 +155,7 @@ public class JPackageTask extends DefaultTask { private String linuxAppRelease; private String linuxAppCategory; private boolean linuxShortcut; + private boolean linuxPackageDeps; // Additional parameters private List additionalParameters = new ArrayList<>(); @@ -345,6 +417,54 @@ public void setAddModules(List addModules) { this.addModules = addModules; } + @Input + public boolean getBindServices() { + return bindServices; + } + + public void setBindServices(boolean bindServices) { + this.bindServices = bindServices; + } + + @Input + @org.gradle.api.tasks.Optional + public List getJLinkOptions() { + return jLinkOptions; + } + + public void setJLinkOptions(List jLinkOptions) { + this.jLinkOptions = jLinkOptions; + } + + @Input + @org.gradle.api.tasks.Optional + public String getAboutUrl() { + return aboutUrl; + } + + public void setAboutUrl(String aboutUrl) { + this.aboutUrl = aboutUrl; + } + + @Input + public boolean getLauncherAsService() { + return launcherAsService; + } + + public void setLauncherAsService(boolean launcherAsService) { + this.launcherAsService = launcherAsService; + } + + @Input + @org.gradle.api.tasks.Optional + public List getAppContent() { + return appContent; + } + + public void setAppContent(List appContent) { + this.appContent = appContent; + } + @Input public boolean getWinMenu() { return winMenu; @@ -410,6 +530,35 @@ public void setWinConsole(boolean winConsole) { this.winConsole = winConsole; } + @Input + @org.gradle.api.tasks.Optional + public String getWinHelpUrl() { + return winHelpUrl; + } + + public void setWinHelpUrl(String winHelpUrl) { + this.winHelpUrl = winHelpUrl; + } + + @Input + public boolean getWinShortcutPrompt() { + return winShortcutPrompt; + } + + public void setWinShortcutPrompt(boolean winShortcutPrompt) { + this.winShortcutPrompt = winShortcutPrompt; + } + + @Input + @org.gradle.api.tasks.Optional + public String getWinUpdateUrl() { + return winUpdateUrl; + } + + public void setWinUpdateUrl(String winUpdateUrl) { + this.winUpdateUrl = winUpdateUrl; + } + @Input @org.gradle.api.tasks.Optional public String getMacPackageIdentifier() { @@ -440,6 +589,16 @@ public void setMacPackageSigningPrefix(String macPackageSigningPrefix) { this.macPackageSigningPrefix = macPackageSigningPrefix; } + @Input + @org.gradle.api.tasks.Optional + public String getMacBundleSigningPrefix() { + return macBundleSigningPrefix; + } + + public void setMacBundleSigningPrefix(String macBundleSigningPrefix) { + this.macBundleSigningPrefix = macBundleSigningPrefix; + } + @Input public boolean getMacSign() { return macSign; @@ -469,6 +628,45 @@ public void setMacSigningKeyUserName(String macSigningKeyUserName) { this.macSigningKeyUserName = macSigningKeyUserName; } + @Input + public boolean getMacAppStore() { + return macAppStore; + } + + public void setMacAppStore(boolean macAppStore) { + this.macAppStore = macAppStore; + } + + @Input + @org.gradle.api.tasks.Optional + public String getMacAppCategory() { + return macAppCategory; + } + + public void setMacAppCategory(String macAppCategory) { + this.macAppCategory = macAppCategory; + } + + @Input + @org.gradle.api.tasks.Optional + public String getMacEntitlements() { + return macEntitlements; + } + + public void setMacEntitlements(String macEntitlements) { + this.macEntitlements = macEntitlements; + } + + @Input + @org.gradle.api.tasks.Optional + public List getMacDmgContent() { + return macDmgContent; + } + + public void setMacDmgContent(List macDmgContent) { + this.macDmgContent = macDmgContent; + } + @Input @org.gradle.api.tasks.Optional public String getLinuxPackageName() { @@ -538,6 +736,15 @@ public void setLinuxShortcut(boolean linuxShortcut) { this.linuxShortcut = linuxShortcut; } + @Input + public boolean getLinuxPackageDeps() { + return linuxPackageDeps; + } + + public void setLinuxPackageDeps(boolean linuxPackageDeps) { + this.linuxPackageDeps = linuxPackageDeps; + } + @Input public List getAdditionalParameters() { return additionalParameters; @@ -567,7 +774,6 @@ public void action() { .orElseGet(() -> getJPackageFromJavaHome() .orElseThrow(() -> new GradleException("Could not detect " + EXECUTABLE))); - getLogger().info("Using: " + jpackage); execute(jpackage); } @@ -581,6 +787,7 @@ private Optional buildExecutablePath(String home) { } } + @SuppressWarnings("UnstableApiUsage") private Optional getJPackageFromToolchain() { getLogger().info("Looking for {} in toolchain", EXECUTABLE); try { @@ -607,90 +814,109 @@ private Optional getJPackageFromJavaHome() { return buildExecutablePath(javaHome); } - private void buildParameters(Collection parameters) { - if (type != ImageType.DEFAULT) { - addParameter(parameters, "--type", type); + private void buildParameters(Collection parameters, int version) { + addParameter(parameters, ABOUT_URL, aboutUrl, version); + if (launchers != null) { + for (Launcher launcher : launchers) { + File launcherFile = getProject().file(launcher.getFilePath()); + if (!launcherFile.exists()) { + throw new GradleException("Launcher file " + launcherFile.getAbsolutePath() + " does not exist"); + } + addParameter(parameters, ADD_LAUNCHER, + launcher.getName() + "=" + launcherFile.getAbsolutePath(), version); + } } - - addParameter(parameters, "--verbose", verbose); - addParameter(parameters, "--name", appName); - addParameter(parameters, "--app-version", appVersion); - addParameter(parameters, "--copyright", copyright); - addParameter(parameters, "--description", appDescription); - addParameter(parameters, "--install-dir", installDir); - addParameter(parameters, "--vendor", vendor); - addParameter(parameters, "--module", module); - addParameter(parameters, "--main-class", mainClass); - addParameter(parameters, "--main-jar", mainJar); if (addModules != null && !addModules.isEmpty()) { - addParameter(parameters, "--add-modules", - String.join(",", addModules) - ); + addParameter(parameters, ADD_MODULES, String.join(",", addModules), version); + } + if (appContent != null) { + for (Object appContentElement : appContent) { + addFileParameter(parameters, APP_CONTENT, appContentElement.toString(), true, version); + } } + addFileParameter(parameters, APP_IMAGE, appImage, version); + addParameter(parameters, APP_VERSION, appVersion, version); if (arguments != null) { for (Object arg : arguments) { - addParameter(parameters, "--arguments", escape(arg.toString())); + addParameter(parameters, ARGUMENTS, escape(arg.toString()), version); + } + } + addParameter(parameters, BIND_SERVICES, bindServices, version); + addParameter(parameters, COPYRIGHT, copyright, version); + addParameter(parameters, DESCRIPTION, appDescription, version); + addFileParameter(parameters, DESTINATION, destination, false, version); + if (fileAssociations != null) { + for (Object association : fileAssociations) { + addFileParameter(parameters, FILE_ASSOCIATIONS, association.toString(), true, version); } } + addFileParameter(parameters, ICON, icon, true, version); + addFileParameter(parameters, INPUT, input, true, version); + addParameter(parameters, INSTALL_DIR, installDir, version); if (javaOptions != null) { for (Object option : javaOptions) { - addParameter(parameters, "--java-options", escape(option.toString())); + addParameter(parameters, JAVA_OPTIONS, escape(option.toString()), version); } } - - // File parameters - addFileParameter(parameters, "--app-image", appImage); - addFileParameter(parameters, "--dest", destination, false); - if (fileAssociations != null) { - for (Object association : fileAssociations) { - addFileParameter(parameters, "--file-associations", association.toString()); - } + if (jLinkOptions != null && !jLinkOptions.isEmpty()) { + addParameter(parameters, JLINK_OPTIONS, String.join(" ", jLinkOptions), version); } - addFileParameter(parameters, "--icon", icon); - addFileParameter(parameters, "--input", input); - addFileParameter(parameters, "--license-file", licenseFile); + addParameter(parameters, LAUNCHER_AS_SERVICE, launcherAsService, version); + addFileParameter(parameters, LICENSE_FILE, licenseFile, true, version); + addParameter(parameters, MAIN_CLASS, mainClass, version); + addParameter(parameters, MAIN_JAR, mainJar, version); + addParameter(parameters, MODULE, module, version); if (modulePaths != null) { for (Object path : modulePaths) { - addFileParameter(parameters, "--module-path", path.toString()); + addFileParameter(parameters, MODULE_PATH, path.toString(), version); } } - addFileParameter(parameters, "--resource-dir", resourceDir); - addFileParameter(parameters, "--runtime-image", runtimeImage); - addFileParameter(parameters, "--temp", temp); - if (launchers != null) { - for (Launcher launcher : launchers) { - File launcherFile = getProject().file(launcher.getFilePath()); - if (!launcherFile.exists()) { - throw new GradleException("Launcher file " + launcherFile.getAbsolutePath() + " does not exist"); - } - addParameter(parameters, "--add-launcher", - launcher.getName() + "=" + launcherFile.getAbsolutePath()); - } + addParameter(parameters, NAME, appName, version); + addFileParameter(parameters, RESOURCE_DIR, resourceDir, true, version); + addFileParameter(parameters, RUNTIME_IMAGE, runtimeImage, true, version); + addFileParameter(parameters, TEMP, temp, false, version); + if (type != ImageType.DEFAULT) { + addParameter(parameters, TYPE, type, version); } + addParameter(parameters, VENDOR, vendor, version); + addParameter(parameters, VERBOSE, verbose, version); if (isMac()) { - addParameter(parameters, "--mac-package-identifier", macPackageIdentifier); - addParameter(parameters, "--mac-package-name", macPackageName); - addParameter(parameters, "--mac-package-signing-prefix", macPackageSigningPrefix); - addParameter(parameters, "--mac-sign", macSign); - addParameter(parameters, "--mac-signing-key-user-name", macSigningKeyUserName); - addFileParameter(parameters, "--mac-signing-keychain", macSigningKeychain); + addParameter(parameters, MAC_APP_CATEGORY, macAppCategory, version); + addParameter(parameters, MAC_APP_STORE, macAppStore, version); + addParameter(parameters, MAC_BUNDLE_SIGNING_PREFIX, macBundleSigningPrefix, version); + if (macDmgContent != null) { + for (Object dmgContent : macDmgContent) { + addFileParameter(parameters, MAC_DMG_CONTENT, dmgContent.toString(), true, version); + } + } + addFileParameter(parameters, MAC_ENTITLEMENTS, macEntitlements, true, version); + addParameter(parameters, MAC_PACKAGE_IDENTIFIER, macPackageIdentifier, version); + addParameter(parameters, MAC_PACKAGE_NAME, macPackageName, version); + addParameter(parameters, MAC_PACKAGE_SIGNING_PREFIX, macPackageSigningPrefix, version); + addParameter(parameters, MAC_SIGN, macSign, version); + addParameter(parameters, MAC_SIGNING_KEY_USER_NAME, macSigningKeyUserName, version); + addFileParameter(parameters, MAC_SIGNING_KEYCHAIN, macSigningKeychain, true, version); } else if (isWindows()) { - addParameter(parameters, "--win-menu", winMenu); - addParameter(parameters, "--win-dir-chooser", winDirChooser); - addParameter(parameters, "--win-upgrade-uuid", winUpgradeUuid); - addParameter(parameters, "--win-menu-group", winMenuGroup); - addParameter(parameters, "--win-shortcut", winShortcut); - addParameter(parameters, "--win-per-user-install", winPerUserInstall); - addParameter(parameters, "--win-console", winConsole); + addParameter(parameters, WIN_CONSOLE, winConsole, version); + addParameter(parameters, WIN_DIR_CHOOSER, winDirChooser, version); + addParameter(parameters, WIN_HELP_URL, winHelpUrl, version); + addParameter(parameters, WIN_MENU, winMenu, version); + addParameter(parameters, WIN_MENU_GROUP, winMenuGroup, version); + addParameter(parameters, WIN_PER_USER_INSTALL, winPerUserInstall, version); + addParameter(parameters, WIN_SHORTCUT, winShortcut, version); + addParameter(parameters, WIN_SHORTCUT_PROMPT, winShortcutPrompt, version); + addParameter(parameters, WIN_UPDATE_URL, winUpdateUrl, version); + addParameter(parameters, WIN_UPGRADE_UUID, winUpgradeUuid, version); } else if (isLinux()) { - addParameter(parameters, "--linux-package-name", linuxPackageName); - addParameter(parameters, "--linux-deb-maintainer", linuxDebMaintainer); - addParameter(parameters, "--linux-menu-group", linuxMenuGroup); - addParameter(parameters, "--linux-rpm-license-type", linuxRpmLicenseType); - addParameter(parameters, "--linux-app-release", linuxAppRelease); - addParameter(parameters, "--linux-app-category", linuxAppCategory); - addParameter(parameters, "--linux-shortcut", linuxShortcut); + addParameter(parameters, LINUX_APP_CATEGORY, linuxAppCategory, version); + addParameter(parameters, LINUX_APP_RELEASE, linuxAppRelease, version); + addParameter(parameters, LINUX_DEB_MAINTAINER, linuxDebMaintainer, version); + addParameter(parameters, LINUX_MENU_GROUP, linuxMenuGroup, version); + addParameter(parameters, LINUX_PACKAGE_DEPS, linuxPackageDeps, version); + addParameter(parameters, LINUX_PACKAGE_NAME, linuxPackageName, version); + addParameter(parameters, LINUX_RPM_LICENSE_TYPE, linuxRpmLicenseType, version); + addParameter(parameters, LINUX_SHORTCUT, linuxShortcut, version); } // Additional options @@ -700,9 +926,16 @@ private void buildParameters(Collection parameters) { } private void execute(String cmd) { + int version = getMajorVersion(cmd); + if (version == 0) { + throw new GradleException("Could not determine " + EXECUTABLE + " version"); + } else { + getLogger().info("Using: {}, major version: {}", cmd, version); + } + List parameters = new ArrayList<>(); parameters.add(cmd.contains(" ") ? "\"" + cmd + "\"" : cmd); - buildParameters(parameters); + buildParameters(parameters, version); if (dryRun) { return; @@ -752,6 +985,40 @@ private void execute(String cmd) { } } + + private int getMajorVersion(String cmd) { + List parameters = new ArrayList<>(); + parameters.add(cmd.contains(" ") ? "\"" + cmd + "\"" : cmd); + parameters.add("--version"); + + try { + ProcessBuilder processBuilder = new ProcessBuilder(); + Process process = processBuilder + .redirectErrorStream(true) + .command(parameters) + .start(); + + int result = 0; + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + String line = reader.readLine(); + if (line != null) { + String[] parts = line.split("\\."); + result = Integer.parseInt(parts[0]); + } + } + + int status = process.waitFor(); + if (status != 0) { + return 0; + } else { + return result; + } + } catch (Exception e) { + return 0; + } + } + /** * Executes windows specific configuration block. * @@ -795,21 +1062,35 @@ private void addParameter(Collection params, String name, String value) params.add(value); } - private void addFileParameter(Collection params, String name, String value) { - addFileParameter(params, name, value, true); + private void addParameter(Collection params, CommandLineParameter parameter, String value, int version) { + if (value == null || value.isEmpty()) { + return; + } + + parameter.checkVersion(version); + + getLogger().info(" " + parameter.getName() + " " + value); + params.add(parameter.getName()); + params.add(value); + } + + private void addFileParameter(Collection params, CommandLineParameter parameter, String value, int version) { + addFileParameter(params, parameter, value, true, version); } - private void addFileParameter(Collection params, String name, String value, boolean mustExist) { + private void addFileParameter(Collection params, CommandLineParameter parameter, String value, boolean mustExist, int version) { if (value == null || value.isEmpty()) { return; } + parameter.checkVersion(version); + File file = getProject().file(value); if (mustExist && !file.exists()) { throw new GradleException("File or directory " + file.getAbsolutePath() + " does not exist"); } - addParameter(params, name, file.getAbsolutePath()); + addParameter(params, parameter.getName(), file.getAbsolutePath()); } private void addParameter(Collection params, String name, boolean value) { @@ -821,12 +1102,25 @@ private void addParameter(Collection params, String name, boolean value) params.add(name); } - private void addParameter(Collection params, String name, EnumParameter value) { + private void addParameter(Collection params, CommandLineParameter parameter, boolean value, int version) { + if (!value) { + return; + } + + parameter.checkVersion(version); + + getLogger().info(" " + parameter.getName()); + params.add(parameter.getName()); + } + + private void addParameter(Collection params, CommandLineParameter parameter, EnumParameter value, int version) { if (value == null) { return; } - addParameter(params, name, value.getValue()); + parameter.checkVersion(version); + + addParameter(params, parameter.getName(), value.getValue()); } private void addAdditionalParameter(Collection params, String parameter) {