2011-11-05 14 views
9

javac può essere compilato da stdin? Qualcosa di simile a questo:javac può essere compilato da stdin?

cat myfile | javac 
+3

Qual è lo scopo pratico per questo? –

+0

Penso che l'intento potrebbe essere quello di testare semplici comandi (ad esempio, nuovo Float.parseFloat ("")) per vedere cosa farebbero.Inoltre, possibilmente per provare ad usare java per cose come sed one liners, ecc. Tipo di mini LinqPad per java ;-) –

risposta

5

No, non esiste un'opzione per farlo.

Dal documentation:

Ci sono due modi per passare i nomi di file di codice sorgente per javac:

  • Per un piccolo numero di file di origine, è sufficiente elencare i nomi dei file sulla riga di comando .
  • Per un numero elevato di file di origine, elencare i nomi file in un file, separati da spazi vuoti o interruzioni di riga. Quindi usa il nome del file lista sulla riga di comando javac, preceduto da un carattere @.

nomi di file di codice sorgente devono avere java suffissi, i nomi dei file di classe devono avere suffissi .class, e sia i file di origine e di classe deve avere i nomi di radice che identificano la classe. Ad esempio, una classe chiamata MyClass dovrebbe essere scritta in un file sorgente chiamato MyClass.java e compilata in un file di classe bytecode denominato MyClass.class.

1

si potrebbe provare con /dev/stdin del file di origine (e poi, avrete bisogno di trovare l'opzione che costringe javac considerarlo come codice sorgente di Java).

Ma vorrei solo creare uno script di shell che metta lo stdin su un file temporaneo con suffisso .java.

Ma penso che (non sono sicuro) che javac desideri davvero una classe Foo da definire all'interno di un file denominato Foo.java.

+0

Potrebbe non esserci alcuna opzione con Sun's Java per farlo. Con 'gcj' probabilmente ce n'è uno. –

0

Questo non è possibile con javac semplice: il motivo è che la maggior parte dei programmi Java consiste di più di una classe, che di solito sono anche distribuiti su più di un file sorgente (unità di compilazione).

Probabilmente è possibile creare uno strumento che esegue questa operazione, utilizzando l'API del compilatore Java per la compilazione effettiva.

Dovresti creare un JavaFileManager che simula i file tramite il testo dall'input standard e lo passa al compilatore.

1

Non è possibile farlo con Sun java, ma è possibile scrivere uno script per gestire la conversione di stdin in qualcosa che javac può comprendere.

Qualcosa di simile a questo script 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]) 

Nota che lo script creerà un file del nome della classe nella directory corrente. Probabilmente è meglio usare qualcosa in/tmp, ma tieni presente che deve essere nominato come la classe. Se stai testando lo script, non fare qualcosa del genere:

cat MyImportantJava.java | python javac-stdin.py 
Problemi correlati