diff --git a/plugins/package-managers/gradle-inspector/src/main/kotlin/GradleInspector.kt b/plugins/package-managers/gradle-inspector/src/main/kotlin/GradleInspector.kt index 1675f79979739..813f6e5254df2 100644 --- a/plugins/package-managers/gradle-inspector/src/main/kotlin/GradleInspector.kt +++ b/plugins/package-managers/gradle-inspector/src/main/kotlin/GradleInspector.kt @@ -93,7 +93,12 @@ data class GradleInspectorConfig( * The directory of the Java home to use when analyzing projects. By default, the same Java home as for ORT itself * is used. */ - val javaHome: String? + val javaHome: String?, + + /** + * Custom JDK URL for direct download instead of the Disco service. It is valid if the javaVersion is set together. + */ + val customJdkUrl: String? ) /** @@ -160,17 +165,27 @@ class GradleInspector( addProgressListener(ProgressListener { logger.debug(it.displayName) }) } - val javaHome = config.javaVersion - ?.takeUnless { JavaBootstrapper.isRunningOnJdk(it) } - ?.let { - JavaBootstrapper.installJdk("TEMURIN", it).onFailure { e -> + val javaHome = config.customJdkUrl + ?.let { url -> + JavaBootstrapper.downloadJdk(url).onFailure { e -> issues += createAndLogIssue(e.collectMessages()) }.getOrNull() - } ?: config.javaHome?.let { File(it) } + } + + ?: config.javaVersion + ?.takeUnless { JavaBootstrapper.isRunningOnJdk(it) } + ?.let { version -> + JavaBootstrapper.installJdk("TEMURIN", version).onFailure { e -> + issues += createAndLogIssue(e.collectMessages()) + }.getOrNull() + } + + ?: config.javaHome?.let { File(it) } javaHome?.also { - logger.info { "Setting Java home for project analysis to '$it'." } - setJavaHome(it) + val javaHomePath = if (Os.isMac) it / "Contents" / "Home" else it + logger.info { "Setting Java home for project analysis to '$javaHomePath'." } + setJavaHome(javaHomePath) } } .setJvmArguments(jvmArgs) diff --git a/utils/ort/src/main/kotlin/JavaBootstrapper.kt b/utils/ort/src/main/kotlin/JavaBootstrapper.kt index 42c0e2ed3fd76..fdf15a64b5813 100644 --- a/utils/ort/src/main/kotlin/JavaBootstrapper.kt +++ b/utils/ort/src/main/kotlin/JavaBootstrapper.kt @@ -20,7 +20,9 @@ package org.ossreviewtoolkit.utils.ort import java.io.File +import java.security.MessageDigest +import kotlin.text.toByteArray import kotlin.time.measureTime import kotlin.time.measureTimedValue @@ -131,7 +133,20 @@ object JavaBootstrapper { return Result.failure(it) } - val installDir = (ortToolsDirectory / "jdks" / pkg.distribution / pkg.distributionVersion) + return downloadJdk(pkg.links.pkgDownloadRedirect) + } + + /** + * Download the resolved JDK Url and return its directory on success, or an exception on failure. + */ + fun downloadJdk(sdkUrl: String): Result { + val safeHash = + MessageDigest.getInstance("SHA-256") + .digest(sdkUrl.toByteArray()) + .joinToString("") { "%02x".format(it) } + .take(16) + + val installDir = (ortToolsDirectory / "jdks" / safeHash) .apply { if (isDirectory) { logger.info { "Not downloading the JDK again as the directory '$this' already exists." } @@ -141,11 +156,10 @@ object JavaBootstrapper { safeMkdirs() } - val url = pkg.links.pkgDownloadRedirect - logger.info { "Downloading the JDK package from $url..." } + logger.info { "Downloading the JDK package from $sdkUrl..." } val (archive, downloadDuration) = measureTimedValue { - okHttpClient.downloadFile(url, installDir).getOrElse { + okHttpClient.downloadFile(sdkUrl, installDir).getOrElse { return Result.failure(it) } }