All Downloads are FREE. Search and download functionalities are using the official Maven repository.

name.remal.gradle_plugins.dsl.extensions.org.gradle.internal.jvm.JavaInfo.kt Maven / Gradle / Ivy

package name.remal.gradle_plugins.dsl.extensions

import name.remal.version.Version
import org.gradle.internal.jvm.JavaInfo
import org.gradle.process.internal.DefaultExecActionFactory
import org.gradle.process.internal.ExecHandleFactory
import java.io.ByteArrayOutputStream
import java.nio.charset.StandardCharsets

fun JavaInfo.retrieveVersion(): Version? {
    ByteArrayOutputStream().use versionGetter@{ stdOutputStream ->
        ByteArrayOutputStream().use { errOutputStream ->
            val execHandleFactory: ExecHandleFactory = INSTANTIATOR.newInstance(DefaultExecActionFactory::class.java)
            val builder = execHandleFactory.newExec()
            builder.setCommandLine(javaExecutable, "-version")
            builder.standardOutput = stdOutputStream
            builder.errorOutput = errOutputStream
            builder.build().start().waitForFinish().assertNormalExitValue()

            parseJavaVersionOutput(stdOutputStream.toByteArray())?.let { return@versionGetter it }
            parseJavaVersionOutput(errOutputStream.toByteArray())?.let { return@versionGetter it }

            return null
        }
    }
    return null
}

private fun parseJavaVersionOutput(bytes: ByteArray): Version? {
    val text = bytes.toString(StandardCharsets.UTF_8).replace("\r", "").trim()
    val lines = text.split('\n')
    for (line in lines) {
        val versionStr = line.toLowerCase().substringAfter("version", "").trim('\t', ' ', '"', '\'')
        if (versionStr.isNotEmpty()) {
            return Version.parse(versionStr)
        }
    }
    return null
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy