2
0
Fork 0
mirror of https://github.com/ethauvin/bld.git synced 2025-04-25 08:17:11 -07:00

Merge pull request #47 from ethauvin/main

Added JlinkOptions, JmodOptions and JpackageOptions File argument alt…
This commit is contained in:
Geert Bevin 2024-08-25 22:27:23 -04:00 committed by GitHub
commit 22add235e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 1211 additions and 65 deletions

22
.idea/misc.xml generated
View file

@ -1,4 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0">
<entry_point TYPE="field" FQNAME="rife.bld.operations.JpackageOptions.PackageType APP_IMAGE" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JpackageOptions.PackageType DMG" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JpackageOptions.PackageType MSI" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JpackageOptions.PackageType PKG" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JpackageOptions.PackageType RPM" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JlinkOptions.CompressionLevel CONSTANT_STRING_SHARING" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JlinkOptions.CompressionLevel NO_COMPRESSION" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JlinkOptions.Endian LITTLE" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JmodOperation.OperationMode EXTRACT" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JmodOperation.OperationMode HASH" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JmodOptions.ResolvedReason DEPRECATED_FOR_REMOVAL" />
<entry_point TYPE="field" FQNAME="rife.bld.operations.JmodOptions.ResolvedReason INCUBATING" />
</entry_points>
<pattern value="rife.bld.operations.JpackageOptions.PackageType" />
<pattern value="rife.bld.operations.JlinkOptions.CompressionLevel" />
<pattern value="rife.bld.operations.JlinkOptions.Endian" />
<pattern value="rife.bld.operations.JmodOperation.OperationMode" />
<pattern value="rife.bld.operations.JmodOptions.ResolvedReason" />
</component>
<component name="PDMPlugin">
<option name="skipTestSources" value="false" />
</component>

View file

@ -4,7 +4,10 @@
*/
package rife.bld.operations;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -23,7 +26,6 @@ public class JlinkOperation extends AbstractToolProviderOperation<JlinkOperation
super("jlink");
}
/**
* Read options and/or mode from file(s).
*
@ -35,6 +37,28 @@ public class JlinkOperation extends AbstractToolProviderOperation<JlinkOperation
return this;
}
/**
* Read options and/or mode from file(s).
*
* @param file one or more file
* @return this operation instance
*/
public JlinkOperation cmdFiles(File... file) {
cmdFiles_.addAll(Arrays.stream(file).map(File::getAbsolutePath).toList());
return this;
}
/**
* Read options and/or mode from file(s).
*
* @param file one or more file
* @return this operation instance
*/
public JlinkOperation cmdFiles(Path... file) {
cmdFiles_.addAll(Arrays.stream(file).map(Path::toFile).map(File::getAbsolutePath).toList());
return this;
}
/**
* Retrieves the list of files containing options or mode.
*

View file

@ -4,6 +4,8 @@
*/
package rife.bld.operations;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -161,6 +163,34 @@ public class JlinkOptions extends HashMap<String, String> {
return this;
}
/**
* Module path.
* <p>
* If not specified, the JDKs jmods directory will be used, if it exists. If specified, but it does not contain the
* java.base module, the JDKs jmods directory will be added, if it exists.
*
* @param path the module path
* @return this map of options
*/
public JlinkOptions modulePath(File path) {
put("--module-path", path.getAbsolutePath());
return this;
}
/**
* Module path.
* <p>
* If not specified, the JDKs jmods directory will be used, if it exists. If specified, but it does not contain the
* java.base module, the JDKs jmods directory will be added, if it exists.
*
* @param path the module path
* @return this map of options
*/
public JlinkOptions modulePath(Path path) {
put("--module-path", path.toFile().getAbsolutePath());
return this;
}
/**
* Exclude include header files.
*
@ -202,6 +232,28 @@ public class JlinkOptions extends HashMap<String, String> {
return this;
}
/**
* Location of output path.
*
* @param path the output path
* @return this map of options
*/
public JlinkOptions output(File path) {
put("--output", path.getAbsolutePath());
return this;
}
/**
* Location of output path.
*
* @param path the output path
* @return this map of options
*/
public JlinkOptions output(Path path) {
put("--output", path.toFile().getAbsolutePath());
return this;
}
/**
* Associates {@code null} with the specified key in this map. If the map previously contained a mapping for the
* key, the old value is replaced.

View file

@ -4,7 +4,10 @@
*/
package rife.bld.operations;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -44,6 +47,28 @@ public class JmodOperation extends AbstractToolProviderOperation<JmodOperation>
return this;
}
/**
* Read options and/or mode from file(s).
*
* @param file one or more file
* @return this operation instance
*/
public JmodOperation cmdFiles(File... file) {
cmdFiles.addAll(Arrays.stream(file).map(File::getAbsolutePath).toList());
return this;
}
/**
* Read options and/or mode from file(s).
*
* @param file one or more file
* @return this operation instance
*/
public JmodOperation cmdFiles(Path... file) {
cmdFiles.addAll(Arrays.stream(file).map(Path::toFile).map(File::getAbsolutePath).toList());
return this;
}
@Override
public void execute() throws Exception {
if (operationMode_ != null) {
@ -82,6 +107,32 @@ public class JmodOperation extends AbstractToolProviderOperation<JmodOperation>
return this;
}
/**
* Specifies name of the JMOD file to create or from which to retrieve information.
* <p>
* The JMOD file is <b>required</b>.
*
* @param file the JMOD file
* @return this operation instance
*/
public JmodOperation jmodFile(File file) {
jmodFile_ = file.getAbsolutePath();
return this;
}
/**
* Specifies name of the JMOD file to create or from which to retrieve information.
* <p>
* The JMOD file is <b>required</b>.
*
* @param file the JMOD file
* @return this operation instance
*/
public JmodOperation jmodFile(Path file) {
jmodFile_ = file.toFile().getAbsolutePath();
return this;
}
/**
* Retrieves the list of options for the jmod tool.
* <p>

View file

@ -4,6 +4,8 @@
*/
package rife.bld.operations;
import java.io.File;
import java.nio.file.Path;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
@ -39,6 +41,29 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Location of native commands.
*
* @param path the location
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JmodOptions cmds(File path) {
put("--cmds", path.getAbsolutePath());
return this;
}
/**
* Location of native commands.
*
* @param path the location
* @return this map of options
*/
public JmodOptions cmds(Path path) {
put("--cmds", path.toFile().getAbsolutePath());
return this;
}
/**
* Compression to use when creating the JMOD archive.
* <p>
@ -52,6 +77,7 @@ public class JmodOptions extends HashMap<String, String> {
* @param compression the {@link ZipCompression compression} level
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JmodOptions compress(ZipCompression compression) {
put("--compress", compression.level);
return this;
@ -68,6 +94,28 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Location of user-editable config files
*
* @param path the path to the config files
* @return this map of options
*/
public JmodOptions config(File path) {
put("--config", path.getAbsolutePath());
return this;
}
/**
* Location of user-editable config files
*
* @param path the path to the config files
* @return this map of options
*/
public JmodOptions config(Path path) {
put("--config", path.toFile().getAbsolutePath());
return this;
}
/**
* Date and time for the timestamps of entries.
*
@ -90,6 +138,28 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Target directory for extract
*
* @param path the directory path
* @return this map of options
*/
public JmodOptions dir(File path) {
put("--dir", path.getAbsolutePath());
return this;
}
/**
* Target directory for extract
*
* @param path the directory path
* @return this map of options
*/
public JmodOptions dir(Path path) {
put("--dir", path.toFile().getAbsolutePath());
return this;
}
/**
* Exclude from the default root set of modules.
*
@ -163,6 +233,29 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Location of header files.
*
* @param path the location
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JmodOptions headerFiles(File path) {
put("--header-files", path.getAbsolutePath());
return this;
}
/**
* Location of header files.
*
* @param path the location
* @return this map of options
*/
public JmodOptions headerFiles(Path path) {
put("--header-files", path.toFile().getAbsolutePath());
return this;
}
/**
* Location of legal notices.
*
@ -174,6 +267,29 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Location of legal notices.
*
* @param path the location
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JmodOptions legalNotices(File path) {
put("--legal-notices", path.getAbsolutePath());
return this;
}
/**
* Location of legal notices.
*
* @param path the location
* @return this map of options
*/
public JmodOptions legalNotices(Path path) {
put("--legal-notices", path.toFile().getAbsolutePath());
return this;
}
/**
* Location of native libraries.
*
@ -185,6 +301,29 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Location of native libraries.
*
* @param path the location
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JmodOptions libs(File path) {
put("--libs", path.getAbsolutePath());
return this;
}
/**
* Location of native libraries.
*
* @param path the location
* @return this map of options
*/
public JmodOptions libs(Path path) {
put("--libs", path.toFile().getAbsolutePath());
return this;
}
/**
* Main class.
*
@ -207,6 +346,29 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Location of man pages.
*
* @param path the location
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JmodOptions manPages(File path) {
put("--man-pages", path.getAbsolutePath());
return this;
}
/**
* Location of man pages.
*
* @param path the location
* @return this map of options
*/
public JmodOptions manPages(Path path) {
put("--man-pages", path.toFile().getAbsolutePath());
return this;
}
/**
* Module path.
*
@ -218,6 +380,28 @@ public class JmodOptions extends HashMap<String, String> {
return this;
}
/**
* Module path.
*
* @param path the module path
* @return this map of options
*/
public JmodOptions modulePath(File path) {
put("--module-path", path.getAbsolutePath());
return this;
}
/**
* Module path.
*
* @param path the module path
* @return this map of options
*/
public JmodOptions modulePath(Path path) {
put("--module-path", path.toFile().getAbsolutePath());
return this;
}
/**
* Module version.
*

View file

@ -4,7 +4,10 @@
*/
package rife.bld.operations;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -17,25 +20,48 @@ import java.util.Map;
public class JpackageOperation extends AbstractToolProviderOperation<JpackageOperation> {
private final List<String> cmdFiles_ = new ArrayList<>();
private final JpackageOptions jpackageOptions_ = new JpackageOptions();
private final List<Launcher> launchers_ = new ArrayList<>();
public JpackageOperation() {
super("jpackage");
}
@Override
public void execute() throws Exception {
toolArgs(cmdFiles_.stream().map(opt -> '@' + opt).toList());
toolArgs(jpackageOptions_);
super.execute();
/**
* List of application launchers.
* <p>
* The main application launcher will be built from the command line options.
* <p>
* Additional alternative launchers can be built using this option, and this option can be used to build multiple
* additional launchers.
*
* @param launcher one or more {@link JpackageOperation.Launcher}
* @return this operation instance
*/
public JpackageOperation addLauncher(Launcher... launcher) {
launchers_.addAll(Arrays.asList(launcher));
return this;
}
/**
* Retrieves the list of files containing options or mode.
* Read options and/or mode from file(s).
*
* @return the list of files
* @param file one or more file
* @return this operation instance
*/
public List<String> fileOptions() {
return cmdFiles_;
public JpackageOperation cmdFiles(File... file) {
cmdFiles_.addAll(Arrays.stream(file).map(File::getAbsolutePath).toList());
return this;
}
/**
* Read options and/or mode from file(s).
*
* @param file one or more file
* @return this operation instance
*/
public JpackageOperation cmdFiles(Path... file) {
cmdFiles_.addAll(Arrays.stream(file).map(Path::toFile).map(File::getAbsolutePath).toList());
return this;
}
/**
@ -49,6 +75,25 @@ public class JpackageOperation extends AbstractToolProviderOperation<JpackageOpe
return this;
}
/**
* Retrieves the list of files containing options or mode.
*
* @return the list of files
*/
public List<String> cmdFiles() {
return cmdFiles_;
}
@Override
public void execute() throws Exception {
toolArgs(cmdFiles_.stream().map(opt -> '@' + opt).toList());
for (var l : launchers_) {
toolArgs("--add-launcher", l.name + '=' + l.path);
}
toolArgs(jpackageOptions_);
super.execute();
}
/**
* Retrieves the list of options for the jpackage tool.
* <p>
@ -72,4 +117,37 @@ public class JpackageOperation extends AbstractToolProviderOperation<JpackageOpe
jpackageOptions_.putAll(options);
return this;
}
/**
* Retrieves the list of application launchers.
*
* @return the list of launchers
*/
public List<Launcher> launchers() {
return launchers_;
}
/**
* Name of launcher, and a path to a Properties file that contains a list of key, value pairs.
* <p>
* The keys {@code module}, {@code main-jar}, {@code main-class}, {@code description},
* {@code arguments}, {@code java-options}, {@code app-version}, {@code icon},
* {@code launcher-as-service}, {@code win-console}, {@code win-shortcut}, {@code win-menu},
* {@code linux-app-category}, and {@code linux-shortcut} can be used.
* <p>
* These options are added to, or used to overwrite, the original command line options to build an additional
* alternative launcher.
*
* @param name the name
* @param path absolute path or relative to the current directory
*/
public record Launcher(String name, String path) {
public Launcher(String name, File path) {
this(name, path.getAbsolutePath());
}
public Launcher(String name, Path path) {
this(name, path.toFile().getAbsolutePath());
}
}
}

View file

@ -4,6 +4,9 @@
*/
package rife.bld.operations;
import java.io.File;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.HashMap;
/**
@ -24,24 +27,6 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* List of application launchers.
* <p>
* The main application launcher will be built from the command line options.
* <p>
* Additional alternative launchers can be built using this option, and this option can be used to build multiple
* additional launchers.
*
* @param launcher one or more {@link Launcher}
* @return this map of options
*/
public JpackageOptions addLauncher(Launcher... launcher) {
for (var l : launcher) {
put("--add-launcher", l.name + '=' + l.path);
}
return this;
}
/**
* List of modules to add.
* <p>
@ -82,6 +67,29 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Location of the predefined application image that is used to build an installable package.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions appImage(File path) {
put("--app-image", path.getAbsolutePath());
return this;
}
/**
* Location of the predefined application image that is used to build an installable package.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions appImage(Path path) {
put("--app-image", path.toFile().getAbsolutePath());
return this;
}
/**
* Version of the application and/or package.
*
@ -139,6 +147,33 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path where generated output file is placed.
* <p>
* Defaults to the current working directory.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions dest(File path) {
put("--dest", path.getAbsolutePath());
return this;
}
/**
* Path where generated output file is placed.
* <p>
* Defaults to the current working directory.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions dest(Path path) {
put("--dest", path.toFile().getAbsolutePath());
return this;
}
/**
* Path to a Properties file that contains list of key, value pairs.
* <p>
@ -153,6 +188,36 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path to a Properties file that contains list of key, value pairs.
* <p>
* The keys {@code extension}, {@code mime-type}, {@code icon}, and {@code description} can be used to describe the
* association.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions fileAssociations(File... path) {
put("--file-associations", String.join(",", Arrays.stream(path).map(File::getAbsolutePath).toList()));
return this;
}
/**
* Path to a Properties file that contains list of key, value pairs.
* <p>
* The keys {@code extension}, {@code mime-type}, {@code icon}, and {@code description} can be used to describe the
* association.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions fileAssociations(Path... path) {
put("--file-associations", String.join(",",
Arrays.stream(path).map(Path::toFile).map(File::getAbsolutePath).toList()));
return this;
}
/**
* Path of the icon of the application package.
*
@ -164,6 +229,29 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path of the icon of the application package.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions icon(File path) {
put("--icon", path.getAbsolutePath());
return this;
}
/**
* Path of the icon of the application package.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions icon(Path path) {
put("--icon", path.toFile().getAbsolutePath());
return this;
}
/**
* Path of the input directory that contains the files to be packaged.
* <p>
@ -177,6 +265,32 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path of the input directory that contains the files to be packaged.
* <p>
* All files in the input directory will be packaged into the application image.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions input(File path) {
put("--input", path.getAbsolutePath());
return this;
}
/**
* Path of the input directory that contains the files to be packaged.
* <p>
* All files in the input directory will be packaged into the application image.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions input(Path path) {
put("--input", path.toFile().getAbsolutePath());
return this;
}
/**
* Absolute path of the installation directory of the application.
*
@ -188,6 +302,29 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Absolute path of the installation directory of the application.
*
* @param path the absolute directory path
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions installDir(File path) {
put("--install-dir", path.getAbsolutePath());
return this;
}
/**
* Absolute path of the installation directory of the application.
*
* @param path the absolute directory path
* @return this map of options
*/
public JpackageOptions installDir(Path path) {
put("--install-dir", path.toFile().getAbsolutePath());
return this;
}
/**
* Options to pass to the Java runtime.
*
@ -243,6 +380,29 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path to the license file.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions licenseFile(File path) {
put("--license-file", path.getAbsolutePath());
return this;
}
/**
* Path to the license file.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions licenseFile(Path path) {
put("--license-file", path.toFile().getAbsolutePath());
return this;
}
/**
* Group value of the RPM {@code <name>.spec} file or Section value of DEB control file.
*
@ -395,6 +555,30 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Include all the referenced content in the dmg.
*
* @param additionalContent one or more path
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions macDmgContent(File... additionalContent) {
put("--mac-dmg-content", String.join(",", Arrays.stream(additionalContent).map(File::getAbsolutePath).toList()));
return this;
}
/**
* Include all the referenced content in the dmg.
*
* @param additionalContent one or more path
* @return this map of options
*/
public JpackageOptions macDmgContent(Path... additionalContent) {
put("--mac-dmg-content", String.join(",",
Arrays.stream(additionalContent).map(Path::toFile).map(File::getAbsolutePath).toList()));
return this;
}
/**
* Path to file containing entitlements to use when signing executables and libraries in the bundle.
*
@ -406,6 +590,29 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path to file containing entitlements to use when signing executables and libraries in the bundle.
*
* @param path the fie path
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions macEntitlements(File path) {
put("--mac-entitlements", path.getAbsolutePath());
return this;
}
/**
* Path to file containing entitlements to use when signing executables and libraries in the bundle.
*
* @param path the fie path
* @return this map of options
*/
public JpackageOptions macEntitlements(Path path) {
put("--mac-entitlements", path.toFile().getAbsolutePath());
return this;
}
/**
* Identity used to sign "pkg" installer.
* <p>
@ -574,7 +781,7 @@ public class JpackageOptions extends HashMap<String, String> {
*/
@SuppressWarnings("JavadocDeclaration")
public JpackageOptions module(String name, String mainClass) {
put("--module-name", name + "/" + mainClass);
put("--module", name + "/" + mainClass);
return this;
}
@ -593,6 +800,37 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* List of module paths.
* <p>
* Each path is either a directory of modules or the path to a modular jar.
* <p>
* Each path is absolute or relative to the current directory.
*
* @param path one or more path
* @return this map of options
*/
public JpackageOptions modulePath(File... path) {
put("--module-path", String.join(":", Arrays.stream(path).map(File::getAbsolutePath).toList()));
return this;
}
/**
* List of module paths.
* <p>
* Each path is either a directory of modules or the path to a modular jar.
* <p>
* Each path is absolute or relative to the current directory.
*
* @param path one or more path
* @return this map of options
*/
public JpackageOptions modulePath(Path... path) {
put("--module-path", String.join(":",
Arrays.stream(path).map(Path::toFile).map(File::getAbsolutePath).toList()));
return this;
}
/**
* Name of the application and/or package.
*
@ -628,6 +866,35 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path to override jpackage resources.
* <p>
* Icons, template files, and other resources of jpackage can be over-ridden by adding replacement resources to
* this directory.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions resourceDir(File path) {
put("--resource-dir", path.getAbsolutePath());
return this;
}
/**
* Path to override jpackage resources.
* <p>
* Icons, template files, and other resources of jpackage can be over-ridden by adding replacement resources to
* this directory.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions resourceDir(Path path) {
put("--resource-dir", path.toFile().getAbsolutePath());
return this;
}
/**
* Path of the predefined runtime image that will be copied into the application image.
* <p>
@ -646,6 +913,43 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path of the predefined runtime image that will be copied into the application image.
* <p>
* If not specified, jpackage will run jlink to create the runtime image using options:
* {@link JlinkOptions#stripNativeCommands(boolean) stripNativeCommands}
* {@link JlinkOptions#stripDebug(boolean) stripDebug} {@link JlinkOptions#noManPages(boolean) noManPages}
* {@link JlinkOptions#noHeaderFiles(boolean) noHeaderFiles}
* <p>
* Option is required when creating a runtime package.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions runtimeImage(File path) {
put("--runtime-image", path.getAbsolutePath());
return this;
}
/**
* Path of the predefined runtime image that will be copied into the application image.
* <p>
* If not specified, jpackage will run jlink to create the runtime image using options:
* {@link JlinkOptions#stripNativeCommands(boolean) stripNativeCommands}
* {@link JlinkOptions#stripDebug(boolean) stripDebug} {@link JlinkOptions#noManPages(boolean) noManPages}
* {@link JlinkOptions#noHeaderFiles(boolean) noHeaderFiles}
* <p>
* Option is required when creating a runtime package.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions runtimeImage(Path path) {
put("--runtime-image", path.toFile().getAbsolutePath());
return this;
}
/**
* Strip debug information.
*
@ -676,6 +980,37 @@ public class JpackageOptions extends HashMap<String, String> {
return this;
}
/**
* Path of a new or empty directory used to create temporary files.
* <p>
* If specified, the temp dir will not be removed upon the task completion and must be removed manually.
* <p>
* If not specified, a temporary directory will be created and removed upon the task completion.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
@SuppressWarnings("UnusedReturnValue")
public JpackageOptions temp(File path) {
put("--temp", path.getAbsolutePath());
return this;
}
/**
* Path of a new or empty directory used to create temporary files.
* <p>
* If specified, the temp dir will not be removed upon the task completion and must be removed manually.
* <p>
* If not specified, a temporary directory will be created and removed upon the task completion.
*
* @param path absolute path or relative to the current directory
* @return this map of options
*/
public JpackageOptions temp(Path path) {
put("--temp", path.toFile().getAbsolutePath());
return this;
}
/**
* The type of package to create.
* <p>
@ -868,21 +1203,4 @@ public class JpackageOptions extends HashMap<String, String> {
this.type = type;
}
}
/**
* Name of launcher, and a path to a Properties file that contains a list of key, value pairs.
* <p>
* The keys {@code module}, {@code main-jar}, {@code main-class}, {@code description},
* {@code arguments}, {@code java-options}, {@code app-version}, {@code icon},
* {@code launcher-as-service}, {@code win-console}, {@code win-shortcut}, {@code win-menu},
* {@code linux-app-category}, and {@code linux-shortcut} can be used.
* <p>
* These options are added to, or used to overwrite, the original command line options to build an additional
* alternative launcher.
*
* @param name the name
* @param path absolute path or relative to the current directory
*/
public record Launcher(String name, String path) {
}
}

View file

@ -14,6 +14,7 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import static org.junit.jupiter.api.Assertions.*;
@ -89,11 +90,21 @@ public class TestJlinkOperation {
assertTrue(out.contains("List of available plugins:"), out);
}
@Test
void testCmdFilesPath() {
System.setOut(new PrintStream(outputStreamCaptor));
var jlink = new JlinkOperation().cmdFiles(Path.of("src/test/resources/jlink/options_verbose.txt"),
Path.of("src/test/resources/jlink/options_version.txt"));
assertDoesNotThrow(jlink::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
}
@Test
void testCmdFilesVersion() {
System.setOut(new PrintStream(outputStreamCaptor));
var jlink = new JlinkOperation().cmdFiles("src/test/resources/jlink/options_verbose.txt",
"src/test/resources/jlink/options_version.txt");
var jlink = new JlinkOperation().cmdFiles(new File("src/test/resources/jlink/options_verbose.txt"),
new File("src/test/resources/jlink/options_version.txt"));
assertDoesNotThrow(jlink::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
@ -118,10 +129,10 @@ public class TestJlinkOperation {
var output = new File(tmpdir, "jlink");
var options = new JlinkOptions()
.modulePath("src/test/resources/jlink/build/jmod")
.modulePath(new File("src/test/resources/jlink/build/jmod"))
.addModules("dev.mccue.tree")
.launcher("tree", "dev.mccue.tree", "dev.mccue.tree.Tree")
.output(output.getAbsolutePath());
.output(output);
if (Runtime.version().version().get(0) >= 21) {
options.compress(ZipCompression.ZIP_6);
} else {
@ -144,6 +155,21 @@ public class TestJlinkOperation {
assertTrue(jlink.toolArgs().isEmpty(), "args not empty");
}
@Test
void testModulePath() {
var options = new JlinkOptions();
options.modulePath("foo");
assertEquals("foo", options.get("--module-path"));
var barPath = Path.of("bar");
options.modulePath(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--module-path"));
var fooFile = new File("foo");
options.modulePath(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--module-path"));
}
@Test
void testNoArguments() {
var jlink = new JlinkOperation();
@ -152,6 +178,21 @@ public class TestJlinkOperation {
assertThrows(ExitStatusException.class, jlink::execute);
}
@Test
void testOutput() {
var options = new JlinkOptions();
options.output("foo");
assertEquals("foo", options.get("--output"));
var barPath = Path.of("bar");
options.output(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--output"));
var fooFile = new File("foo");
options.output(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--output"));
}
@Test
void testVersion() {
System.setOut(new PrintStream(outputStreamCaptor));

View file

@ -14,6 +14,7 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.HashMap;
@ -84,7 +85,7 @@ public class TestJmodOperation {
@Test
void testCmdFiles() {
System.setOut(new PrintStream(outputStreamCaptor));
var jmod = new JmodOperation().cmdFiles("src/test/resources/jlink/options_version.txt");
var jmod = new JmodOperation().cmdFiles(new File("src/test/resources/jlink/options_version.txt"));
assertDoesNotThrow(jmod::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
@ -98,7 +99,7 @@ public class TestJmodOperation {
var jmod = new JmodOperation()
.cmdFiles("src/test/resources/jlink/options_jmod.txt")
.jmodFile(mod.getAbsolutePath());
.jmodFile(mod);
assertDoesNotThrow(jmod::execute);
assertTrue(mod.exists(), "mod does not exist");
@ -107,6 +108,43 @@ public class TestJmodOperation {
}
}
@Test
void testCmdFilesPath() {
System.setOut(new PrintStream(outputStreamCaptor));
var jmod = new JmodOperation().cmdFiles(Path.of("src/test/resources/jlink/options_version.txt"));
assertDoesNotThrow(jmod::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
}
@Test
void testCmds() {
var options = new JmodOptions().cmds("foo");
assertEquals("foo", options.get("--cmds"));
var barPath = Path.of("bar");
options = options.cmds(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--cmds"));
var fooFile = new File("foo");
options.cmds(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--cmds"));
}
@Test
void testConfig() {
var options = new JmodOptions().config("foo");
assertEquals("foo", options.get("--config"));
var barPath = Path.of("bar");
options = options.config(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--config"));
var fooFile = new File("foo");
options.config(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--config"));
}
@Test
void testCreate() throws IOException {
var tmpdir = Files.createTempDirectory("bld-jmod-test").toFile();
@ -119,7 +157,7 @@ public class TestJmodOperation {
.classpath("src/test/resources/jlink/build/jar/dev.mccue.apple.jar");
var jmod = new JmodOperation()
.operationMode(OperationMode.CREATE)
.jmodFile(mod.getAbsolutePath())
.jmodFile(mod)
.jmodOptions(options);
assertDoesNotThrow(jmod::execute);
@ -129,6 +167,20 @@ public class TestJmodOperation {
}
}
@Test
void testDir() {
var options = new JmodOptions().dir("foo");
assertEquals("foo", options.get("--dir"));
var barPath = Path.of("bar");
options = options.dir(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--dir"));
var fooFile = new File("foo");
options.dir(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--dir"));
}
@Test
void testExecute() throws IOException {
var tmpdir = Files.createTempDirectory("bld-jmod-test").toFile();
@ -142,7 +194,7 @@ public class TestJmodOperation {
var jmod = new JmodOperation()
.operationMode(OperationMode.CREATE)
.jmodFile(mod.getAbsolutePath())
.jmodFile(mod)
.jmodOptions(options);
assertDoesNotThrow(jmod::execute);
@ -165,6 +217,20 @@ public class TestJmodOperation {
}
}
@Test
void testHeaderFiles() {
var options = new JmodOptions().headerFiles("foo");
assertEquals("foo", options.get("--header-files"));
var barPath = Path.of("bar");
options = options.headerFiles(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--header-files"));
var fooFile = new File("foo");
options.headerFiles(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--header-files"));
}
@Test
void testHelp() {
var jmod = new JmodOperation().toolArgs("--help-extra");
@ -172,6 +238,76 @@ public class TestJmodOperation {
assertTrue(jmod.toolArgs().isEmpty(), "args not empty");
}
@Test
void testJmodFile() {
var op = new JmodOperation().jmodFile("foo");
assertEquals("foo", op.jmodFile());
var barPath = Path.of("bar");
op = op.jmodFile(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), op.jmodFile());
var fooFile = new File("foo");
op.jmodFile(fooFile);
assertEquals(fooFile.getAbsolutePath(), op.jmodFile());
}
@Test
void testLegalNotices() {
var options = new JmodOptions().legalNotices("foo");
assertEquals("foo", options.get("--legal-notices"));
var barPath = Path.of("bar");
options = options.legalNotices(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--legal-notices"));
var fooFile = new File("foo");
options.legalNotices(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--legal-notices"));
}
@Test
void testLibs() {
var options = new JmodOptions().libs("foo");
assertEquals("foo", options.get("--libs"));
var barPath = Path.of("bar");
options = options.libs(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--libs"));
var fooFile = new File("foo");
options.libs(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--libs"));
}
@Test
void testManPages() {
var options = new JmodOptions().manPages("foo");
assertEquals("foo", options.get("--man-pages"));
var barPath = Path.of("bar");
options = options.manPages(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--man-pages"));
var fooFile = new File("foo");
options.manPages(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--man-pages"));
}
@Test
void testModulePath() {
var options = new JmodOptions().modulePath("foo");
assertEquals("foo", options.get("--module-path"));
var barPath = Path.of("bar");
options = options.modulePath(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--module-path"));
var fooFile = new File("foo");
options.modulePath(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--module-path"));
}
@Test
void testNoArguments() {
var jmod = new JmodOperation();

View file

@ -10,12 +10,14 @@ import rife.bld.operations.exceptions.ExitStatusException;
import rife.tools.FileUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import static org.junit.jupiter.api.Assertions.*;
import static rife.bld.operations.JpackageOptions.Launcher;
import static rife.bld.operations.JpackageOperation.Launcher;
import static rife.bld.operations.JpackageOptions.PackageType;
public class TestJpackageOperation {
@ -27,11 +29,45 @@ public class TestJpackageOperation {
System.setOut(stdout);
}
@Test
void testAddLauncher() {
var op = new JpackageOperation();
var fooLauncher = new Launcher("foo-name", "foo-path");
var barPath = Path.of("bar-path");
var barLauncher = new Launcher("bar-name", barPath);
assertEquals("bar-name", barLauncher.name());
assertEquals(barPath.toFile().getAbsolutePath(), barLauncher.path());
var fooFile = new File("foo/bar");
var foobarLauncher = new Launcher("foobar", fooFile);
assertEquals("foobar", foobarLauncher.name());
assertEquals(fooFile.getAbsolutePath(), foobarLauncher.path());
op = op.addLauncher(fooLauncher);
assertTrue(op.launchers().contains(fooLauncher), "foo not found");
op.addLauncher(barLauncher);
assertTrue(op.launchers().contains(barLauncher), "bar not found");
}
@Test
void testAppImage() {
var options = new JpackageOptions().appImage("foo");
assertEquals("foo", options.get("--app-image"));
var barPath = Path.of("bar");
options.appImage(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--app-image"));
var fooFile = new File("foo");
options = options.appImage(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--app-image"));
}
@Test
void testArguments() {
var args = new HashMap<String, String>();
args.put("--about-url", "about-url");
args.put("--add-launcher", "name=path");
args.put("--add-modules", "modules-1,modules-2");
args.put("--app-content", "content-1,content-2");
args.put("--app-image", "app-image");
@ -93,7 +129,6 @@ public class TestJpackageOperation {
var options = new JpackageOptions()
.aboutUrl(args.get("--about-url"))
.addLauncher(new Launcher("name", "path"))
.addModules(args.get("--add-modules").split(","))
.appContent(args.get("--app-content").split(","))
.appImage(args.get("--app-image"))
@ -162,6 +197,35 @@ public class TestJpackageOperation {
}
@Test
void testCmdFiles() {
System.setOut(new PrintStream(outputStreamCaptor));
var jpackage = new JpackageOperation().cmdFiles(new File("src/test/resources/jlink/options_verbose.txt"),
new File("src/test/resources/jlink/options_version.txt"));
assertDoesNotThrow(jpackage::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
}
@Test
void testCmdFilesPath() {
System.setOut(new PrintStream(outputStreamCaptor));
var jpackage = new JpackageOperation().cmdFiles(Path.of("src/test/resources/jlink/options_verbose.txt"),
Path.of("src/test/resources/jlink/options_version.txt"));
assertDoesNotThrow(jpackage::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
}
@Test
void testCmdFilesVersion() {
System.setOut(new PrintStream(outputStreamCaptor));
var jpackage = new JpackageOperation().cmdFiles("src/test/resources/jlink/options_version.txt");
assertDoesNotThrow(jpackage::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
}
@Test
void testCreatePackage() throws Exception {
var tmpdir = Files.createTempDirectory("bld-jpackage-test").toFile();
@ -196,13 +260,34 @@ public class TestJpackageOperation {
}
@Test
void testCmdFiles() {
System.setOut(new PrintStream(outputStreamCaptor));
var jpackage = new JpackageOperation().cmdFiles("src/test/resources/jlink/options_verbose.txt",
"src/test/resources/jlink/options_version.txt");
assertDoesNotThrow(jpackage::execute);
var out = outputStreamCaptor.toString();
assertTrue(out.matches("[\\d.]+[\\r\\n]+"), out);
void testDest() {
var options = new JpackageOptions().dest("foo");
assertEquals("foo", options.get("--dest"));
var barPath = Path.of("bar");
options = options.dest(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--dest"));
var fooFile = new File("foo");
options.dest(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--dest"));
}
@Test
void testFileAssociations() {
var options = new JpackageOptions().fileAssociations("foo", "bar");
assertEquals("foo,bar", options.get("--file-associations"));
var barPath = Path.of("bar");
var fooPath = Path.of("foo");
options = options.fileAssociations(barPath, fooPath);
assertEquals(barPath.toFile().getAbsolutePath() + ',' + fooPath.toFile().getAbsolutePath(),
options.get("--file-associations"));
var fooFile = new File("foo");
var barFile = new File("bar");
options.fileAssociations(fooFile, barFile);
assertEquals(fooFile.getAbsolutePath() + ',' + barFile.getAbsolutePath(), options.get("--file-associations"));
}
@Test
@ -212,14 +297,169 @@ public class TestJpackageOperation {
assertTrue(jpackage.toolArgs().isEmpty(), "args not empty");
}
@Test
void testIcon() {
var options = new JpackageOptions().icon("foo");
assertEquals("foo", options.get("--icon"));
var barPath = Path.of("bar");
options = options.icon(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--icon"));
var fooFile = new File("foo");
options.icon(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--icon"));
}
@Test
void testInput() {
var options = new JpackageOptions();
options.input("foo");
assertEquals("foo", options.get("--input"));
var barPath = Path.of("bar");
options.input(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--input"));
var fooFile = new File("foo");
options.input(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--input"));
}
@Test
void testInstallDir() {
var options = new JpackageOptions().installDir("foo");
assertEquals("foo", options.get("--install-dir"));
var barPath = Path.of("bar");
options = options.installDir(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--install-dir"));
var fooFile = new File("foo");
options.installDir(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--install-dir"));
}
@Test
void testLicenseFile() {
var options = new JpackageOptions().licenseFile("foo");
assertEquals("foo", options.get("--license-file"));
var barPath = Path.of("bar");
options = options.licenseFile(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--license-file"));
var fooFile = new File("foo");
options.licenseFile(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--license-file"));
}
@Test
void testMacDmgContent() {
var options = new JpackageOptions().macDmgContent("foo", "bar");
assertEquals("foo,bar", options.get("--mac-dmg-content"));
var barPath = Path.of("bar");
var fooPath = Path.of("foo");
options = options.macDmgContent(barPath, fooPath);
assertEquals(barPath.toFile().getAbsolutePath() + ',' + fooPath.toFile().getAbsolutePath(),
options.get("--mac-dmg-content"));
var fooFile = new File("foo");
var barFile = new File("bar");
options.macDmgContent(fooFile, barFile);
assertEquals(fooFile.getAbsolutePath() + ',' + barFile.getAbsolutePath(), options.get("--mac-dmg-content"));
}
@Test
void testMacEntitlements() {
var options = new JpackageOptions().macEntitlements("foo");
assertEquals("foo", options.get("--mac-entitlements"));
var barPath = Path.of("bar");
options = options.macEntitlements(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--mac-entitlements"));
var fooFile = new File("foo");
options.macEntitlements(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--mac-entitlements"));
}
@Test
void testModule() {
var options = new JpackageOptions().module("name");
assertEquals("name", options.get("--module"));
options.module("name", "class");
assertEquals("name/class", options.get("--module"));
}
@Test
void testModulePath() {
var options = new JpackageOptions().modulePath("foo");
assertEquals("foo", options.get("--module-path"));
var barPath = Path.of("bar");
options = options.modulePath(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--module-path"));
var fooFile = new File("foo");
options.modulePath(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--module-path"));
}
@Test
void testNoArguments() {
var jpackage = new JpackageOperation();
assertTrue(jpackage.fileOptions().isEmpty(), "file options not empty");
assertTrue(jpackage.cmdFiles().isEmpty(), "file options not empty");
assertTrue(jpackage.jpackageOptions().isEmpty(), "jpackage options not empty");
assertThrows(ExitStatusException.class, jpackage::execute);
}
@Test
void testResourceDir() {
var options = new JpackageOptions().resourceDir("foo");
assertEquals("foo", options.get("--resource-dir"));
var barPath = Path.of("bar");
options = options.resourceDir(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--resource-dir"));
var fooFile = new File("foo");
options.resourceDir(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--resource-dir"));
}
@Test
void testRuntimeImage() {
var options = new JpackageOptions().runtimeImage("foo");
assertEquals("foo", options.get("--runtime-image"));
var barPath = Path.of("bar");
options = options.runtimeImage(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--runtime-image"));
var fooFile = new File("foo");
options.runtimeImage(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--runtime-image"));
}
@Test
void testTemp() {
var options = new JpackageOptions().temp("foo");
assertEquals("foo", options.get("--temp"));
var barPath = Path.of("bar");
options = options.temp(barPath);
assertEquals(barPath.toFile().getAbsolutePath(), options.get("--temp"));
var fooFile = new File("foo");
options.temp(fooFile);
assertEquals(fooFile.getAbsolutePath(), options.get("--temp"));
}
@Test
void testVersion() {
System.setOut(new PrintStream(outputStreamCaptor));