javac可以从stdin编译吗? 像这样:
cat myfile | javac
答案 0 :(得分:5)
不,没有选择这样做。
有两种方法可以将源代码文件名传递给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,它通过标准输入中的文本模拟文件,并将其传递给编译器。