diff --git a/project/CrossJava.scala b/project/CrossJava.scala index b4f78f1fe9..ed19104371 100644 --- a/project/CrossJava.scala +++ b/project/CrossJava.scala @@ -65,15 +65,16 @@ object CrossJava { } def discoverJavaHomes: ListMap[String, File] = { - import JavaDiscoverConfig._ - val configs = Vector(jabba, linux, macOS) - ListMap(configs flatMap { _.javaHomes }: _*) + ListMap(JavaDiscoverConfig.configs flatMap { _.javaHomes } sortWith (versionOrder): _*) } sealed trait JavaDiscoverConf { def javaHomes: Vector[(String, File)] } + def versionOrder(left: (_, File), right: (_, File)): Boolean = + versionOrder(left._2.getName, right._2.getName) + // Sort version strings, considering 1.8.0 < 1.8.0_45 < 1.8.0_121 @tailrec def versionOrder(left: String, right: String): Boolean = { @@ -94,25 +95,22 @@ object CrossJava { } object JavaDiscoverConfig { - val linux = new JavaDiscoverConf { - val base: File = file("/usr") / "lib" / "jvm" - val JavaHomeDir = """java-([0-9]+)-.*""".r + class LinuxDiscoverConfig(base: File) extends JavaDiscoverConf { + val JavaHomeDir = """(java-|jdk)(1\.)?([0-9]+).*""".r def javaHomes: Vector[(String, File)] = wrapNull(base.list()) - .sortWith(versionOrder) .collect { - case dir@JavaHomeDir(ver) => JavaVersion(ver).toString -> (base / dir) + case dir@JavaHomeDir(_, m, n) => JavaVersion(nullBlank(m) + n).toString -> (base / dir) } } - val macOS = new JavaDiscoverConf { + class MacOsDiscoverConfig extends JavaDiscoverConf { val base: File = file("/Library") / "Java" / "JavaVirtualMachines" val JavaHomeDir = """jdk-?(1\.)?([0-9]+).*""".r def javaHomes: Vector[(String, File)] = wrapNull(base.list()) - .sortWith(versionOrder) .collect { case dir@JavaHomeDir(m, n) => JavaVersion(nullBlank(m) + n).toString -> (base / dir / "Contents" / "Home") @@ -120,13 +118,12 @@ object CrossJava { } // See https://github.com/shyiko/jabba - val jabba = new JavaDiscoverConf { + class JabbaDiscoverConfig extends JavaDiscoverConf { val base: File = Path.userHome / ".jabba" / "jdk" val JavaHomeDir = """([\w\-]+)\@(1\.)?([0-9]+).*""".r def javaHomes: Vector[(String, File)] = wrapNull(base.list()) - .sortWith(versionOrder) .collect { case dir@JavaHomeDir(vendor, m, n) => val v = JavaVersion(nullBlank(m) + n).withVendor(vendor).toString @@ -134,6 +131,13 @@ object CrossJava { else v -> (base / dir) } } + + val configs = Vector( + new JabbaDiscoverConfig, + new LinuxDiscoverConfig(file("/usr") / "java"), + new LinuxDiscoverConfig(file("/usr") / "lib" / "jvm"), + new MacOsDiscoverConfig, + ) } def nullBlank(s: String): String =