diff --git a/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java b/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java index 9b864f2bf04e..777d227654d9 100644 --- a/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java +++ b/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java @@ -15,10 +15,13 @@ */ package org.gradle.internal.remote.internal.inet; +import org.gradle.internal.os.OperatingSystem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nullable; +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -38,16 +41,41 @@ public class InetAddressFactory { private String hostName; public String getHostname() { - synchronized (lock) { - if (hostName == null) { - try { - hostName = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - hostName = getCommunicationAddresses().get(0).toString(); + if (hostName == null) { + synchronized (lock) { + // Work around https://bugs.openjdk.java.net/browse/JDK-8143378 on macOS + // See also https://stackoverflow.com/a/39698914 + if (hostName == null && OperatingSystem.current() == OperatingSystem.MAC_OS) { + ProcessBuilder builder = new ProcessBuilder("hostname"); + try { + Process process = builder.start(); + int result = process.waitFor(); + if (result == 0) { + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + try { + String line = reader.readLine(); + if (line != null) { + hostName = line; + } + } finally { + reader.close(); + } + } + } catch (Exception e) { + logger.debug("Couldn't resolve hostname by running hostname, falling back to using JDK", e); + } + } + + if (hostName == null) { + try { + hostName = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + hostName = getCommunicationAddresses().get(0).toString(); + } } } - return hostName; } + return hostName; } /**