diff --git a/Sources/SwiftJavaToolLib/JavaHomeSupport.swift b/Sources/SwiftJavaToolLib/JavaHomeSupport.swift index cd18f7a82..c4d9d72fa 100644 --- a/Sources/SwiftJavaToolLib/JavaHomeSupport.swift +++ b/Sources/SwiftJavaToolLib/JavaHomeSupport.swift @@ -42,6 +42,15 @@ public func findJavaHome() -> String { return home } + if let home = getJavaHomeFromSDKMAN() { + return home + } + + if let home = getJavaHomeFromPath() { + return home + } + + if ProcessInfo.processInfo.environment["SPI_PROCESSING"] == "1" && ProcessInfo.processInfo.environment["SPI_BUILD"] == nil { @@ -90,3 +99,45 @@ public func getJavaHomeFromLibexecJavaHome() -> String? { return nil } } + +// MARK: - Additional Java discovery fallbacks + +func getJavaHomeFromSDKMAN() -> String? { + let home = FileManager.default.homeDirectoryForCurrentUser + .appendingPathComponent(".sdkman/candidates/java/current") + + let javaBin = home.appendingPathComponent("bin/java").path + if FileManager.default.isExecutableFile(atPath: javaBin) { + return home.path + } + return nil +} + +func getJavaHomeFromPath() -> String? { + let task = Process() + task.executableURL = URL(fileURLWithPath: "/usr/bin/which") + task.arguments = ["java"] + + let pipe = Pipe() + task.standardOutput = pipe + + do { + try task.run() + task.waitUntilExit() + guard task.terminationStatus == 0 else { return nil } + + let data = pipe.fileHandleForReading.readDataToEndOfFile() + guard let javaPath = String(data: data, encoding: .utf8)? + .trimmingCharacters(in: .whitespacesAndNewlines), + !javaPath.isEmpty + else { return nil } + + let resolved = URL(fileURLWithPath: javaPath).resolvingSymlinksInPath() + return resolved + .deletingLastPathComponent() + .deletingLastPathComponent() + .path + } catch { + return nil + } +}