Можно ли скомпилировать javac из stdin? - PullRequest
9 голосов
/ 05 ноября 2011

Может ли javac компилироваться из stdin? Примерно так:

cat myfile | javac

Ответы [ 4 ]

5 голосов
/ 05 ноября 2011

Нет, для этого нет возможности.

Из документации :

Существует два способа передачи имен файлов исходного кода в javac:

  • Для небольшого количества исходных файлов просто перечислите имена файлов в командной строке.
  • Для большого количества исходных файлов перечислите имена файлов в файле, разделенные пробелами или переносами строк.Затем используйте имя файла списка в командной строке javac, которому предшествует символ @.

Имена файлов исходного кода должны иметь суффиксы .java , имена файлов классов должны иметь .classсуффиксы и исходные файлы, и файлы классов должны иметь корневые имена, идентифицирующие класс .Например, класс с именем MyClass будет записан в исходном файле с именем MyClass.java и скомпилирован в файл класса байт-кода с именем MyClass.class.

1 голос
/ 05 ноября 2011

Вы не можете сделать это с 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
1 голос
/ 05 ноября 2011

Вы можете попробовать использовать /dev/stdin в качестве исходного файла (а затем вам нужно будет найти параметр, который заставляет javac рассматривать его как исходный код Java).

Но я бы просто сделал сценарий оболочки, который поместил бы stdin в некоторый временный файл с суффиксом .java.

Но я думаю (я не уверен), что javac действительно хочет, чтобы класс Foo был определен внутри файла с именем Foo.java.

0 голосов
/ 05 ноября 2011

Это невозможно с простым javac - причина в том, что большинство Java-программ состоят из более чем одного класса, которые обычно также распределены по более чем одному исходному файлу (единице компиляции).

Вероятно, вы можете создать инструмент, который делает это, используя API компилятора Java для фактической компиляции.

Вам потребуется создать JavaFileManager, который имитирует файлы по тексту из стандартного ввода, и передать его компилятору.

...