2011-01-21 6 views
65

El caso de uso es simple. Obtuve los archivos fuente que se crearon usando Eclipse. Entonces, hay una estructura de directorios profunda, donde cualquier clase de Java podría estar refiriendo a otra clase de Java en la misma carpeta, hijo, hermano o padre.Java: ¿cómo puedo compilar una estructura de directorio completa de código?

¿Cómo compilo todo esto desde el terminal usando javac?

+0

Por curiosidad, ¿qué SO estás usando - Windows, Linux, Mac, etc.? Esto podría ayudar a responder la pregunta –

+0

estoy usando linux. – euphoria83

+1

No he compilado java en la línea de comandos en un par de años, pero creo que si pasa el archivo que contiene su main() a javac, buscará todos los demás archivos que necesita compilar ya que todas sus dependencias pueden ser descubierto a partir del archivo que contiene main(). – Endophage

Respuesta

49

Tienes que conocer todos los directorios, o ser capaz de usar el comodín.

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java 
+1

me di cuenta: simplemente liste todos los archivos .java después de javac, ya sea usando sus nombres o comodines. – euphoria83

+22

O simplemente use 'javac $ (find.-name" * .java ")'. –

8

Usted tendría que utilizar algo como Ant para hacer esto de forma jerárquica:

http://ant.apache.org/manual/Tasks/javac.html

que necesitará para crear un script de construcción con un objetivo llamado compilación que contiene lo siguiente:

<javac sourcepath="" srcdir="${src}" 
     destdir="${build}" > 
    <include name="**/*.java"/> 
</javac> 

Entonces '' ll ser capaz de compilar todos los archivos ejecutando:

ant compile 

Como alternativa, importe su proyecto en Eclipse y compilará automáticamente todos los archivos fuente para ese proyecto.

+0

desafortunadamente, esto se debe hacer en un servidor que no admite hormiga. – euphoria83

12

Tomaría la sugerencia de Jon y usaría Ant, ya que esta es una tarea bastante compleja.

Sin embargo, si está decidido a obtenerlo todo en una línea en la Terminal, en Linux podría usar el comando find. Pero no lo recomiendo en absoluto, ya que no hay garantía de que, por ejemplo, Foo.java se compile después de Bar.java, aunque Foo usa Bar. Un ejemplo sería:

find . -type f -name "*.java" -exec javac {} \;

Si todas sus clases no se han compilado sin embargo, si hay un arnés principal o clase del controlador (básicamente, la que contiene el método principal), la compilación de esa clase principal debe individualmente compilar la mayor parte del proyecto, incluso si están en carpetas diferentes, ya que Javac intentará en la medida de sus posibilidades resolver problemas de dependencia.

+1

en windows se puede usar 'find_gnu. -type f -name "* .java" | xargs javac' una vez que la versión gnu de find.exe se renombra a find_gnu.exe. Obtuve mi gnu find.exe de msysgit. – n611x007

+0

O en lote puro de Windows: 'for/f" usebackq "% f in (' 'dir/s/b * .java'') do javac% f' (use comillas simples en' dir/s/b' pero no puedo encontrar una forma de formatearlo correctamente). – Matthieu

45

Con Bash 4, sólo puede activar Globstar

shopt -s globstar 

y luego hacer

javac **/*.java 
+2

o use zsh con oh-my-zsh :) – DmitrySandalov

2

Hay una manera de hacer esto sin necesidad de utilizar un carácter de barra vertical, lo cual es conveniente si usted está bifurcan un proceso de otro lenguaje de programación para hacer esto:

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} + 

, aunque si estás en Bash y/o no les importa usar un tubo, entonces usted puede hacer:

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR 
31

Si todo lo que quiere hacer es ejecutar su clase principal (sin compilar los archivos de .java el que la clase principal no depende), entonces usted puede hacer lo siguiente:

cd <root-package-directory> 
javac <complete-path-to-main-class> 

o

javac -cp <root-package-directory> <complete-path-to-main-class> 

javac le resolver automáticamente todas las dependencias y compilar todas las dependencias.

+3

Esta es, de lejos, la solución de trabajo más fácil. ¿Por qué a la gente no le gusta? – Alphaaa

+9

Probablemente porque su simplicidad ignora el hecho de que muchos trabajos de compilación para bibliotecas o códigos de soporte no tendrán un método principal que vincule a todas las dependencias requeridas. Es una buena respuesta, pero no una que usaría nunca en ninguna base de código/código público. – Ajax

+2

En mi humilde opinión, marcos o cualquier otro proyecto público debe utilizar algún tipo de gestión de compilación. Este tipo de compilación solo tiene sentido en pequeños proyectos privados. – svenwltr

9

A continuación se presenta el método que he encontrado:

1) Haga una lista de archivos con rutas relativas en un archivo (por ejemplo FilesList.txt) de la siguiente manera (ya sea el espacio o línea separada separado):

foo/AccessTestInterface.java 
foo/goo/AccessTestInterfaceImpl.java 

2) utilizar el comando:

javac @FilesList.txt -d classes 

Esto compilará todos los archivos y poner los archivos de clases dentro del directorio clases.

manera fácil de crear Ahora FilesList.txt es la siguiente: Vaya a su directorio raíz.

dir *.java /s /b > FilesList.txt 

Pero, esto poblará la ruta absoluta. Usando un editor de texto "Reemplazar todo" la ruta hasta el directorio de origen (incluya \ al final) con "" (es decir, cadena vacía) y Guardar.

+0

esta es la forma más "nativa", ya que javac admite un archivo "por lotes" – lovespring

+0

"dir * .java/s/b> Lista de archivos.txt" no funcionará si una ruta contiene espacios. javac se quejará de que FilesList.txt – aderesh

1

Solución de Windows: Suponiendo que todos los archivos contenidos en el subdirectorio 'src', y desea compilarlos en 'bin'.

for /r src %i in (*.java) do javac %i -sourcepath src -d bin 

Si src contiene un archivo .java inmediatamente debajo de ella, entonces esto es más rápido

javac src\\*.java -d bin 
+1

funciona, pero se llama a superslow-javac con un solo archivo por llamada, por lo que si tiene muchos de ellos ... –

7

El ya existente respuestas parecen sólo para referirse a sí mismo con el * archivos .java sí mismos y no cómo hacer fácilmente con archivos de la biblioteca que podrían ser necesarios para la construcción.

Una buena situación de una línea que recursivamente obtiene todos los archivos * .java e incluye *.archivos jar necesarios para la construcción es:

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java) 

Aquí el archivo bin es el destino de los archivos de clase, lib (y potencialmente el directorio de trabajo actual) contienen los archivos de la biblioteca y todos los archivos de Java en el directorio src y por debajo son compilado.

Cuestiones relacionadas