2010-11-11 8 views
5

मैं एक लंबे समय जावा पुरुष हूँ, और जानते हैं कि एक मुख्य वर्ग जार के भीतर एक MANIFEST.MF फ़ाइल में संदर्भित के साथ एक जार को चलाने के लिए जिस तरह से आसान है:मैं बैश से सीधे JAR को निष्पादित करने में सक्षम क्यों हूं?

java -jar theJar.jar

मैं इस उपयोग कर रहा था शुरू करने फैब्रिक 3 सर्वर (bin/server.jar में इसके मानक वितरण में निहित है)। मैंने देखा कि जब मैंने वितरण टैरबॉल से इसे अनपॅक किया था, तो इसे निष्पादन योग्य के रूप में चिह्नित किया गया था। एक लहर पर, मैं अपने bash कमांड लाइन (bash संस्करण 4.1.5 उबंटू 10.10 में) से

./server.jar

की कोशिश की, और लो और निहारना, सर्वर शुरू कर दिया जैसे मैं सामान्य java -jar ... आदेश लिखा हो। जार एक सामान्य जार की तरह संरचित है; मैंने head पर ऐसा किया था, और पहले कुछ बाइट्स में #! कमांड नहीं था, इसलिए bash को जावा वीएम शुरू करने के लिए जादुई रूप से पता नहीं होना चाहिए, है ना? या bash के इस संस्करण में JARs को उचित रूप से सही ढंग से शुरू करने की क्षमता बढ़ी है? पूछताछ दिमाग जानना चाहते हैं ...

उत्तर

12

यह बैश की विशेषता नहीं हो सकती है। यदि आप लिनक्स चला रहे हैं (जैसा आपने टैग किया है) तो आपके पास binfmt_misc कर्नेल मॉड्यूल हो सकता है, जो कि प्रोग्राम को निष्पादित करने का प्रयास करते समय थोड़ा सा जादू करता है। असल में यह क्या करता है यह बाइनरी प्रारूपों को बढ़ाता है जो लिनक्स केवल एल्फ़ से निष्पादित कर सकते हैं ताकि कुछ उपयोगकर्ता परिभाषित स्वरूप भी शामिल हो सकें, ताकि उन्हें चलाने के लिए पर्याप्त निर्देश दिए जा सकें।

+5

यूप यह है। अगर आप स्थापित हैंडलर हैं तो सूची देखने के लिए आप उबंटू 10.10 पर अपडेट-बिनफैट्स चला सकते हैं। – kkress

+0

gnarly, जाहिर है मैं कमांड लाइन ^^ से llvm बाइटकोड निष्पादित कर सकते हैं। – SingleNegationElimination

+0

ठीक है, यह कमाल है! विज्ञान के लिए धन्यवाद। – aarestad

2

यह बैश नहीं है जिसने इस अजीब क्षमता को बढ़ाया है - यह आपका कर्नेल है, विशेष रूप से मॉड्यूल binfmt_misc। (कुछ documentation specific to Java भी हैं)

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