Discover jvm installed via Oracle Linux RPM's

This commit is contained in:
Arnout Engelen 2018-07-03 15:29:31 +02:00
parent 7630ed8201
commit 57e3183b8d
2 changed files with 52 additions and 14 deletions

View File

@ -300,15 +300,16 @@ private[sbt] 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_212
@tailrec
def versionOrder(left: String, right: String): Boolean = {
@ -329,36 +330,34 @@ private[sbt] 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 {
def candidates = wrapNull(base.list())
val JavaHomeDir = """(java-|jdk)(1\.)?([0-9]+).*""".r
def javaHomes: Vector[(String, File)] =
wrapNull(base.list())
.sortWith(versionOrder)
candidates
.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")
}
}
// 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
@ -366,6 +365,13 @@ private[sbt] 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 =

View File

@ -1,6 +1,7 @@
package sbt.internal
import org.specs2.mutable.Specification
import sbt.internal.CrossJava.JavaDiscoverConfig.LinuxDiscoverConfig
class CrossJavaTest extends Specification {
"The Java home selector" should {
@ -10,4 +11,35 @@ class CrossJavaTest extends Specification {
.last must be equalTo ("jdk1.8.0_121.jdk")
}
}
"The Linux Java home selector" should {
"correctly pick up fedora java installations" in {
val conf = new LinuxDiscoverConfig(sbt.io.syntax.file(".")) {
override def candidates: Vector[String] =
"""
|java-1.8.0-openjdk-1.8.0.162-3.b12.fc28.x86_64
|java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64
|java-1.8.0
|java-1.8.0-openjdk
|java-openjdk
|jre-1.8.0
|jre-1.8.0-openjdk
|jre-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64
|jre-openjdk
""".stripMargin.split("\n").filter(_.nonEmpty).toVector
}
val (version, file) = conf.javaHomes.sortWith(CrossJava.versionOrder).last
version must be equalTo ("1.8")
file.getName must be equalTo ("java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64")
}
"correctly pick up Oracle RPM installations" in {
val conf = new LinuxDiscoverConfig(sbt.io.syntax.file(".")) {
override def candidates: Vector[String] = Vector("jdk1.8.0_172-amd64")
}
val (version, file) = conf.javaHomes.sortWith(CrossJava.versionOrder).last
version must be equalTo ("1.8")
file.getName must be equalTo ("jdk1.8.0_172-amd64")
}
}
}