diff --git a/build.gradle b/build.gradle index 454b9f65..9e2b7dcc 100644 --- a/build.gradle +++ b/build.gradle @@ -64,7 +64,7 @@ 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 diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java index f999376e..7499ba11 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.stream.Collectors; +import io.github.fvarrui.javapackager.model.SingleInstance; import net.jsign.WindowsSigner; import org.apache.commons.lang3.StringUtils; import org.twdata.maven.mojoexecutor.MojoExecutor.Element; @@ -89,6 +90,17 @@ protected File doApply(WindowsPackager packager) throws Exception { element("addDependencies", "false") ) ); + + SingleInstance singleInstance = winConfig.getSingleInstance(); + if(singleInstance != null){ + pluginConfig.add( + element("singleInstance", + element("mutexName", singleInstance.getMutexName()), + element("windowTitle", singleInstance.getWindowTitle()) + ) + ); + } + pluginConfig.add(element("chdir", useResourcesAsWorkingDir ? "." : "")); pluginConfig.add(element("jre", jreElements.toArray(new Element[0]))); pluginConfig.add( diff --git a/src/main/java/io/github/fvarrui/javapackager/model/SingleInstance.java b/src/main/java/io/github/fvarrui/javapackager/model/SingleInstance.java new file mode 100644 index 00000000..e4f1d57e --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/model/SingleInstance.java @@ -0,0 +1,24 @@ +package io.github.fvarrui.javapackager.model; + +public class SingleInstance { + private String mutexName; + private String windowTitle; + + public String getMutexName() { + return mutexName; + } + + public SingleInstance setMutexName(String mutexName) { + this.mutexName = mutexName; + return this; + } + + public String getWindowTitle() { + return windowTitle; + } + + public SingleInstance setWindowTitle(String windowTitle) { + this.windowTitle = windowTitle; + return this; + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java index cdf040cd..ea4f54b7 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java @@ -51,7 +51,18 @@ public class WindowsConfig implements Serializable { private boolean removeOldLibs = false; private WindowsExeCreationTool exeCreationTool = WindowsExeCreationTool.launch4j; private String vmLocation; - + + private SingleInstance singleInstance; + + public SingleInstance getSingleInstance() { + return singleInstance; + } + + public WindowsConfig setSingleInstance(SingleInstance singleInstance) { + this.singleInstance = singleInstance; + return this; + } + public File getIcoFile() { return icoFile; } 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/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;