From 87f080b8c7d4021469150a82043819c3d46ff182 Mon Sep 17 00:00:00 2001 From: Abhinay Agarwal Date: Wed, 7 Oct 2020 18:45:23 +0530 Subject: [PATCH 1/2] Add `jlinkOptions` configuration --- README.md | 1 + src/main/java/org/openjfx/JavaFXBaseMojo.java | 37 +++++++++++++++ .../java/org/openjfx/JavaFXJLinkMojo.java | 23 ++++++++-- src/main/java/org/openjfx/JavaFXRunMojo.java | 36 --------------- .../java/org/openjfx/JavaFXBaseMojoTest.java | 46 +++++++++++++++++++ 5 files changed, 104 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 47e71b5..b96e681 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ The same command line options for `jlink` can be set: - `bindServices`: Adds the option to bind services. Values: false (default) or true - `ignoreSigningInformation`: Adds the option to ignore signing information. Values: false (default) or true - `jlinkVerbose`: Adds the verbose option. Values: false (default) or true +- `jlinkOptions`: A list of options passed to the jlink executable. - `launcher`: Adds a launcher script with the given name. - If `options` are defined, these will be passed to the launcher script as vm options. - If `commandLineArgs` are defined, these will be passed to the launcher script as command line arguments. diff --git a/src/main/java/org/openjfx/JavaFXBaseMojo.java b/src/main/java/org/openjfx/JavaFXBaseMojo.java index e3adb11..1fc1955 100644 --- a/src/main/java/org/openjfx/JavaFXBaseMojo.java +++ b/src/main/java/org/openjfx/JavaFXBaseMojo.java @@ -62,6 +62,7 @@ import java.util.Map; import java.util.Objects; import java.util.Properties; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -456,6 +457,42 @@ String createMainClassString(String mainClass, JavaModuleDescriptor moduleDescri return mainClass; } + List splitComplexArgumentString(String argumentString) { + char[] strArr = argumentString.trim().toCharArray(); + + List splitedArgs = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + + char expectedSeparator = ' '; + for (int i = 0; i < strArr.length; i++) { + char item = strArr[i]; + + if (item == expectedSeparator + || (expectedSeparator == ' ' && Pattern.matches("\\s", String.valueOf(item))) ) { + + if (expectedSeparator == '"' || expectedSeparator == '\'') { + sb.append(item); + expectedSeparator = ' '; + } else if (expectedSeparator == ' ' && sb.length() > 0) { + splitedArgs.add(sb.toString()); + sb.delete(0, sb.length()); + } + } else { + if (expectedSeparator == ' ' && (item == '"' || item == '\'')) { + expectedSeparator = item; + } + + sb.append(item); + } + + if (i == strArr.length - 1 && sb.length() > 0) { + splitedArgs.add(sb.toString()); + } + } + + return splitedArgs; + } + private static String findExecutable(final String executable, final List paths) { File f = null; search: for (final String path : paths) { diff --git a/src/main/java/org/openjfx/JavaFXJLinkMojo.java b/src/main/java/org/openjfx/JavaFXJLinkMojo.java index 5eb7587..ec917d8 100644 --- a/src/main/java/org/openjfx/JavaFXJLinkMojo.java +++ b/src/main/java/org/openjfx/JavaFXJLinkMojo.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Gluon + * Copyright 2019, 2020, Gluon * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -151,6 +152,12 @@ public class JavaFXJLinkMojo extends JavaFXBaseMojo { @Component(role = Archiver.class, hint = "zip") private ZipArchiver zipArchiver; + /** + * A list of options passed to the jlink {@code executable}. + */ + @Parameter + List jlinkOptions; + public void execute() throws MojoExecutionException { if (skip) { getLog().info( "skipping execute as per configuration" ); @@ -166,7 +173,7 @@ public void execute() throws MojoExecutionException { } handleWorkingDirectory(); - + Map enviro = handleSystemEnvVariables(); CommandLine commandLine = getExecutablePath(jlinkExecutable, enviro, workingDirectory); @@ -182,7 +189,6 @@ public void execute() throws MojoExecutionException { } try { - List commandArguments = createCommandArguments(); String[] args = commandArguments.toArray(new String[commandArguments.size()]); commandLine.addArguments(args, false); @@ -290,6 +296,17 @@ private void patchLauncherScript(String launcherFilename) throws IOException { private List createCommandArguments() throws MojoExecutionException, MojoFailureException { List commandArguments = new ArrayList<>(); preparePaths(getParent(Paths.get(jlinkExecutable), 2)); + + if (jlinkOptions != null) { + jlinkOptions.stream() + .filter(Objects::nonNull) + .filter(String.class::isInstance) + .map(String.class::cast) + .map(this::splitComplexArgumentString) + .flatMap(Collection::stream) + .forEach(commandArguments::add); + } + if (modulepathElements != null && !modulepathElements.isEmpty()) { commandArguments.add(" --module-path"); String modulePath = StringUtils.join(modulepathElements.iterator(), File.pathSeparator); diff --git a/src/main/java/org/openjfx/JavaFXRunMojo.java b/src/main/java/org/openjfx/JavaFXRunMojo.java index 5db548f..b36fe3c 100644 --- a/src/main/java/org/openjfx/JavaFXRunMojo.java +++ b/src/main/java/org/openjfx/JavaFXRunMojo.java @@ -181,42 +181,6 @@ private String createAddModulesString(JavaModuleDescriptor moduleDescriptor, Map return moduleDescriptor.name(); } - private List splitComplexArgumentString(String argumentString) { - char[] strArr = argumentString.trim().toCharArray(); - - List splitedArgs = new ArrayList<>(); - StringBuilder sb = new StringBuilder(); - - char expectedSeparator = ' '; - for (int i = 0; i < strArr.length; i++) { - char item = strArr[i]; - - if (item == expectedSeparator - || (expectedSeparator == ' ' && Pattern.matches("\\s", String.valueOf(item))) ) { - - if (expectedSeparator == '"' || expectedSeparator == '\'') { - sb.append(item); - expectedSeparator = ' '; - } else if (expectedSeparator == ' ' && sb.length() > 0) { - splitedArgs.add(sb.toString()); - sb.delete(0, sb.length()); - } - } else { - if (expectedSeparator == ' ' && (item == '"' || item == '\'')) { - expectedSeparator = item; - } - - sb.append(item); - } - - if (i == strArr.length - 1 && sb.length() > 0) { - splitedArgs.add(sb.toString()); - } - } - - return splitedArgs; - } - // for tests void setExecutable(String executable) { diff --git a/src/test/java/org/openjfx/JavaFXBaseMojoTest.java b/src/test/java/org/openjfx/JavaFXBaseMojoTest.java index 057d4e4..85d8400 100644 --- a/src/test/java/org/openjfx/JavaFXBaseMojoTest.java +++ b/src/test/java/org/openjfx/JavaFXBaseMojoTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2019, 2020, Gluon + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.openjfx; import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor; @@ -97,6 +112,37 @@ public void invalidPathWithDepthTest() { Assert.assertNull(JavaFXBaseMojo.getParent(Paths.get("/some-invalid-path"), 2)); } + @Test + public void testSplitComplexArgumentString() { + String option = "param1 " + + "param2 \n " + + "param3\n" + + "param4=\"/path/to/my file.log\" " + + "'var\"foo var\"foo' " + + "'var\"foo' " + + "'var\"foo' " + + "\"foo'var foo'var\" " + + "\"foo'var\" " + + "\"foo'var\""; + + String expected = "START," + + "param1," + + "param2," + + "param3," + + "param4=\"/path/to/my file.log\"," + + "'var\"foo var\"foo'," + + "'var\"foo'," + + "'var\"foo'," + + "\"foo'var foo'var\"," + + "\"foo'var\"," + + "\"foo'var\""; + + String splitedOption = new JavaFXRunMojo().splitComplexArgumentStringAdapter(option) + .stream().reduce("START", (s1, s2) -> s1 + "," + s2); + + Assert.assertEquals(expected, splitedOption); + } + @AfterClass public static void destroy() throws IOException { Files.walk(path.getParent()) From e400596dd59e28f55949325c8b2d3f81f664009a Mon Sep 17 00:00:00 2001 From: Abhinay Agarwal Date: Sun, 18 Oct 2020 05:08:36 +0530 Subject: [PATCH 2/2] Use JavaFXBaseMojo#splitComplexArgumentString --- src/main/java/org/openjfx/JavaFXRunMojo.java | 4 --- .../java/org/openjfx/JavaFXBaseMojoTest.java | 4 +-- .../org/openjfx/JavaFXRunMojoTestCase.java | 31 ------------------- 3 files changed, 2 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/openjfx/JavaFXRunMojo.java b/src/main/java/org/openjfx/JavaFXRunMojo.java index b36fe3c..c303f46 100644 --- a/src/main/java/org/openjfx/JavaFXRunMojo.java +++ b/src/main/java/org/openjfx/JavaFXRunMojo.java @@ -194,8 +194,4 @@ void setBasedir(File basedir) { void setCommandlineArgs(String commandlineArgs) { this.commandlineArgs = commandlineArgs; } - - List splitComplexArgumentStringAdapter(String cliOptions) { - return splitComplexArgumentString(cliOptions); - } } diff --git a/src/test/java/org/openjfx/JavaFXBaseMojoTest.java b/src/test/java/org/openjfx/JavaFXBaseMojoTest.java index 85d8400..2d51552 100644 --- a/src/test/java/org/openjfx/JavaFXBaseMojoTest.java +++ b/src/test/java/org/openjfx/JavaFXBaseMojoTest.java @@ -137,10 +137,10 @@ public void testSplitComplexArgumentString() { "\"foo'var\"," + "\"foo'var\""; - String splitedOption = new JavaFXRunMojo().splitComplexArgumentStringAdapter(option) + String splitOption = mojo.splitComplexArgumentString(option) .stream().reduce("START", (s1, s2) -> s1 + "," + s2); - Assert.assertEquals(expected, splitedOption); + Assert.assertEquals(expected, splitOption); } @AfterClass diff --git a/src/test/java/org/openjfx/JavaFXRunMojoTestCase.java b/src/test/java/org/openjfx/JavaFXRunMojoTestCase.java index e643fce..8c18a8e 100644 --- a/src/test/java/org/openjfx/JavaFXRunMojoTestCase.java +++ b/src/test/java/org/openjfx/JavaFXRunMojoTestCase.java @@ -231,35 +231,4 @@ private String getCommandLineAsString(CommandLine commandline) { } return result; } - - @Test - public void testSplitComplexArgumentString() { - String option = "param1 " + - "param2 \n " + - "param3\n" + - "param4=\"/path/to/my file.log\" " + - "'var\"foo var\"foo' " + - "'var\"foo' " + - "'var\"foo' " + - "\"foo'var foo'var\" " + - "\"foo'var\" " + - "\"foo'var\""; - - String expected = "START," + - "param1," + - "param2," + - "param3," + - "param4=\"/path/to/my file.log\"," + - "'var\"foo var\"foo'," + - "'var\"foo'," + - "'var\"foo'," + - "\"foo'var foo'var\"," + - "\"foo'var\"," + - "\"foo'var\""; - - String splitedOption = new JavaFXRunMojo().splitComplexArgumentStringAdapter(option) - .stream().reduce("START", (s1, s2) -> s1 + "," + s2); - - Assert.assertEquals(expected, splitedOption); - } }