2009-11-03 8 views
20

पर कॉल किए बिना एक जेएआर फ़ाइल चला रहा है मैं जावा में लिखी गई एक कमांड लाइन उपकरण तैनात कर रहा हूं जो कमांड लाइन तर्क स्वीकार करता है। मैंने इसे एक जेएआर फ़ाइल के रूप में पैक किया है क्योंकि यह एक फ़ाइल रखने के लिए सुविधाजनक है।सीधे 'जावा'

समस्या यह है कि इसे चलाने के लिए आपको सबसे पहले java -jar (filename) (args) पर कॉल करना होगा और यह काफी परेशान है।

मेरे पास वर्तमान तरीका है कि यह एक सरल बैश स्क्रिप्ट है जो इसे लॉन्च करता है, लेकिन यह आदर्श से कम है।

क्या वैसे भी (लिनक्स, उबंटू सर्वर में) एक जेएआर फ़ाइल बनाने के लिए है जो जावा वीएम को स्वयं ही आमंत्रित करता है? मैंने एक शेबांग की तलाश की है, लेकिन एक नहीं मिला (जो निश्चित रूप से संकलित कोड के बाद से समझ में आता है)। myprogram.jar arg1 -arg2 बजाय इस की: java -jar myprogram.jar arg1 -arg2

धन्यवाद,
ब्रायन

+0

कोई भी उत्तर बेहतर समाधान नहीं देता है जहां मैंने कहीं पढ़ा है जहां आप मूल रूप से जार फ़ाइल के शीर्ष पर एक शेल कमांड को जोड़ते हैं। सुरुचिपूर्ण लेकिन बहुत सुविधाजनक नहीं है। https://mesosphere.com/blog/executable-jars/ –

उत्तर

16

Documentation/java.txt in the Linux Kernel documentation देखें, जो आप कैसे जार को चलाने के लिए binfmt_misc कर्नेल मॉड्यूल का उपयोग कर एक सिस्टम को कॉन्फ़िगर करने के लिए कहता

यह है कि मैं क्या करना चाहता हूँ स्वचालित रूप से फ़ाइलें। हालांकि, यह एक कॉन्फ़िगरेशन विकल्प है जिसे आप किसी कंप्यूटर पर बदलते हैं, जो कि आप जार फ़ाइल के बारे में कुछ नहीं बदलते हैं, इसलिए यह सिस्टम से सिस्टम में जार फ़ाइल का पालन नहीं करता है।

+1

एक संबंधित लिंक: http://www.linuxhq.com/java.html –

+0

यह एक अच्छा विचार प्रतीत होता है, लेकिन मैं एसडीके स्थापित करने का जोखिम नहीं उठा सकता सभी उत्पादन मशीनों पर। हालांकि मुझे लक्ष्य बॉक्स में छोटे बदलाव करने में कोई समस्या नहीं है। मैं बहुत ही आश्चर्यचकित हूं कि लिनक्स ने लागू किया कि हालांकि, बहुत प्रभावशाली है। – HalfBrian

+1

इस काम को करने के लिए आपको पूर्ण जेडीके (कंपाइलर के साथ) की आवश्यकता नहीं है। जेआरई (जिसे आपको उत्पादन मशीनों पर वैसे भी चाहिए) ठीक होना चाहिए। –

39

.zip फ़ाइल प्रारूप (जिस पर .jar प्रारूप आधारित है) फ़ाइल में प्रीपेड अतिरिक्त डेटा की उपस्थिति में मजबूत प्रतीत होता है। इस प्रकार यदि आप cat कमांड को जार फ़ाइल में ज़िप डेटा से पहले शेबैंग डालने के लिए उपयोग करते हैं, और फ़ाइल को निष्पादन योग्य बनाते हैं, तो आप जार फ़ाइल को कॉल कर सकते हैं जैसे कि आप किसी सामान्य शेल स्क्रिप्ट को कॉल करेंगे।

उदाहरण के लिए: (ध्यान दें कि unzip -l आदेश बिंदु को वर्णन करने के लिए बस है यह .jar बारे में कुछ भी नहीं बदलता है और जब आप वास्तव में इस प्रक्रिया कर रहे हैं छोड़ा जा सकता है।।)

[[email protected] ~]$ java -jar tex4ht.jar 
    xtpipes (2009-01-27-22:19) 
    Command line options: 
    java xtpipes [-trace] [-help] [-m] [-E] [-s script_file] [-S script_map] 
        [-i script_dir] [-o out_file] 
        [-x...ml2xml_arg...] (-d in_data | in_file) 
    -m  messages printing mode 
    -E  error messages into exception calls 
    in_data XML data directly into the command line 

[[email protected] ~]$ cat header.txt 
#!/usr/bin/java -jar 
[[email protected] ~]$ cat header.txt tex4ht.jar > tex4ht_exe.jar 
[[email protected] ~]$ unzip -l tex4ht_exe.jar 
Archive: tex4ht_exe.jar 
warning [tex4ht_exe.jar]: 21 extra bytes at beginning or within zipfile 
    (attempting to process anyway) 
    Length  Date Time Name 
--------- ---------- ----- ---- 
     0 2009-07-09 15:48 META-INF/ 
     42 2009-07-09 15:47 META-INF/MANIFEST.MF 
     0 2009-07-09 15:48 ./ 
     0 2009-07-09 15:48 tex4ht/ 
    2217 2009-07-09 15:48 tex4ht/DbUtilities.class 
    2086 2009-07-09 15:48 tex4ht/GroupMn.class 
    6064 2009-07-09 15:48 tex4ht/HtJsml.class 
    4176 2009-07-09 15:48 tex4ht/HtSpk.class 
    1551 2009-07-09 15:48 tex4ht/JsmlFilter.class 
    2001 2009-07-09 15:48 tex4ht/JsmlMathBreak.class 
    6172 2009-07-09 15:48 tex4ht/OoFilter.class 
    3449 2009-07-09 15:48 tex4ht/OoUtilities.class 
    1468 2009-07-09 15:48 tex4ht/OomFilter.class 
     346 2009-07-09 15:48 xtpipes.class 
     0 2009-07-09 15:48 xtpipes/ 
    4071 2009-07-09 15:48 xtpipes/FileInfo.class 
    6904 2009-07-09 15:48 xtpipes/InputObject.class 
    25906 2009-07-09 15:48 xtpipes/Xtpipes.class 
    1238 2009-07-09 15:48 xtpipes/Xtpipes$5.class 
     713 2009-07-09 15:48 xtpipes/Xtpipes$3.class 
    1533 2009-07-09 15:48 xtpipes/Xtpipes$1.class 
     709 2009-07-09 15:48 xtpipes/Xtpipes$7.class 
    1294 2009-07-09 15:48 xtpipes/XtpipesEntityResolver.class 
    1235 2009-07-09 15:48 xtpipes/Xtpipes$6.class 
    3367 2009-07-09 15:48 xtpipes/Xtpipes$4.class 
     709 2009-07-09 15:48 xtpipes/Xtpipes$8.class 
    1136 2009-07-09 15:48 xtpipes/Xtpipes$2.class 
     875 2009-07-09 15:48 xtpipes/XtpipesPrintWriter.class 
    1562 2009-07-09 15:48 xtpipes/XtpipesUni.class 
     0 2009-07-09 15:48 xtpipes/util/ 
    5720 2009-07-09 15:48 xtpipes/util/ScriptsManager.class 
    1377 2009-07-09 15:48 xtpipes/util/ScriptsManagerLH.class 
---------      ------- 
    87921      32 files 
[[email protected] ~]$ chmod +x tex4ht_exe.jar 
[[email protected] ~]$ ./tex4ht_exe.jar 
    xtpipes (2009-01-27-22:19) 
    Command line options: 
    java xtpipes [-trace] [-help] [-m] [-E] [-s script_file] [-S script_map] 
        [-i script_dir] [-o out_file] 
        [-x...ml2xml_arg...] (-d in_data | in_file) 
    -m  messages printing mode 
    -E  error messages into exception calls 
    in_data XML data directly into the command line 
+1

वाह! वह वास्तव में काम करता है! मैं गंभीरता से प्रभावित हूं! –

+2

यह एक बहुत ही रोचक समाधान है, हालांकि काफी अपरंपरागत है। –

+0

@ डैनियल: सहमत हुए। 'binfmt_misc' समाधान निश्चित रूप से क्लीनर है, लेकिन यह एक गंभीर रूप से अच्छा हैक है ;-) –

2

डेबियन आधारित वितरण पर, यह jarwrapper

sudo apt-get install jarwrapper 

मुझे लगता है कि यह एक ही पैकेज नाम के साथ स्थापित करके अन्य वितरण पर एक ही बात करने के लिए संभव है स्थापित करने के लिए संभव है।

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