2011-11-05 13 views
9

¿Puede javac compilar desde stdin? Algo como esto:¿Puede javac compilar desde stdin?

cat myfile | javac 
+3

¿Cuál es el propósito práctico de eso? –

+0

Creo que la intención podría ser probar comandos simples (por ejemplo, nuevo Float.parseFloat ("")) para ver lo que harían.También, posiblemente, para tratar de usar Java para cosas como sed one liners, etc. Algo así como un mini LinqPad para java ;-) –

Respuesta

5

No, no hay ninguna opción para hacer eso.

Desde el documentation:

Hay dos formas de pasar los nombres de archivos de código fuente a javac:

  • Para un pequeño número de archivos de origen, simplemente listar los nombres de archivo en la línea de comandos .
  • Para una gran cantidad de archivos fuente, enumere los nombres de los archivos en un archivo, separados por espacios en blanco o saltos de línea. Luego use el nombre del archivo de lista en la línea de comando de javac, precedido por un carácter @.

nombres de los archivos de código fuente debe tener .java sufijos, los nombres de archivo de clase deben tener sufijos .class, y ambos archivos de origen y de clase deben tener nombres raíz que identifican la clase. Por ejemplo, una clase llamada MyClass se escribiría en un archivo fuente llamado MyClass.java y se compilaría en un archivo de clase bytecode llamado MyClass.class.

1

Usted puede tratar con /dev/stdin como archivo de origen (y, a continuación, tendrá que encontrar la opción que obliga javac a considerarlo como el código fuente de Java).

Pero me gustaría hacer un script de shell que ponga el stdin en algún archivo temporal con el sufijo .java.

Pero creo (no estoy seguro) que javac realmente quiere que se defina una clase Foo dentro de un archivo llamado Foo.java.

+0

Puede que no haya ninguna opción con Java de Sun para hacer eso. Con 'gcj' probablemente haya uno. –

0

Esto no es posible con javac simple - la razón es que la mayoría de los programas Java consisten en más de una clase, que generalmente también se distribuyen en más de un archivo fuente (unidad de compilación).

Probablemente pueda construir una herramienta que lo haga, utilizando la API del compilador de Java para la compilación real.

Debería crear un JavaFileManager que simule archivos por el texto de la entrada estándar, y pasar esto al compilador.

1

No puede hacerlo con Sun Java, pero puede escribir un script para manejar la conversión de stdin a algo que javac puede entender.

Algo parecido a este 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]) 

Tenga en cuenta que el script creará un archivo con el nombre de la clase en el directorio actual. Probablemente sea mejor utilizar algo en/tmp, pero tenga en cuenta que debe tener el mismo nombre que la clase. Si está probando el script, no haga algo como esto:

cat MyImportantJava.java | python javac-stdin.py 
Cuestiones relacionadas