diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java index fc5ffb1e..ef69252d 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java @@ -303,6 +303,12 @@ public class DaemonConnector { } private Process startDaemonProcess(String daemonId) { + // Those options are needed in order to be able to set the environment correctly + DaemonParameters parameters = this.parameters.withJdkJavaOpts( + " --add-opens java.base/java.io=ALL-UNNAMED" + + " --add-opens java.base/java.lang=ALL-UNNAMED" + + " --add-opens java.base/java.util=ALL-UNNAMED" + + " --add-opens java.base/sun.nio.fs=ALL-UNNAMED"); final Path mvndHome = parameters.mvndHome(); final Path workingDir = parameters.userDir(); String command = ""; @@ -378,12 +384,7 @@ public class DaemonConnector { LOGGER.debug("Starting daemon process: id = {}, workingDir = {}, daemonArgs: {}", daemonId, workingDir, command); ProcessBuilder.Redirect redirect = ProcessBuilder.Redirect.appendTo(parameters.daemonOutLog(daemonId).toFile()); ProcessBuilder processBuilder = new ProcessBuilder(); - processBuilder.environment() - .put("JDK_JAVA_OPTIONS", - "--add-opens java.base/java.io=ALL-UNNAMED " + - "--add-opens java.base/java.lang=ALL-UNNAMED " + - "--add-opens java.base/java.util=ALL-UNNAMED " + - "--add-opens java.base/sun.nio.fs=ALL-UNNAMED"); + processBuilder.environment().put(Environment.JDK_JAVA_OPTIONS.getEnvironmentVariable(), parameters.jdkJavaOpts()); Process process = processBuilder .directory(workingDir.toFile()) .command(args) diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java index 3f2707de..451c75e4 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java @@ -229,6 +229,10 @@ public class DaemonParameters { return property(Environment.MVND_JVM_ARGS).asString(); } + public String jdkJavaOpts() { + return property(Environment.JDK_JAVA_OPTIONS).asString(); + } + /** * @return the number of threads (same syntax as Maven's {@code -T}/{@code --threads} option) to pass to the daemon * unless the user passes his own `-T` or `--threads`. @@ -292,6 +296,13 @@ public class DaemonParameters { .put(Environment.USER_DIR, newUserDir)); } + public DaemonParameters withJdkJavaOpts(String opts) { + String org = this.properties.getOrDefault(Environment.JDK_JAVA_OPTIONS.getProperty(), ""); + return new DaemonParameters(new PropertiesBuilder() + .putAll(this.properties) + .put(Environment.JDK_JAVA_OPTIONS, org + opts)); + } + public Duration keepAlive() { return property(Environment.MVND_KEEP_ALIVE).orFail().asDuration(); } diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java b/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java index 0c088ee5..f797fed2 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java @@ -95,6 +95,11 @@ public class DefaultClient implements Client { * and --color is not supported there yet. */ args.add("-D" + Environment.MAVEN_COLOR.getProperty() + "=" + styleColor.name()); + String userJdkJavaOpts = System.getenv(Environment.JDK_JAVA_OPTIONS.getEnvironmentVariable()); + if (userJdkJavaOpts != null) { + Environment.JDK_JAVA_OPTIONS.addCommandLineOption(args, userJdkJavaOpts); + } + // System properties setSystemPropertiesFromCommandLine(args); diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java b/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java index ca0dca40..0ad2f993 100644 --- a/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java +++ b/common/src/main/java/org/mvndaemon/mvnd/common/Environment.java @@ -84,6 +84,10 @@ public enum Environment { USER_HOME("user.home", null, null, OptionType.PATH, Flags.NONE), /** The current working directory */ USER_DIR("user.dir", null, null, OptionType.PATH, Flags.NONE), + /** The JDK_JAVA_OPTIONS option */ + JDK_JAVA_OPTIONS("jdk.java.options", "JDK_JAVA_OPTIONS", "", OptionType.STRING, Flags.DISCRIMINATING) { + + }, // // Maven properties diff --git a/dist/src/main/distro/bin/mvnd-bash-completion.bash b/dist/src/main/distro/bin/mvnd-bash-completion.bash index eed96687..430a2f04 100644 --- a/dist/src/main/distro/bin/mvnd-bash-completion.bash +++ b/dist/src/main/distro/bin/mvnd-bash-completion.bash @@ -147,7 +147,7 @@ _mvnd() local mvnd_opts="-1" local mvnd_long_opts="--color|--completion|--purge|--serial|--status|--stop" - local mvnd_properties="-Djava.home|-Dmaven.multiModuleProjectDirectory|-Dmaven.repo.local|-Dmaven.settings|-Dmvnd.buildTime|-Dmvnd.builder|-Dmvnd.daemonStorage|-Dmvnd.debug|-Dmvnd.duplicateDaemonGracePeriod|-Dmvnd.enableAssertions|-Dmvnd.expirationCheckDelay|-Dmvnd.home|-Dmvnd.idleTimeout|-Dmvnd.jvmArgs|-Dmvnd.keepAlive|-Dmvnd.logPurgePeriod|-Dmvnd.logback|-Dmvnd.maxHeapSize|-Dmvnd.maxLostKeepAlive|-Dmvnd.minHeapSize|-Dmvnd.minThreads|-Dmvnd.noBuffering|-Dmvnd.noDaemon|-Dmvnd.propertiesPath|-Dmvnd.registry|-Dmvnd.rollingWindowSize|-Dmvnd.serial|-Dmvnd.threads|-Dstyle.color|-Duser.dir|-Duser.home" + local mvnd_properties="-Djava.home|-Djdk.java.options|-Dmaven.multiModuleProjectDirectory|-Dmaven.repo.local|-Dmaven.settings|-Dmvnd.buildTime|-Dmvnd.builder|-Dmvnd.daemonStorage|-Dmvnd.debug|-Dmvnd.duplicateDaemonGracePeriod|-Dmvnd.enableAssertions|-Dmvnd.expirationCheckDelay|-Dmvnd.home|-Dmvnd.idleTimeout|-Dmvnd.jvmArgs|-Dmvnd.keepAlive|-Dmvnd.logPurgePeriod|-Dmvnd.logback|-Dmvnd.maxHeapSize|-Dmvnd.maxLostKeepAlive|-Dmvnd.minHeapSize|-Dmvnd.minThreads|-Dmvnd.noBuffering|-Dmvnd.noDaemon|-Dmvnd.propertiesPath|-Dmvnd.registry|-Dmvnd.rollingWindowSize|-Dmvnd.serial|-Dmvnd.threads|-Dstyle.color|-Duser.dir|-Duser.home" local opts="-am|-amd|-B|-C|-c|-cpu|-D|-e|-emp|-ep|-f|-fae|-ff|-fn|-gs|-h|-l|-N|-npr|-npu|-nsu|-o|-P|-pl|-q|-rf|-s|-T|-t|-U|-up|-V|-v|-X|${mvnd_opts}" local long_opts="--also-make|--also-make-dependents|--batch-mode|--strict-checksums|--lax-checksums|--check-plugin-updates|--define|--errors|--encrypt-master-password|--encrypt-password|--file|--fail-at-end|--fail-fast|--fail-never|--global-settings|--help|--log-file|--non-recursive|--no-plugin-registry|--no-plugin-updates|--no-snapshot-updates|--offline|--activate-profiles|--projects|--quiet|--resume-from|--settings|--threads|--toolchains|--update-snapshots|--update-plugins|--show-version|--version|--debug|${mvnd_long_opts}"