2012-05-10 10 views
10

में विफल रहता है मैं मशीन के होस्ट नाम इस प्रकार हो रही किया गया है:जावा के साथ हो रही होस्टनाम नवीनतम jdk7

InetAddress.getLocalHost().getHostName(); 

लेकिन जब मैं नवीनतम JDK (jdk1.7.0_04) रखा,, ऊपर कोड बस स्थानीय होस्ट वापसी । मैं जाँच की/etc/hosts (अपने लिनक्स) और वहाँ का कहना है:

127.0.0.1 localhost redbull 

यह उन्नयन जब तक रेडबुल लौट गया है। तो मैंने बदल दिया कि

127.0.0.1 redbull localhost 

इसके बजाय और बिना किसी समस्या के रेडबुल लौटना शुरू कर दिया।

क्या यह काम करने का कोई बेहतर तरीका है?

उत्तर

2

ठीक है, मैं एक dup के रूप में इस पर चिह्नित करने के बारे में सोचा है, लेकिन केवल जवाब मुझे लगता है सुझाव है कि आप InetAddress.getLocalHost().getHostName() का उपयोग करें। जो, स्पष्ट रूप से, मुझे लगता है कि इस मामले में "लोकलहोस्ट" लौटाएं। और मुझे लगता है कि, उत्तर, सही हैं, इसमें वास्तव में कोई शुद्ध जावा तरीका नहीं है (कम से कम कोई भी जो पुराने जेआरई पर पोर्टेबल नहीं है।)

हम इसे पूरा करने के लिए जेएनआई का उपयोग करते हैं। हम Mac OS 10.4+, SCDynamicStoreCopyLocalHostName() पुराने मैक ओएस पर, GetComputerName() Win32 पर, gethostname() अन्य सभी स्थानों पर SCPreferencesGetHostName() कहते हैं।

आप निश्चित रूप से यूनिक्स मशीनों पर /bin/hostname पर कॉल कर सकते हैं या विंडोज पर पर्यावरण परिवर्तनीय COMPUTERNAME देख सकते हैं। यह एक निर्णय कॉल है कि आप जेएनआई या exec को किसी अन्य प्रोग्राम में बेहतर कॉलिंग महसूस करते हैं या नहीं।

क्या इसके लायक है के लिए, कारण है कि हम मैक ओएस पर gethostname() फोन नहीं है क्योंकि मैक एक अजीब गतिशील होस्टनाम बात है, जहां gethostname() अपनी प्राथमिक ईथरनेट डिवाइस के रिवर्स DNS वापस आ जाएगी करता है। अगर मैं अपने मैक को सीधे अपने केबल मॉडेम में प्लग करना चाहता था, तो मुझे customer-10-42-21-42 का होस्टनाम मिलेगा या जो भी मेरे केबल प्रदाता ने अपने पीटीआर रिकॉर्ड को अपने DNS में सेट करने का फैसला किया था। इसके बजाए, वरीयताओं पर जाकर आपको एक स्थिर होस्टनाम मिलेगा जो उपयोगकर्ता द्वारा निर्धारित किया गया था।

+0

MacOS पर अच्छी तरह से काम करने के लिए क्या करने के लिए थोड़ा और काम हो सकता है हाँ, यह एक नकली लेकिन इसकी कैसा दिखाई देता है जब आप नज़दीकी नज़र डालेंगे। मैं यह भी मानता हूं कि इसे LOCALHOST वापस करना चाहिए। हालांकि, जेडीके के पिछले संस्करण के साथ, यह कभी नहीं हुआ और इसलिए इस बिंदु पर तर्क को "सही करने" को काउंटर अंतर्ज्ञानी लगता है। मेजबाननाम के रूप में सरल कुछ पाने के लिए जेएनआई का उपयोग करना मेरे लिए एक ओवरकिल जैसा लगता है।जब तक किसी के पास कोई बेहतर समाधान नहीं है या जेडीके कुछ और मानक प्रदान करता है, तो मैं इस पर अपने "वर्कअराउंड" का उपयोग करूँगा। – Daniil

+0

मैं सहमत हूं। जेएनआई को तैनात करते हुए, निश्चित रूप से अच्छी तरह से समझने के बाद, आपके निर्माण और तैनाती प्रक्रिया में जटिलता का एक और स्तर जोड़ता है। और यदि यह एकमात्र जेएनआई है तो आपको चाहिए? शायद वास्तव में overkill। यह अजीब बात है कि वे इसे बदल चुके होंगे, जावा टीम बैककंपैप रखने के लिए प्रतीत होता है कि प्रमुख बग को "डिजाइन किए गए" के रूप में चिह्नित करती है। –

2

मैं एक ही समस्या थी और जब सब खड़े निम्नलिखित यह काम किया। होस्ट नाम डॉट के साथ संलग्न किया जा करने के लिए स्थानीय

$ scutil --get HostName 
drums 
$ scutil --get LocalHostName 
drums 
$ scutil --get ComputerName 
drums 

$ sudo hostname drums.local 
$ hostname 
drums.local 

$sudo vim /etc/hosts 
192.168.x.IP drums 
127.0.0.1 localhost drums 
255.255.255.255 broadcasthost 
::1 localhost 
fXXX::1XXX localhost 

$networksetup -setv6off Ethernet 

$ sw_vers 
ProductName: Mac OS X 
ProductVersion: 10.9 

$ java -version 
java version "1.7.0_45" 
Java(TM) SE Runtime Environment (build 1.7.0_45-b18) 
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) 
0

आप Maven केंद्रीय से एक बाहरी निर्भरता का उपयोग कर के खिलाफ नहीं हैं, तो था, मैं खुद के लिए इस समस्या को हल करने के लिए gethostname4j लिखा था। यह सिर्फ libc के gethostname फ़ंक्शन को कॉल करने के लिए जेएनए का उपयोग करता है (या विंडोज़ पर कंप्यूटर नाम प्राप्त करता है) और इसे स्ट्रिंग के रूप में आपके पास लौटाता है।

https://github.com/mattsheppard/gethostname4j

@ एडवर्ड-थॉमसन के जवाब से ऊपर बना देता है मुझे बात मैं यह हालांकि :)

संबंधित मुद्दे