2011-11-05 16 views
9

क्या javac stdin से संकलित कर सकते हैं? कुछ इस तरह:क्या javac stdin से संकलित कर सकते हैं?

cat myfile | javac 
+3

इसके लिए व्यावहारिक उद्देश्य क्या है? –

+0

मुझे लगता है कि इरादा सरल आदेशों का परीक्षण करने के लिए हो सकता है (उदाहरण के लिए नया Float.parseFloat ("")) यह देखने के लिए कि वे क्या करेंगे।इसके अलावा, संभवतया एक सिंगल लाइनर जैसे चीजों के लिए जावा का प्रयास करने और उपयोग करने के लिए आदि। जावा के लिए मिनी लिंकपैड की तरह ;-) –

उत्तर

5

नहीं, ऐसा करने का कोई विकल्प नहीं है।

वहाँ javac के लिए स्रोत कोड फ़ाइल नाम पारित करने के लिए दो तरीके हैं::

  • स्रोत फ़ाइलों की एक छोटी संख्या के लिए, बस कमांड लाइन पर फ़ाइल नाम सूची

    documentation से

  • बड़ी संख्या में स्रोत फ़ाइलों के लिए, फ़ाइल नामों को फ़ाइल में सूचीबद्ध करें, रिक्त स्थान या लाइन ब्रेक से अलग। फिर javac कमांड लाइन पर सूची फ़ाइल नाम का उपयोग करें, जो पहले @ वर्ण से होता है।

स्रोत कोड फ़ाइल नाम, जावा प्रत्यय होना आवश्यक वर्ग फ़ाइल नाम .class प्रत्यय, और दोनों स्रोत और वर्ग फ़ाइलों जड़ ऐसे नाम हैं जो वर्ग की पहचान होना आवश्यक होना आवश्यक है। उदाहरण के लिए, MyClass नामक एक वर्ग को MyClass.java नामक स्रोत फ़ाइल में लिखा जाएगा और MyClass.class नामक बाइटकोड क्लास फ़ाइल में संकलित किया जाएगा।

1

आप स्रोत फ़ाइल के रूप में /dev/stdin साथ की कोशिश कर सकते (और फिर, आप विकल्प है जिसके javac बलों जावा स्रोत कोड के रूप में यह विचार करने के लिए खोजने के लिए की आवश्यकता होगी)।

लेकिन मैं सिर्फ एक शेल स्क्रिप्ट बनाउंगा जो कुछ अस्थायी फ़ाइल पर stdin डालता है .java के साथ।

लेकिन मुझे लगता है (मुझे यकीन है कि नहीं कर रहा हूँ) है कि javac वास्तव में चाहता है एक वर्ग FooFoo.java नाम की एक फ़ाइल के अंदर से परिभाषित करने की।

+0

सूर्य के जावा के साथ ऐसा करने का कोई विकल्प नहीं हो सकता है। 'Gcj' के साथ शायद एक है। –

0

सादा जावैक के साथ यह संभव नहीं है - इसका कारण यह है कि अधिकांश जावा प्रोग्रामों में एक से अधिक वर्ग होते हैं, जिन्हें आम तौर पर एक से अधिक स्रोत फ़ाइल (संकलन इकाई) पर वितरित किया जाता है।

आप शायद एक उपकरण बना सकते हैं जो वास्तविक संकलन के लिए जावा कंपाइलर एपीआई का उपयोग कर ऐसा करता है।

आपको जावाफ़ाइल प्रबंधक बनाना होगा जो मानक इनपुट से टेक्स्ट द्वारा फ़ाइलों को अनुकरण करता है, और इसे कंपाइलर को पास करता है।

1

आप इसे सूर्य जावा के साथ नहीं कर सकते हैं, लेकिन आप कुछ जावैक समझने के लिए stdin के रूपांतरण को संभालने के लिए एक स्क्रिप्ट लिख सकते हैं।

कुछ इस अजगर स्क्रिप्ट की तरह:

import fileinput, re, subprocess 

class_name = None 

buffer = [] 
class_matcher = re.compile('\w+ class (?P<name>\w+)') 

for line in fileinput.input(): 
    if None == class_name: 
     buffer.append(line) 
     m = class_matcher.match(line) 
     if m: 
      class_name = m.group('name') 
      print "found %s" % class_name 
      file_name = '%s.java' % class_name 
      out = open(file_name, 'wb') 
      out.writelines(buffer) 
    else: 
     out.write(line) 

if None == class_name: 
    print "Error: no class found" 

else: 
    out.close() 

    print 'javac %s' % file_name 
    output = subprocess.call(['javac', file_name]) 

ध्यान दें कि स्क्रिप्ट मौजूदा निर्देशिका में क्लास के नाम का एक फ़ाइल पैदा करेगा।/Tmp में कुछ उपयोग करना शायद बेहतर है, लेकिन ध्यान रखें कि इसे कक्षा के समान ही नामित किया जाना चाहिए। यदि आप स्क्रिप्ट का परीक्षण कर रहे हैं तो ऐसा कुछ न करें:

cat MyImportantJava.java | python javac-stdin.py 
संबंधित मुद्दे