diff --git a/main/src/main/scala/sbt/internal/CrossJava.scala b/main/src/main/scala/sbt/internal/CrossJava.scala index 2eaf4cb91..04b4ac8eb 100644 --- a/main/src/main/scala/sbt/internal/CrossJava.scala +++ b/main/src/main/scala/sbt/internal/CrossJava.scala @@ -331,7 +331,15 @@ private[sbt] object CrossJava { } object JavaDiscoverConfig { - private val JavaHomeDir = """(java-|jdk-?)(1\.)?([0-9]+).*""".r + object JavaHomeDir { + private val regex = """(\w+-)?(java-|jdk-?)(bin-)?(1\.)?([0-9]+).*""".r + def unapply(s: CharSequence): Option[String] = { + s match { + case regex(vendor, _, _, m, n) => Some(JavaVersion(nullBlank(m) + n).toString) + case _ => None + } + } + } class LinuxDiscoverConfig(base: File) extends JavaDiscoverConf { def candidates() = wrapNull(base.list()) @@ -339,8 +347,8 @@ private[sbt] object CrossJava { def javaHomes: Vector[(String, File)] = candidates() .collect { - case dir @ JavaHomeDir(_, m, n) => - JavaVersion(nullBlank(m) + n).toString -> (base / dir) + case dir @ JavaHomeDir(version) => + version -> (base / dir) } } @@ -350,19 +358,19 @@ private[sbt] object CrossJava { def javaHomes: Vector[(String, File)] = wrapNull(base.list()) .collect { - case dir @ JavaHomeDir(_, m, n) => - JavaVersion(nullBlank(m) + n).toString -> (base / dir / "Contents" / "Home") + case dir @ JavaHomeDir(version) => + version -> (base / dir / "Contents" / "Home") } } class JabbaDiscoverConfig extends JavaDiscoverConf { val base: File = Path.userHome / ".jabba" / "jdk" - val JavaHomeDir = """([\w\-]+)\@(1\.)?([0-9]+).*""".r + val JabbaJavaHomeDir = """([\w\-]+)\@(1\.)?([0-9]+).*""".r def javaHomes: Vector[(String, File)] = wrapNull(base.list()) .collect { - case dir @ JavaHomeDir(vendor, m, n) => + case dir @ JabbaJavaHomeDir(vendor, m, n) => val v = JavaVersion(nullBlank(m) + n).withVendor(vendor).toString if ((base / dir / "Contents" / "Home").exists) v -> (base / dir / "Contents" / "Home") else v -> (base / dir) @@ -376,21 +384,22 @@ private[sbt] object CrossJava { def javaHomes: Vector[(String, File)] = candidates() .collect { - case dir @ JavaHomeDir(_, m, n) => - JavaVersion(nullBlank(m) + n).toString -> (base / dir) + case dir @ JavaHomeDir(version) => + version -> (base / dir) } } class JavaHomeDiscoverConfig extends JavaDiscoverConf { def home() = sys.env.get("JAVA_HOME") + def javaHomes: Vector[(String, File)] = home() .map(new java.io.File(_)) .flatMap { javaHome => val base = javaHome.getParentFile javaHome.getName match { - case dir @ JavaHomeDir(_, m, n) => - Some(JavaVersion(nullBlank(m) + n).toString -> (base / dir)) + case dir @ JavaHomeDir(version) => + Some(version -> (base / dir)) case _ => None } } diff --git a/main/src/test/scala/sbt/internal/CrossJavaTest.scala b/main/src/test/scala/sbt/internal/CrossJavaTest.scala index b88d0bf65..a3d617ce0 100644 --- a/main/src/test/scala/sbt/internal/CrossJavaTest.scala +++ b/main/src/test/scala/sbt/internal/CrossJavaTest.scala @@ -62,7 +62,7 @@ class CrossJavaTest extends Specification { } "The JAVA_HOME selector" should { - "correctly pick up a JDK " in { + "correctly pick up a JDK" in { val conf = new JavaHomeDiscoverConfig { override def home() = Some("/opt/jdk8") } @@ -70,5 +70,13 @@ class CrossJavaTest extends Specification { version must equalTo("8") file.getName must be equalTo ("jdk8") } + "correctly pick up an Oracle JDK" in { + val conf = new JavaHomeDiscoverConfig { + override def home() = Some("/opt/oracle-jdk-bin-1.8.0.181") + } + val (version, file) = conf.javaHomes.sortWith(CrossJava.versionOrder).last + version must equalTo("1.8") + file.getName must be equalTo ("oracle-jdk-bin-1.8.0.181") + } } }