From afa37c0d2f71fd06d112b7e3c90c71b7f5a53823 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Wed, 6 Jun 2018 23:01:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A3=80=E6=B5=8BLinux?= =?UTF-8?q?=E4=B8=8B=E7=9A=84Java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/util/JavaVersion.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java index add4817ad..96dbe8e5a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JavaVersion.java @@ -18,10 +18,17 @@ package org.jackhuang.hmcl.util; import java.io.*; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.*; import java.util.concurrent.CountDownLatch; +import java.util.logging.Level; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Represents a Java installation. @@ -69,7 +76,7 @@ public final class JavaVersion implements Serializable { return version; } - private static final Pattern REGEX = Pattern.compile("java version \"(?(.*?))\""); + private static final Pattern REGEX = Pattern.compile("version \"(?(.*?))\""); public static final int UNKNOWN = -1; public static final int JAVA_5 = 50; @@ -175,6 +182,9 @@ public final class JavaVersion implements Serializable { case WINDOWS: javaVersions = queryWindows(); break; + case LINUX: + javaVersions = queryLinux(); + break; case OSX: javaVersions = queryMacintosh(); break; @@ -188,6 +198,27 @@ public final class JavaVersion implements Serializable { LATCH.countDown(); } + private static List queryLinux() throws IOException { + Path jvmDir = Paths.get("/usr/lib/jvm"); + if (Files.isDirectory(jvmDir)) { + return Files.list(jvmDir) + .filter(dir -> Files.isDirectory(dir, LinkOption.NOFOLLOW_LINKS)) + .map(dir -> dir.resolve("bin/java")) + .filter(Files::isExecutable) + .flatMap(executable -> { + try { + return Stream.of(fromExecutable(executable.toFile())); + } catch (IOException e) { + Logging.LOG.log(Level.WARNING, "Couldn't determine java " + executable, e); + return Stream.empty(); + } + }) + .collect(Collectors.toList()); + } else { + return Collections.emptyList(); + } + } + private static List queryMacintosh() throws IOException { LinkedList res = new LinkedList<>();