在Java中查找物理机器名称

如何获取运行jvm的物理机器名?

(物理=操作系统,直到vmware ……)

从海报的评论中添加:
我的意思是运行JVM的计算机的名称。很可能是物理计算机,但如果JVM在另一个虚拟机中运行,那么该名称就是好的。

String computername=InetAddress.getLocalHost().getHostName(); System.out.println(computername); 

情侣选择,因为我不确定你想要什么:

 RuntimeMXBean rmx = ManagementFactory.getRunTimeMXBean(); System.out.println(rmx.getName()); 

要么…

 System.out.println(InetAddress.getLocalHost().getHostName()); 

或者在Linux上

 Runtime r = Runtime.getRuntime(); Process p = r.exec("uname -a"); BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()); System.out.println(r.readLine()); 

在Windows上,如果需要工作站名称,可以使用:

 System.getenv("COMPUTERNAME") 

我不太确定你的物理机器名称是什么意思。 您的评论“(物理=操作系统,直到vmware ……)”需要向我解释。

但是你可以使用System.getProperty(String key),其中key是这里找到的键之一: http : //java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties ()

这应该告诉你操作系统名称。 如果你需要主机名,请使用jsight的建议。

我想你无法可靠地找到这样的名字。

根据虚拟化的级别,您可能正在某些云提供商的裸机,虚拟机,VM内部的VM,Docker或甚至是自定义JVM上运行,这可能具有额外的抽象级别和针对特定于云的网络处理API。

我最近在识别一台机器来检测某个服务实例何时被卡住的任务中一直处理这个问题。 这必须在托管测试环境和云中的生产中工作。

我最终使用了特定云提供商的API(AWS SDK或Google Cloud Engine API),如果它提供了任何东西,或网络API(请参阅@ jsight的anwser),如果它提供的IP如127.0.0.1或192. *,那么我使用了一个对象的hash() ,它保证在任何JVM实例中都只有一次。

所有这些变化都可能随着时间而改变。 目标是在某个特定时刻唯一地识别节点。 如果那是你的最终目标,我希望这会有所帮助。