2011-11-05 50 views
9

可以從stdin編譯javac嗎? 事情是這樣的:可以從stdin編譯javac嗎?

cat myfile | javac 
+3

這是什麼實際目的? –

+0

我認爲可能是爲了測試簡單的命令(例如新的Float.parseFloat(「」))來查看他們會做什麼。此外,可能嘗試使用Java來處理像sed一樣的內容,等等。有點像Java的迷你LinqPad ;-) –

回答

5

不,沒有辦法做到這一點。

documentation

有兩種方式對源代碼的文件名傳遞給javac的:

  • 對於少數的源文件,簡單地列出在命令行上的文件名。
  • 對於大量的源文件,列出文件中的文件名,用空格或換行符分隔。然後使用javac命令行上的列表文件名,前面加@字符。

源代碼文件名必須具備的.java後綴,類文件名必須具有的.class後綴,和源代碼和類文件必須有標識類根的名字。例如,一個名爲MyClass的類將被寫入名爲MyClass.java的源文件中,並被編譯成名爲MyClass.class的字節碼類文件。

1

您可能會/dev/stdin嘗試與源文件(然後,你需要找到這迫使javac將其視爲Java源代碼的選項)。

但我只是做一個shell腳本,把stdin放在一些後綴爲.java的臨時文件上。

但我認爲(我不確定)javac是否真的想要在名爲Foo.java的文件中定義類Foo

+0

Sun的Java可能無法做到這一點。用'gcj'可能有一個。 –

0

這對於普通的javac來說是不可能的 - 原因是大多數Java程序都由多個類組成,它們通常也分佈在多個源文件(編譯單元)上。

您可以使用Java編譯器API爲實際編譯構建一個工具。

您將不得不創建一個JavaFileManager,它通過來自標準輸入的文本來模擬文件,並將其傳遞給編譯器。

1

你不能用Sun java來完成它,但是你可以編寫一個腳本來處理stdin轉換爲javac可以理解的東西。

事情是這樣的Python腳本:

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