Skip to content

Commit 332ad1e

Browse files
committed
Add searching for installed JVM with a certain version using /usr/libexec/java_home
1 parent 0816d65 commit 332ad1e

File tree

1 file changed

+55
-20
lines changed

1 file changed

+55
-20
lines changed

modules/options/src/main/scala/scala/build/options/JavaOptions.scala

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package scala.build.options
22

3+
import bloop.rifle.VersionUtil.jvmRelease
34
import coursier.cache.{ArchiveCache, FileCache}
45
import coursier.jvm.{JavaHome, JvmCache, JvmIndex}
56
import coursier.util.Task
@@ -62,47 +63,53 @@ final case class JavaOptions(
6263
cache: FileCache[Task],
6364
verbosity: Int
6465
): Option[Positioned[os.Path]] =
66+
lazy val javaHomeManager0 = javaHomeManager(archiveCache, cache, verbosity)
67+
68+
implicit val ec: ExecutionContextExecutorService = cache.ec
69+
70+
def isJvmVersion(jvmId: String): Boolean =
71+
jvmId.forall(c => c.isDigit || c == '.' || c == '-')
72+
6573
javaHomeOpt
6674
.orElse {
6775
if (jvmIdOpt.isEmpty)
68-
Option(System.getenv("JAVA_HOME")).map(p =>
69-
Positioned(Position.Custom("JAVA_HOME env"), os.Path(p, os.pwd))
70-
).orElse(
71-
sys.props.get("java.home").map(p =>
72-
Positioned(Position.Custom("java.home prop"), os.Path(p, os.pwd))
73-
)
74-
).orElse(
75-
if (Properties.isMac)
76-
Try(os.proc("/usr/libexec/java_home").call(os.pwd, check = false).out.text().trim())
77-
.toOption
78-
.flatMap(p => Try(os.Path(p, os.pwd)).toOption)
79-
.filter(os.exists(_))
80-
.map(p => Positioned(Position.Custom("/usr/libexec/java_home"), p))
81-
else None
76+
findLocalDefaultJava()
77+
else if (
78+
Properties.isMac && jvmIdOpt.exists(jvmId =>
79+
isJvmVersion(jvmId.value.stripPrefix("system|"))
8280
)
81+
)
82+
val jvmVersionOpt = for {
83+
jvmId <- jvmIdOpt
84+
maybeJvmVersion = jvmId.value.stripPrefix("system|")
85+
jvmVersion <- jvmRelease(maybeJvmVersion)
86+
} yield jvmVersion.toString
87+
88+
findLocalJavaOnMacOs(jvmVersionOpt)
8389
else None
8490
}
8591
.orElse {
8692
jvmIdOpt.map(_.value).map { jvmId =>
87-
implicit val ec: ExecutionContextExecutorService = cache.ec
93+
8894
cache.logger.use {
8995
val enforceLiberica =
9096
finalJvmIndexOs == "linux-musl" &&
91-
jvmId.forall(c => c.isDigit || c == '.' || c == '-')
97+
isJvmVersion(jvmId)
9298
val enforceZulu =
9399
Os.isArmArchitecture &&
94-
jvmId.forall(c => c.isDigit || c == '.' || c == '-')
100+
isJvmVersion(jvmId)
95101
val jvmId0 =
96102
if (enforceLiberica)
97103
s"liberica:$jvmId" // FIXME Workaround, until this is automatically handled by coursier-jvm
98104
else if (enforceZulu) // default jvmId adoptium doesn't support java 8 for M1
99105
s"zulu:$jvmId"
100106
else
101107
jvmId
102-
val javaHomeManager0 = javaHomeManager(archiveCache, cache, verbosity)
103-
.withMessage(s"Downloading JVM $jvmId0")
108+
104109
val path =
105-
try javaHomeManager0.get(jvmId0).unsafeRun()
110+
try javaHomeManager0
111+
.withMessage(s"Downloading JVM $jvmId0")
112+
.get(jvmId0).unsafeRun()
106113
catch {
107114
case NonFatal(e) => throw new Exception(e)
108115
}
@@ -141,6 +148,34 @@ final case class JavaOptions(
141148
JavaHomeInfo(javaHome, javaCmd, javaVersion)
142149
}
143150

151+
private def findLocalDefaultJava(): Option[Positioned[os.Path]] =
152+
Option(System.getenv("JAVA_HOME")).map(p =>
153+
Positioned(Position.Custom("JAVA_HOME env"), os.Path(p, os.pwd))
154+
).orElse(
155+
sys.props.get("java.home").map(p =>
156+
Positioned(Position.Custom("java.home prop"), os.Path(p, os.pwd))
157+
)
158+
).orElse(
159+
if (Properties.isMac)
160+
findLocalJavaOnMacOs(None)
161+
else None
162+
)
163+
private def findLocalJavaOnMacOs(jvmIdOpt: Option[String]): Option[Positioned[os.Path]] =
164+
Try {
165+
jvmIdOpt.fold(os.proc("/usr/libexec/java_home")) { jvmId =>
166+
os.proc(
167+
"/usr/libexec/java_home",
168+
"-v",
169+
jvmId.stripPrefix("system|"),
170+
"--failfast"
171+
)
172+
}.call(os.pwd, check = true, mergeErrIntoOut = true)
173+
.out.text().trim()
174+
}
175+
.toOption
176+
.flatMap(p => Try(os.Path(p, os.pwd)).toOption)
177+
.filter(os.exists(_))
178+
.map(p => Positioned(Position.Custom("/usr/libexec/java_home -v"), p))
144179
}
145180

146181
object JavaOptions {

0 commit comments

Comments
 (0)