Select most recent jdk

When multiple jdk minor/patch versions are available, select the most
recent one.
This commit is contained in:
Arnout Engelen 2018-07-03 11:06:04 +02:00
parent a34f76bab7
commit 7630ed8201
2 changed files with 52 additions and 13 deletions

View File

@ -10,6 +10,7 @@ package internal
import java.io.File
import scala.collection.immutable.ListMap
import scala.annotation.tailrec
import sbt.io.Path
import sbt.io.syntax._
import sbt.Cross._
@ -308,24 +309,47 @@ private[sbt] object CrossJava {
def javaHomes: Vector[(String, File)]
}
// Sort version strings, considering 1.8.0 < 1.8.0_45 < 1.8.0_212
@tailrec
def versionOrder(left: String, right: String): Boolean = {
val Pattern = """.*?([0-9]+)(.*)""".r
left match {
case Pattern(leftNumber, leftRest) =>
right match {
case Pattern(rightNumber, rightRest) =>
if (Integer.parseInt(leftNumber) < Integer.parseInt(rightNumber)) true
else if (Integer.parseInt(leftNumber) > Integer.parseInt(rightNumber)) false
else versionOrder(leftRest, rightRest)
case _ =>
false
}
case _ =>
true
}
}
object JavaDiscoverConfig {
val linux = new JavaDiscoverConf {
val base: File = file("/usr") / "lib" / "jvm"
val JavaHomeDir = """java-([0-9]+)-.*""".r
def javaHomes: Vector[(String, File)] =
wrapNull(base.list()).collect {
case dir @ JavaHomeDir(ver) => JavaVersion(ver).toString -> (base / dir)
}
wrapNull(base.list())
.sortWith(versionOrder)
.collect {
case dir @ JavaHomeDir(ver) => JavaVersion(ver).toString -> (base / dir)
}
}
val macOS = new JavaDiscoverConf {
val base: File = file("/Library") / "Java" / "JavaVirtualMachines"
val JavaHomeDir = """jdk-?(1\.)?([0-9]+).*""".r
def javaHomes: Vector[(String, File)] =
wrapNull(base.list()).collect {
case dir @ JavaHomeDir(m, n) =>
JavaVersion(nullBlank(m) + n).toString -> (base / dir / "Contents" / "Home")
}
wrapNull(base.list())
.sortWith(versionOrder)
.collect {
case dir @ JavaHomeDir(m, n) =>
JavaVersion(nullBlank(m) + n).toString -> (base / dir / "Contents" / "Home")
}
}
// See https://github.com/shyiko/jabba
@ -333,12 +357,14 @@ private[sbt] object CrossJava {
val base: File = Path.userHome / ".jabba" / "jdk"
val JavaHomeDir = """([\w\-]+)\@(1\.)?([0-9]+).*""".r
def javaHomes: Vector[(String, File)] =
wrapNull(base.list()).collect {
case dir @ JavaHomeDir(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)
}
wrapNull(base.list())
.sortWith(versionOrder)
.collect {
case dir @ JavaHomeDir(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)
}
}
}

View File

@ -0,0 +1,13 @@
package sbt.internal
import org.specs2.mutable.Specification
class CrossJavaTest extends Specification {
"The Java home selector" should {
"select the most recent" in {
List("jdk1.8.0.jdk", "jdk1.8.0_121.jdk", "jdk1.8.0_45.jdk")
.sortWith(CrossJava.versionOrder)
.last must be equalTo ("jdk1.8.0_121.jdk")
}
}
}