diff --git a/README.md b/README.md index b4ddf145..499bc785 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: ### Plugin configuration properties | Property | Mandatory | Default value | Description | -| -------------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|----------------------------|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `additionalModulePaths` | :x: | `[]` | Additional module paths for `jdeps`. | | `additionalModules` | :x: | `[]` | Additional modules to the ones identified by `jdeps` or the specified with `modules` property. | | `additionalResources` | :x: | `[]` | Additional files and folders to include in the bundled app. | @@ -194,6 +194,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: | `useResourcesAsWorkingDir` | :x: | `true` | Uses app resources folder as default working directory (always `true` on MacOS). | | `version` | :x: | `${project.version}` | App version. | | `vmArgs` | :x: | `[]` | VM arguments. | +| `appArgs` | :x: | `[]` | Additional arguments when launching the application. | > [!IMPORTANT] > Some default values depends on the used building tool. diff --git a/build.gradle b/build.gradle index 454b9f65..37258b01 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ repositories { mavenLocal() mavenCentral() maven { - url 'https://plugins.gradle.org/m2/' + url = uri('https://plugins.gradle.org/m2/') } } @@ -64,11 +64,13 @@ dependencies { } group = 'io.github.fvarrui' -version = '1.7.6' +version = '1.7.7-SNAPSHOT' description = 'Hybrid Maven/Gradle plugin to package Java applications as native Windows, Mac OS X or GNU/Linux executables and create installers for them' -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} compileJava.options.encoding = 'UTF-8' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1bef7e8..3ae1e2f1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ 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-8.14.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java index 917fac8d..737ff2be 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java @@ -69,7 +69,7 @@ else if (Platform.linux.equals(platform)) { copySpec.include(appFolder.getName() + "/" + executable.getName()); copySpec.include(appFolder.getName() + "/" + jreDirectoryName + "/bin/*"); copySpec.include(appFolder.getName() + "/scripts/*"); - copySpec.setFileMode(0755); + copySpec.filePermissions(p -> p.unix("755")); }); } @@ -93,7 +93,7 @@ else if (Platform.mac.equals(platform)) { copySpec.include(appFile.getName() + "/Contents/MacOS/universalJavaApplicationStub"); copySpec.include(appFile.getName() + "/Contents/PlugIns/" + jreDirectoryName + "/Contents/Home/bin/*"); copySpec.include(appFile.getName() + "/Contents/Resources/scripts/*"); - copySpec.setFileMode(0755); + copySpec.filePermissions(p -> p.unix("755")); }); } diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java index cdd85c46..9d462bd1 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java @@ -65,7 +65,7 @@ else if (Platform.linux.equals(platform)) { copySpec.include(appFolder.getName() + "/" + executable.getName()); copySpec.include(appFolder.getName() + "/" + jreDirectoryName + "/bin/*"); copySpec.include(appFolder.getName() + "/scripts/*"); - copySpec.setFileMode(0755); + copySpec.filePermissions(p -> p.unix("755")); }); } @@ -88,7 +88,7 @@ else if (Platform.mac.equals(platform)) { copySpec.include(appFile.getName() + "/Contents/MacOS/universalJavaApplicationStub"); copySpec.include(appFile.getName() + "/Contents/PlugIns/" + jreDirectoryName + "/Contents/Home/bin/*"); copySpec.include(appFile.getName() + "/Contents/Resources/scripts/*"); - copySpec.setFileMode(0755); + copySpec.filePermissions(p -> p.unix("755")); }); } diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java b/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java index b2e1f206..4432a411 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java @@ -44,7 +44,7 @@ public File getRootDir() { @Override public File getBuildDir() { - return project.getBuildDir(); + return project.getLayout().getBuildDirectory().getAsFile().get(); } @Override diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java index da793647..f8d9c522 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java @@ -51,8 +51,9 @@ public PackagePluginExtension(Project project) { this.organizationEmail = ""; this.useResourcesAsWorkingDir = true; this.vmArgs = new ArrayList<>(); + this.appArgs = new ArrayList<>(); this.winConfig = new WindowsConfig(); - this.outputDirectory = project.getBuildDir(); + this.outputDirectory = project.getLayout().getBuildDirectory().getAsFile().get(); this.scripts = new Scripts(); this.forceInstaller = false; this.arch = Arch.getDefault(); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java index ce6a321a..4f4120f8 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java @@ -445,6 +445,18 @@ public void setVmArgs(List vmArgs) { this.vmArgs = vmArgs; } + @Input + @Optional + private List appArgs; + + public List getAppArgs() { + return appArgs; + } + + public void setAppArgs(List appArgs) { + this.appArgs = appArgs; + } + @Input @Optional private WindowsConfig winConfig; @@ -656,6 +668,7 @@ protected Packager createPackager() throws Exception { .url(defaultIfNull(url, extension.getUrl())) .version(defaultIfNull(version, extension.getVersion(), getProject().getVersion().toString())) .vmArgs(defaultIfNull(vmArgs, extension.getVmArgs())) + .appArgs(defaultIfNull(appArgs, extension.getAppArgs())) .winConfig(defaultIfNull(winConfig, extension.getWinConfig())); } diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java b/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java index 78d54203..18e6d354 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java @@ -1,7 +1,7 @@ package io.github.fvarrui.javapackager.maven; +import static org.apache.commons.lang3.ObjectUtils.getIfNull; import static org.apache.commons.lang3.StringUtils.defaultIfBlank; -import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment; import java.io.File; @@ -199,6 +199,12 @@ public class PackageMojo extends AbstractMojo { */ @Parameter(property = "vmArgs", required = false) private List vmArgs; + + /** + * Additional arguments to provide to the application + */ + @Parameter(property = "appArgs", readonly = false) + private List appArgs; /** * Provide your own runnable .jar (for example, a shaded .jar) instead of letting this plugin create one via @@ -346,7 +352,7 @@ public void execute() throws MojoExecutionException { .additionalModulePaths(additionalModulePaths) .additionalResources(additionalResources) .administratorRequired(administratorRequired) - .arch(defaultIfNull(arch, Arch.getDefault())) + .arch(getIfNull(arch, Arch::getDefault)) .assetsDir(assetsDir) .bundleJre(bundleJre) .classpath(classpath) @@ -387,6 +393,7 @@ public void execute() throws MojoExecutionException { .url(url) .version(version) .vmArgs(vmArgs) + .appArgs(appArgs) .winConfig(winConfig); // generate app, installers and bundles @@ -397,11 +404,11 @@ public void execute() throws MojoExecutionException { } catch (Exception e) { throw new MojoExecutionException(e.getMessage(), e); - + } } - + } diff --git a/src/main/java/io/github/fvarrui/javapackager/model/LinuxConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/LinuxConfig.java index f52507fe..cd35090c 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/LinuxConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/LinuxConfig.java @@ -94,7 +94,7 @@ public String toString() { */ public void setDefaults(Packager packager) { this.setCategories((categories == null || categories.isEmpty()) ? Collections.singletonList("Utility") : categories); - this.setInstallationPath(ObjectUtils.defaultIfNull(installationPath, "/opt")); + this.setInstallationPath(ObjectUtils.getIfNull(installationPath, () -> "/opt")); } } diff --git a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java index 2f28aec5..11f22893 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java @@ -1,6 +1,6 @@ package io.github.fvarrui.javapackager.model; -import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; +import static org.apache.commons.lang3.ObjectUtils.getIfNull; import java.io.File; import java.io.Serializable; @@ -305,16 +305,16 @@ public String toString() { * @param packager Packager */ public void setDefaults(Packager packager) { - this.setWindowX(defaultIfNull(this.getWindowX(), 10)); - this.setWindowY(defaultIfNull(this.getWindowY(), 60)); - this.setWindowWidth(defaultIfNull(this.getWindowWidth(), 540)); - this.setWindowHeight(defaultIfNull(this.getWindowHeight(), 360)); - this.setIconSize(defaultIfNull(this.getIconSize(), 128)); - this.setTextSize(defaultIfNull(this.getTextSize(), 16)); - this.setIconX(defaultIfNull(this.getIconX(), 52)); - this.setIconY(defaultIfNull(this.getIconY(), 116)); - this.setAppsLinkIconX(defaultIfNull(this.getAppsLinkIconX(), 360)); - this.setAppsLinkIconY(defaultIfNull(this.getAppsLinkIconY(), 116)); - this.setAppId(defaultIfNull(this.getAppId(), packager.getMainClass())); + this.setWindowX(getIfNull(this.getWindowX(), () -> 10)); + this.setWindowY(getIfNull(this.getWindowY(), () -> 60)); + this.setWindowWidth(getIfNull(this.getWindowWidth(), () -> 540)); + this.setWindowHeight(getIfNull(this.getWindowHeight(), () -> 360)); + this.setIconSize(getIfNull(this.getIconSize(), () -> 128)); + this.setTextSize(getIfNull(this.getTextSize(), () -> 16)); + this.setIconX(getIfNull(this.getIconX(), () -> 52)); + this.setIconY(getIfNull(this.getIconY(), () -> 116)); + this.setAppsLinkIconX(getIfNull(this.getAppsLinkIconX(), () -> 360)); + this.setAppsLinkIconY(getIfNull(this.getAppsLinkIconY(), () -> 116)); + this.setAppId(getIfNull(this.getAppId(), packager::getMainClass)); } } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java b/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java index ba686814..9b5cd112 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java @@ -139,7 +139,8 @@ protected File doApply(Packager packager) throws Exception { // gets JDK release info Map releaseMap = JDKUtils.getRelease(jdkPath); - String releaseInfo = "add:IMAGE_TYPE=\"JRE\":OS_ARCH=\"" + releaseMap.get("OS_ARCH") + "\":OS_NAME=\"" + releaseMap.get("OS_NAME") + "\""; + assert releaseMap != null; + String releaseInfo = "add:IMAGE_TYPE=\"JRE\":OS_ARCH=\"" + releaseMap.get("OS_ARCH") + "\":OS_NAME=\"" + releaseMap.get("OS_NAME") + "\""; // full path to jlink command File jlink = new File(currentJdk, "/bin/jlink"); @@ -222,7 +223,7 @@ protected String getRequiredModules(File packagingJdk, File libsFolder, boolean modulesList = defaultModules .stream() - .map(module -> module.trim()) + .map(String::trim) .collect(Collectors.toList()); } else if (VersionUtils.getJavaMajorVersion() >= 13) { @@ -235,13 +236,14 @@ protected String getRequiredModules(File packagingJdk, File libsFolder, boolean "--ignore-missing-deps", "--print-module-deps", "--add-modules=ALL-MODULE-PATH", - "--module-path=" + StringUtils.join(modulePaths, File.pathSeparator) + "--module-path=" + StringUtils.join(modulePaths, File.pathSeparator), + libsFolder, + jarFile ); modulesList = - Arrays.asList(modules.split(",")) - .stream() - .map(module -> module.trim()) + Arrays.stream(modules.split(",")) + .map(String::trim) .filter(module -> !module.isEmpty()) .collect(Collectors.toList()); @@ -255,13 +257,14 @@ protected String getRequiredModules(File packagingJdk, File libsFolder, boolean "--ignore-missing-deps", "--list-deps", "--add-modules=ALL-MODULE-PATH", - "--module-path=" + StringUtils.join(modulePaths, File.pathSeparator) + "--module-path=" + StringUtils.join(modulePaths, File.pathSeparator), + libsFolder, + jarFile ); modulesList = - Arrays.asList(modules.split("\n")) - .stream() - .map(module -> module.trim()) + Arrays.stream(modules.split("\n")) + .map(String::trim) .map(module -> (module.contains("/") ? module.split("/")[0] : module)) .filter(module -> !module.isEmpty()) .filter(module -> !module.startsWith("JDK removed internal")) diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java index 5450e4b1..f242835d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java @@ -11,9 +11,8 @@ import java.io.IOException; public class GenerateAppImage extends ArtifactGenerator { - - private static final int IMAGETOOL_VERSION = 13; - private static final String IMAGETOOL_URL = "https://github.com/AppImage/AppImageKit/releases/download/" + IMAGETOOL_VERSION + "/appimagetool-%s.AppImage"; + + private static final String IMAGETOOL_URL = "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-%s.AppImage"; public GenerateAppImage() { super("AppImage"); @@ -41,12 +40,13 @@ protected File doApply(LinuxPackager packager) throws Exception { File appFolder = packager.getAppFolder(); File outputFolder = packager.getOutputDirectory(); String name = packager.getName(); + String version = packager.getVersion(); File executable = packager.getExecutable(); File assetsFolder = packager.getAssetsFolder(); File iconFile = packager.getIconFile(); // output AppImage file - File appImage = new File(outputFolder, name + ".AppImage"); + File appImage = new File(outputFolder, name + "_" + version + ".AppImage"); // AppDir folder File appDir = new File(assetsFolder, "AppDir"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java index 373a3ee8..2333452d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java @@ -5,6 +5,7 @@ import java.io.File; import io.github.fvarrui.javapackager.model.Platform; +import io.github.fvarrui.javapackager.utils.CommandUtils; import io.github.fvarrui.javapackager.utils.Logger; import io.github.fvarrui.javapackager.utils.VelocityUtils; import io.github.fvarrui.javapackager.utils.XMLUtils; @@ -32,7 +33,7 @@ public boolean skip(WindowsPackager packager) { return true; } - return false; + return false; } @Override @@ -53,17 +54,23 @@ protected File doApply(WindowsPackager packager) throws Exception { // prettify wxs XMLUtils.prettify(wxsFile); - - // candle wxs file - Logger.info("Compiling file " + wxsFile); - File wixobjFile = new File(assetsFolder, name + ".wixobj"); - execute("candle", "-out", wixobjFile, wxsFile); - Logger.info("WIXOBJ file generated in " + wixobjFile + "!"); - // lighting wxs file - Logger.info("Linking file " + wixobjFile); File msiFile = new File(outputDirectory, name + "_" + version + ".msi"); - execute("light", "-sw1076", "-spdb", "-out", msiFile, wixobjFile); + // We can rely on the MSM generation to populate this + if(packager.getWixMajorVersion() == 3) { + // candle wxs file + Logger.info("Compiling file " + wxsFile); + File wixobjFile = new File(assetsFolder, name + ".wixobj"); + execute("candle", "-arch", "x64", "-out", wixobjFile, wxsFile); + Logger.info("WIXOBJ file generated in " + wixobjFile + "!"); + + // lighting wxs file + Logger.info("Linking file " + wixobjFile); + execute("light", "-sw1076", "-spdb", "-out", msiFile, wixobjFile); + } else { + Logger.info("Building file " + wxsFile); + CommandUtils.execute("wix", "build", "-pdbtype", "none", "-arch", "x64", "-out", msiFile, wxsFile); + } // setup file if (!msiFile.exists()) { diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java index 06b5a97b..d3bf35dd 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java @@ -7,6 +7,7 @@ import io.github.fvarrui.javapackager.utils.Logger; import io.github.fvarrui.javapackager.utils.VelocityUtils; import io.github.fvarrui.javapackager.utils.XMLUtils; +import org.codehaus.plexus.util.cli.CommandLineException; /** * Creates an MSI file including all app folder's content only for Windows so app @@ -40,6 +41,19 @@ protected File doApply(WindowsPackager packager) throws Exception { return packager.getMsmFile(); } + try { + String version = CommandUtils.execute("wix", "-version"); + packager.setWixMajorVersion(Integer.parseInt(version.split("\\.")[0])); + } catch(CommandLineException ex) { + try { + CommandUtils.execute("candle", "-?"); + CommandUtils.execute("light", "-?"); + packager.setWixMajorVersion(3); + } catch(CommandLineException ex2) { + throw new Exception("Either 'wix' or 'candle' and 'light' must be on PATH"); + } + } + File assetsFolder = packager.getAssetsFolder(); String name = packager.getName(); File outputDirectory = packager.getOutputDirectory(); @@ -53,16 +67,21 @@ protected File doApply(WindowsPackager packager) throws Exception { // prettify wxs XMLUtils.prettify(wxsFile); - // candle wxs file - Logger.info("Compiling file " + wxsFile); - File wixobjFile = new File(assetsFolder, name + ".msm.wixobj"); - CommandUtils.execute("candle", "-out", wixobjFile, wxsFile); - Logger.info("WIXOBJ file generated in " + wixobjFile + "!"); - - // lighting wxs file - Logger.info("Linking file " + wixobjFile); File msmFile = new File(outputDirectory, name + "_" + version + ".msm"); - CommandUtils.execute("light", "-sw1076", "-spdb", "-out", msmFile, wixobjFile); + if(packager.getWixMajorVersion() == 3) { + // candle wxs file + Logger.info("Compiling file " + wxsFile); + File wixobjFile = new File(assetsFolder, name + ".msm.wixobj"); + CommandUtils.execute("candle", "-arch", "x64", "-out", wixobjFile, wxsFile); + Logger.info("WIXOBJ file generated in " + wixobjFile + "!"); + + // lighting wxs file + Logger.info("Linking file " + wixobjFile); + CommandUtils.execute("light", "-sw1076", "-spdb", "-out", msmFile, wixobjFile); + } else { + Logger.info("Building file " + wxsFile); + CommandUtils.execute("wix", "build", "-pdbtype", "none", "-arch", "x64", "-out", msmFile, wxsFile); + } // setup file if (!msmFile.exists()) { diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java index e063a645..09af46fa 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java @@ -93,7 +93,7 @@ protected File doApply(LinuxPackager packager) throws Exception { builder.build(outputDirectory); // renames generated RPM file if created - String suffix = "-1." + arch + ".rpm"; + String suffix = "-1." + getRpmArchString(arch) + ".rpm"; File originalRpm = new File(outputDirectory, name + "-" + version + suffix); File rpm = null; if (originalRpm.exists()) { @@ -129,4 +129,10 @@ private void addDirectory(Builder builder, String parentPath, File directory, Li } } + private String getRpmArchString(Architecture arch) { + if (arch == null) return "null"; + + return arch.toString().toLowerCase(); // Without Locale to match the redline_rpm way of handling conversion + } + } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index 05cf90d6..3d50415a 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -230,9 +230,9 @@ private File preparePrecompiledStartupStub() throws Exception { File appStubFile = new File(macOSFolder, "universalJavaApplicationStub"); String universalJavaApplicationStubResource = null; switch (macConfig.getMacStartup()) { - case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break; - case X86_64: universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break; - case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; + case UNIVERSAL: universalJavaApplicationStubResource = "nativeJavaApplicationStub"; break; + case X86_64: universalJavaApplicationStubResource = "nativeJavaApplicationStub.x86_64"; break; + case ARM64: universalJavaApplicationStubResource = "nativeJavaApplicationStub.arm64"; break; case SCRIPT: universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break; } // unixStyleNewLinux=true if startup is a script (this will replace '\r\n' with '\n') diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java index 4d560031..8e310f15 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java @@ -48,6 +48,7 @@ public class PackagerSettings { protected Platform platform; protected String envPath; protected List vmArgs; + protected List appArgs; protected File runnableJar; protected Boolean copyDependencies; protected String jreDirectoryName; @@ -279,6 +280,14 @@ public List getVmArgs() { return vmArgs; } + /** + * Get application args + * @return Application args + */ + public List getAppArgs() { + return appArgs; + } + /** * Get runnable JAR * @return Runnable JAR @@ -685,6 +694,11 @@ public PackagerSettings vmArgs(List vmArgs) { return this; } + public PackagerSettings appArgs(List appArgs) { + this.appArgs = new ArrayList<>(appArgs); + return this; + } + /** * Set runnable JAR * @param runnableJar Runnable JAR @@ -923,12 +937,12 @@ public String toString() { + ", customizedJre=" + customizedJre + ", jrePath=" + jrePath + ", jdkPath=" + jdkPath + ", additionalResources=" + additionalResources + ", modules=" + modules + ", additionalModules=" + additionalModules + ", platform=" + platform + ", envPath=" + envPath + ", vmArgs=" + vmArgs - + ", runnableJar=" + runnableJar + ", copyDependencies=" + copyDependencies + ", jreDirectoryName=" - + jreDirectoryName + ", winConfig=" + winConfig + ", linuxConfig=" + linuxConfig + ", macConfig=" - + macConfig + ", createTarball=" + createTarball + ", tarballName=" + tarballName + ", createZipball=" - + createZipball + ", zipballName=" + zipballName + ", extra=" + extra + ", useResourcesAsWorkingDir=" - + useResourcesAsWorkingDir + ", assetsDir=" + assetsDir + ", classpath=" + classpath - + ", jreMinVersion=" + jreMinVersion + ", manifest=" + manifest + ", additionalModulePaths=" + + ", appArgs=" + appArgs + ",runnableJar=" + runnableJar + ", copyDependencies=" + copyDependencies + + ", jreDirectoryName=" + jreDirectoryName + ", winConfig=" + winConfig + ", linuxConfig=" + linuxConfig + + ", macConfig=" + macConfig + ", createTarball=" + createTarball + ", tarballName=" + tarballName + + ", createZipball=" + createZipball + ", zipballName=" + zipballName + ", extra=" + extra + + ", useResourcesAsWorkingDir=" + useResourcesAsWorkingDir + ", assetsDir=" + assetsDir+ ", classpath=" + + classpath + ", jreMinVersion=" + jreMinVersion + ", manifest=" + manifest + ", additionalModulePaths=" + additionalModulePaths + ", fileAssociations=" + fileAssociations + ", packagingJdk=" + packagingJdk + ", scripts=" + scripts + ", arch=" + arch + ", templates=" + templates + "]"; } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java index 54241040..da8e85ea 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java @@ -19,6 +19,7 @@ public class WindowsPackager extends Packager { private File manifestFile; private File msmFile; + private int wixMajorVersion; public File getManifestFile() { return manifestFile; @@ -28,9 +29,17 @@ public File getMsmFile() { return msmFile; } + public int getWixMajorVersion() { + return wixMajorVersion; + } + public void setMsmFile(File msmFile) { this.msmFile = msmFile; } + + public void setWixMajorVersion(int wixMajorVersion) { + this.wixMajorVersion = wixMajorVersion; + } public WindowsPackager() { super(); diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/CommandUtils.java b/src/main/java/io/github/fvarrui/javapackager/utils/CommandUtils.java index 9d6b3931..9ffde958 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/CommandUtils.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/CommandUtils.java @@ -37,15 +37,14 @@ public static String execute(String executable, List arguments) throws I public static ExecutionResult executeWithResult(File workingDirectory, String executable, Object... arguments) throws IOException, CommandLineException { ExecutionResult result = new ExecutionResult(); - StringBuffer outputBuffer = new StringBuffer(); - StringBuffer errorBuffer = new StringBuffer(); + StringBuilder outputBuffer = new StringBuilder(); + StringBuilder errorBuffer = new StringBuilder(); Commandline command = new Commandline(); command.setWorkingDirectory(workingDirectory); command.setExecutable(executable); command.createArguments(arguments); - command.toString(); - + String commandLine = command.getCommandLineAsString(); Logger.info("Executing command: " + commandLine); @@ -58,12 +57,12 @@ public static ExecutionResult executeWithResult(File workingDirectory, String ex if (output.ready()) { String outputLine = output.readLine(); Logger.info(outputLine); - outputBuffer.append(outputLine + "\n"); + outputBuffer.append(outputLine).append("\n"); } if (error.ready()) { String errorLine = error.readLine(); Logger.error(errorLine); - errorBuffer.append(errorLine + "\n"); + errorBuffer.append(errorLine).append("\n"); } } output.close(); diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/Commandline.java b/src/main/java/io/github/fvarrui/javapackager/utils/Commandline.java index c275fdd1..abf2a7e0 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/Commandline.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/Commandline.java @@ -1,6 +1,7 @@ package io.github.fvarrui.javapackager.utils; import java.io.File; +import java.util.Collection; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; @@ -28,12 +29,20 @@ public void createArguments(Object... arguments) { if (argument == null) continue; - + + // expands collections + if (argument instanceof Collection) { + createArguments(((Collection) argument).toArray(new Object[0])); + continue; + } + + // expands array if (argument.getClass().isArray()) { - createArguments((Object[])argument); + createArguments((Object[])argument); continue; } - + + // process file argument if (argument instanceof File) { File argFile = (File) argument; diff --git a/src/main/resources/linux/startup.sh.vtl b/src/main/resources/linux/startup.sh.vtl index f6cb133f..2f583ad6 100644 --- a/src/main/resources/linux/startup.sh.vtl +++ b/src/main/resources/linux/startup.sh.vtl @@ -1,4 +1,3 @@ -#set ($vmArgs = $StringUtils.join($info.vmArgs, " ")) #!/usr/bin/env bash # GNU/Linux startup script generated by JavaPackager plugin @@ -11,7 +10,7 @@ function showMessage() { if type -p notify-send; then notify-send -u critical "${info.name}" "$1" else - echo $1 + echo "$1" fi } if type -p java > /dev/null; then @@ -45,8 +44,7 @@ function compareVersions() { return 0 } JAVA_VERSION=$("$JAVA" -version 2>&1 | awk -F '"' '/version/ {print $2}') -compareVersions "$JAVA_VERSION" "${info.jreMinVersion}" -if [[ $? != 0 ]]; then +if ! compareVersions "$JAVA_VERSION" "${info.jreMinVersion}"; then showMessage "The application requires a Java Runtime Environment ${info.jreMinVersion} or higher." exit 1 fi @@ -63,17 +61,26 @@ BINARY="$SCRIPTPATH/${info.jarFile.name}" export PATH=${info.envPath} #end -JVMDefaultOptions="${vmArgs}" +JVMDefaultOptions=() +#foreach ($vmArg in $info.vmArgs) +JVMDefaultOptions+=("$vmArg") +#end + JVMOptionsFile="$SCRIPTPATH/${info.name}.l4j.ini" -[ -f "${JVMOptionsFile}" ] && while read -r option; do JVMDefaultOptions+=" $option"; done <<< $(sed "/^#.*$/d" "${JVMOptionsFile}") +[ -f "${JVMOptionsFile}" ] && while read -r -a option; do JVMDefaultOptions+=("${option[@]}"); done <<< "$(sed -e "/^#.*$/d" -e "/^[[:space:]]*$/d" "${JVMOptionsFile}")" JVMClassPath="$BINARY" #foreach ($classpath in $info.classpaths) JVMClassPath+=":${classpath}" #end +AppArguments=() +#foreach ($appArg in $info.appArgs) +AppArguments+=("appArg") +#end + #if ($info.useResourcesAsWorkingDir) -cd "$SCRIPTPATH" +cd "$SCRIPTPATH" || exit 1 #end #if ($info.scripts.bootstrap) @@ -82,8 +89,8 @@ Bootstrap="$SCRIPTPATH/scripts/${info.bootstrapFile.name}" && [ -x "$Bootstrap" #end #if ($info.administratorRequired) -pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY GDKBACKEND=x11 "${JAVA}" ${JVMDefaultOptions} -jar "${JVMClassPath}" $@ +pkexec env DISPLAY="$DISPLAY" XAUTHORITY="$XAUTHORITY" GDKBACKEND=x11 "${JAVA}" "${JVMDefaultOptions[@]}" -jar "${JVMClassPath}" "${AppArguments[@]}" "$@" #else -"${JAVA}" ${JVMDefaultOptions} -jar "${JVMClassPath}" $@ +"${JAVA}" "${JVMDefaultOptions[@]}" -jar "${JVMClassPath}" "${AppArguments[@]}" "$@" #end exit 0 diff --git a/src/main/resources/mac/Info.plist.vtl b/src/main/resources/mac/Info.plist.vtl index 31ca5905..b98e668c 100644 --- a/src/main/resources/mac/Info.plist.vtl +++ b/src/main/resources/mac/Info.plist.vtl @@ -124,6 +124,14 @@ #end +#if ($info.appArgs) + Arguments + +#foreach ($appArg in $info.appArgs) + $appArg +#end + +#end LSEnvironment #if ($info.bundleJre) diff --git a/src/main/resources/mac/nativeJavaApplicationStub b/src/main/resources/mac/nativeJavaApplicationStub new file mode 100644 index 00000000..d57a88b4 Binary files /dev/null and b/src/main/resources/mac/nativeJavaApplicationStub differ diff --git a/src/main/resources/mac/nativeJavaApplicationStub.arm64 b/src/main/resources/mac/nativeJavaApplicationStub.arm64 new file mode 100644 index 00000000..38d89d11 Binary files /dev/null and b/src/main/resources/mac/nativeJavaApplicationStub.arm64 differ diff --git a/src/main/resources/mac/nativeJavaApplicationStub.x86_64 b/src/main/resources/mac/nativeJavaApplicationStub.x86_64 new file mode 100644 index 00000000..d304d589 Binary files /dev/null and b/src/main/resources/mac/nativeJavaApplicationStub.x86_64 differ diff --git a/src/main/resources/mac/universalJavaApplicationStub b/src/main/resources/mac/universalJavaApplicationStub deleted file mode 100644 index 7c03384a..00000000 Binary files a/src/main/resources/mac/universalJavaApplicationStub and /dev/null differ diff --git a/src/main/resources/mac/universalJavaApplicationStub.arm64 b/src/main/resources/mac/universalJavaApplicationStub.arm64 deleted file mode 100644 index f495c358..00000000 Binary files a/src/main/resources/mac/universalJavaApplicationStub.arm64 and /dev/null differ diff --git a/src/main/resources/mac/universalJavaApplicationStub.x86_64 b/src/main/resources/mac/universalJavaApplicationStub.x86_64 deleted file mode 100644 index 353b2b67..00000000 Binary files a/src/main/resources/mac/universalJavaApplicationStub.x86_64 and /dev/null differ diff --git a/src/main/resources/windows/msm.wxs.vtl b/src/main/resources/windows/msm.wxs.vtl index bcace9f8..2006819b 100644 --- a/src/main/resources/windows/msm.wxs.vtl +++ b/src/main/resources/windows/msm.wxs.vtl @@ -19,7 +19,7 @@ #end #else - + #if($file.equals(${info.executable})) @@ -32,15 +32,26 @@ #end #end +#if($info.wixMajorVersion == 3) - - +#end + + 3) + Guid="${GUID.randomUUID()}" InstallerVersion="${installedVersion}" + #end + > + #if($info.wixMajorVersion == 3) + #end + + #if($info.wixMajorVersion == 3) + #end #list(${info.appFolder}) - + #if($info.wixMajorVersion == 3)#end #if ($info.winConfig.registry) - + 3)Directory="TARGETDIR"#end> #foreach ($entry in $info.winConfig.registry.entries) #end + #if($info.wixMajorVersion == 3) + #end \ No newline at end of file diff --git a/src/main/resources/windows/wxs.vtl b/src/main/resources/windows/wxs.vtl index af93e34a..958379f5 100644 --- a/src/main/resources/windows/wxs.vtl +++ b/src/main/resources/windows/wxs.vtl @@ -1,15 +1,26 @@ #set($moduleName = $info.name.replaceAll("[^A-Za-z0-9_.]", "_") + "_Module") +#if($info.wixMajorVersion == 3) - +#end + + #if($info.wixMajorVersion > 3) + + + #else - + + #end + #if($info.wixMajorVersion == 3) - + #end + <#if($info.wixMajorVersion > 3)StandardDirectory#{else}Directory#end Id="ProgramFiles64Folder"> - + 3)StandardDirectory#{else}Directory#end> + #if($info.wixMajorVersion == 3) - + #end + 3)AllowAbsent="no"#{else}Absent="disallow"#end AllowAdvertise="no" ConfigurableDirectory="TARGETDIR" Description="${info.description}" Level="1" Title="${info.displayName}"> @@ -18,5 +29,5 @@ #end - + 3)Package#{else}Product#end>