2011-11-05 52 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