@@ -6,6 +6,7 @@ import java.util.Properties
6
6
import scala .collection .JavaConverters ._
7
7
import scala .sys .process ._
8
8
import java .io .File
9
+ import java .nio .file .Path
9
10
10
11
object Versions {
11
12
def scalametaVersion = " 4.4.26"
@@ -67,6 +68,43 @@ object Versions {
67
68
}
68
69
69
70
private val jvmVersionCache = collection.mutable.Map .empty[Option [File ], Int ]
71
+ private var printJavaVersionPath = Option .empty[Path ]
72
+ private def printJavaVersionFolder = {
73
+ def create = {
74
+ val dir =
75
+ Files .createTempDirectory(" print-java-version" )
76
+ val file = dir.resolve(" PrintJavaVersion.class" )
77
+ val base64 = scala.io.Source
78
+ .fromInputStream(
79
+ getClass()
80
+ .getResourceAsStream(
81
+ " /sbt-sourcegraph/PrintJavaVersion.class.base64"
82
+ )
83
+ )
84
+ .mkString
85
+ .trim
86
+
87
+ val contents = java.util.Base64 .getDecoder().decode(base64)
88
+
89
+ Files .write(file, contents)
90
+ dir
91
+ }
92
+
93
+ printJavaVersionPath.synchronized {
94
+ printJavaVersionPath match {
95
+
96
+ case Some (value)
97
+ if value.resolve(" PrintJavaVersion.class" ).toFile.isFile =>
98
+ value
99
+ case _ =>
100
+ val created = create
101
+ printJavaVersionPath = Some (created)
102
+ created
103
+
104
+ }
105
+ }
106
+
107
+ }
70
108
71
109
def isJavaAtLeast (n : Int , home : Option [File ] = None ): Boolean = {
72
110
@@ -77,32 +115,24 @@ object Versions {
77
115
case None =>
78
116
System .getProperty(" java.version" )
79
117
case Some (javaHome) =>
80
- val sb = new StringBuilder
81
- val proc = {
82
- val cmd =
83
- if (scala.util.Properties .isWin)
84
- Paths .get(" bin" , " java" )
85
- else Paths .get(" bin" , " java" )
86
-
87
- scala.sys.process
88
- .Process (Seq (cmd.toString(), " -version" ), cwd = javaHome)
89
- .!! (ProcessLogger (sb.append(_)))
90
-
91
- sb.result().trim
92
- }
93
-
94
- val rgx = " version \" (.*?)\" " .r
95
-
96
- rgx.findFirstMatchIn(
97
- proc.linesIterator.take(1 ).mkString(" " )
98
- ) match {
99
- case None =>
100
- sys.error(
101
- s " Cannot process [java -version] output (in $javaHome): [ $proc] "
102
- )
103
- case Some (value) =>
104
- value.group(1 )
105
- }
118
+ val dir = printJavaVersionFolder
119
+
120
+ val cmd =
121
+ if (scala.util.Properties .isWin)
122
+ Paths .get(" bin" , " java" )
123
+ else Paths .get(" bin" , " java" )
124
+
125
+ scala.sys.process
126
+ .Process (
127
+ Seq (
128
+ cmd.toString(),
129
+ " -cp" ,
130
+ dir.toString(),
131
+ " PrintJavaVersion"
132
+ ),
133
+ cwd = javaHome
134
+ )
135
+ .!!
106
136
}
107
137
108
138
val prop = raw.takeWhile(c => c.isDigit || c == '.' )
0 commit comments