【问题标题】:Can javac compile from stdin?javac 可以从标准输入编译吗?
【发布时间】:2011-11-05 17:25:55
【问题描述】:

javac 可以从标准输入编译吗? 像这样:

cat myfile | javac

【问题讨论】:

  • 这样做的实际目的是什么?
  • 我认为目的可能是为了测试简单的命令(例如 new Float.parseFloat(""))来看看他们会做什么。此外,可能会尝试将 java 用于 sed one liner 等。有点像 java 的 mini LinqPad ;-)

标签: java javac


【解决方案1】:

不,没有办法这样做。

来自documentation

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

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

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

【讨论】:

    【解决方案2】:

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

    但我只会制作一个 shell 脚本,将标准输入放在某个以.java 为后缀的临时文件上。

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

    【讨论】:

    • Sun 的 Java 可能无法做到这一点。 gcj 可能有一个。
    【解决方案3】:

    你不能用 Sun java 做到这一点,但你可以编写一个脚本来处理标准输入到 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
    

    【讨论】:

      【解决方案4】:

      这对于普通的 javac 是不可能的——原因是大多数 Java 程序包含多个类,这些类通常也分布在多个源文件(编译单元)中。

      您可能可以构建一个工具来执行此操作,使用 Java 编译器 API 进行实际编译。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-15
        • 2010-12-06
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 2017-01-19
        • 2015-07-30
        • 2021-03-27
        相关资源
        最近更新 更多