javac可以从stdin编译吗?

时间:2011-11-05 17:25:55

标签: java javac

javac可以从stdin编译吗? 像这样:

cat myfile | javac

4 个答案:

答案 0 :(得分:5)

不,没有选择这样做。

来自documentation

  

有两种方法可以将源代码文件名传递给javac:

     
      
  • 对于少量源文件,只需在命令行中列出文件名即可。
  •   
  • 对于大量源文件,请在文件中列出文件名,以空格或换行符分隔。然后在javac命令行上使用列表文件名,前面加一个@字符。
  •   
     

源代码文件名必须具有.java后缀,类文件名必须具有.class后缀,源文件和类文件都必须具有标识类的根名称 。例如,一个名为MyClass的类将写在一个名为MyClass.java的源文件中,并编译成一个名为MyClass.class的字节码类文件。

答案 1 :(得分:1)

您可以尝试使用/dev/stdin作为源文件(然后,您需要找到强制javac将其视为Java源代码的选项。)

但是我会创建一个shell脚本,将stdin放在一个后缀为.java的临时文件中。

但我认为(我不确定)javac确实希望在名为Foo的文件中定义类Foo.java

答案 2 :(得分: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

答案 3 :(得分:0)

使用普通的javac是不可能的 - 原因是大多数Java程序由多个类组成,这些类通常也分布在多个源文件(编译单元)上。

您可以构建一个使用Java编译器API进行实际编译的工具。

您必须创建一个JavaFileManager,它通过标准输入中的文本模拟文件,并将其传递给编译器。