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 54ddb6289..102fb8237 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java @@ -44,6 +44,7 @@ import org.mvndaemon.mvnd.common.Environment; import org.mvndaemon.mvnd.common.InterpolationHelper; import org.mvndaemon.mvnd.common.Os; +import org.mvndaemon.mvnd.common.OsUtils; import org.mvndaemon.mvnd.common.SocketFamily; import org.mvndaemon.mvnd.common.TimeUtils; import org.slf4j.Logger; @@ -137,6 +138,9 @@ public Path javaHome() { .orLocalProperty(provider, globalPropertiesPath()) .orSystemProperty() .orEnvironmentVariable() + .or(new ValueSource( + description -> description.append("java command"), + this::javaHomeFromPath)) .orFail() .asPath(); try { @@ -146,6 +150,14 @@ public Path javaHome() { } } + private String javaHomeFromPath() { + final String jHome = OsUtils.findJavaHomeFromPath(); + if (null != jHome) { + System.setProperty(Environment.JAVA_HOME.getProperty(), jHome); + } + return jHome; + } + public Path userDir() { return value(Environment.USER_DIR) .orSystemProperty() diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/OsUtils.java b/common/src/main/java/org/mvndaemon/mvnd/common/OsUtils.java index 369ba9018..fd4170e7f 100644 --- a/common/src/main/java/org/mvndaemon/mvnd/common/OsUtils.java +++ b/common/src/main/java/org/mvndaemon/mvnd/common/OsUtils.java @@ -101,6 +101,18 @@ public static long findProcessRssInKb(long pid) { } } + public static String findJavaHomeFromPath() { + String[] cmd = { "java", "-XshowSettings:properties", "-version" }; + final List output = new ArrayList(1); + exec(cmd, output); + List javaHomeLines = output.stream().filter(l -> l.contains(" java.home = ")) + .collect(Collectors.toList()); + if (javaHomeLines.size() == 1) { + return javaHomeLines.get(0).trim().replaceFirst("java.home = ", ""); + } + return null; + } + private static void exec(String[] cmd, final List output) { final ProcessBuilder builder = new ProcessBuilder(cmd).redirectErrorStream(true); try (CommandProcess ps = new CommandProcess(builder.start(), output::add)) {