javac可以从stdin编译吗?
javac可以从stdin编译吗? 大概是这样的:javac可以从stdin编译吗?,java,javac,Java,Javac,javac可以从stdin编译吗? 大概是这样的: cat myfile | javac 您可以尝试使用 /DEV/STDIN < /code >作为源文件(然后,您需要找到强制 JavaC>代码>将其视为java源代码的选项)。 但我只需要制作一个shell脚本,将stdin放在一些临时文件上,后缀为.java 但是我认为(我不确定)javac确实希望在名为Foo.java的文件中定义一个类Foo,不,没有选择 从: 有两种方法可以将源代码文件名传递给javac: 对于少量源文件,只需在命
cat myfile | javac
您可以尝试使用<代码> /DEV/STDIN < /code >作为源文件(然后,您需要找到强制<代码> JavaC>代码>将其视为java源代码的选项)。 但我只需要制作一个shell脚本,将stdin放在一些临时文件上,后缀为
.java
但是我认为(我不确定)
javac
确实希望在名为Foo.java
的文件中定义一个类Foo
,不,没有选择
从:
有两种方法可以将源代码文件名传递给javac:
- 对于少量源文件,只需在命令行上列出文件名即可
- 对于大量源文件,请列出文件中的文件名,以空格或换行符分隔。然后在javac命令行上使用列表文件名,前面加一个@字符
这在普通javac中是不可能的——原因是大多数Java程序由多个类组成,这些类通常也分布在多个源文件(编译单元)上 您可能可以使用Java编译器API构建一个实现这一点的工具来进行实际编译
您必须创建一个JavaFileManager,它通过标准输入中的文本模拟文件,并将其传递给编译器。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])
这样做的实际目的是什么?我认为目的可能是为了测试简单的命令(例如new Float.parseFloat(“”),看看它们会做什么。另外,可能尝试将java用于sed一行程序等,有点像java的迷你LinqPad;-)Sun的Java可能没有这样做的选项。使用
gcj
可能有一个。
cat MyImportantJava.java | python javac-stdin.py