paquetes mundo hola ejemplos ejecutar consola con compilar comando java compiler-construction javac

mundo - Opción javac para compilar todos los archivos java bajo un directorio dado recursivamente



javac cmd (8)

El comando javac no sigue un proceso de compilación recursivo, por lo que debe especificar cada directorio al ejecutar el comando o proporcionar un archivo de texto con los directorios que desea incluir:

javac -classpath "${CLASSPATH}" @java_sources.txt

Estoy usando el compilador javac para compilar archivos java en mi proyecto. Los archivos se distribuyen en varios paquetes como este: com.vistas.util , com.vistas.converter , com.vistas.LineHelper , com.current.mdcontect .

Cada uno de estos paquetes tiene varios archivos java. Estoy usando javac así:

javac com/vistas/util/*.java com/vistas/converter/*.java com.vistas.LineHelper/*.java com/current/mdcontect/*.java

(en una línea)

En lugar de dar tantos caminos, ¿cómo puedo pedirle al compilador que compile recursivamente todos los archivos java del directorio padre com?


En el caso habitual en que desee compilar todo su proyecto, simplemente puede proporcionar javac a su clase principal y dejar que compile todas las dependencias requeridas:

javac -sourcepath . path/to/Main.java


He estado usando esto en un proyecto Xcode JNI para construir recursivamente mis clases de prueba:

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}


Si tu caparazón lo admite, ¿funcionaría algo así?

javac com/**/*.java

Si su caparazón no es compatible con ** , entonces tal vez

javac com/*/*/*.java

funciona (para todos los paquetes con 3 componentes - adaptarse para más o menos).


Solo estoy usando make con un simple archivo MAKE que se ve así:

JAVAC = javac -Xlint:unchecked sources = $(shell find . -type f -name ''*.java'') classes = $(sources:.java=.class) all : $(classes) clean : rm -f $(classes) %.class : %.java $(JAVAC) $<

Compila las fuentes de a una por vez y solo recompila si es necesario.


También sugeriría usar algún tipo de herramienta de compilación ( Ant o Maven , Ant ya está sugerido y es más fácil de empezar) o un IDE que maneja la compilación (Eclipse usa la compilación incremental con la estrategia de conciliación, y ni siquiera tiene que cuidado de presionar cualquier botón "Compilar" ).

Usando Javac

Si necesita probar algo para un proyecto más grande y no tiene herramientas de construcción adecuadas cerca, siempre puede usar un pequeño truco que javac ofrece: los nombres de clases para compilar se pueden especificar en un archivo. Simplemente debe pasar el nombre del archivo a javac con el prefijo @ .

Si puede crear una lista de todos los archivos *.java en su proyecto, es fácil:

# Linux $ find -name "*.java" > sources.txt $ javac @sources.txt :: Windows > dir /s /B *.java > sources.txt > javac @sources.txt

  • La ventaja es que es una solución rápida y fácil.
  • El inconveniente es que debe regenerar el archivo sources.txt cada vez que crea una nueva fuente o renombra un archivo existente, que es fácil de olvidar (y por lo tanto propenso a errores) y tedioso.

Usando una herramienta de compilación

A largo plazo, es mejor usar una herramienta que fue diseñada para crear software.

Usando hormiga

Si crea un archivo simple build.xml que describe cómo crear el software:

<project default="compile"> <target name="compile"> <mkdir dir="bin"/> <javac srcdir="src" destdir="bin"/> </target> </project>

puede compilar todo el software ejecutando el siguiente comando:

$ ant

  • La ventaja es que está utilizando una herramienta de compilación estándar que es fácil de ampliar.
  • El inconveniente es que debe descargar, configurar y aprender una herramienta adicional. Tenga en cuenta que la mayoría de los IDE (como NetBeans y Eclipse) ofrecen una gran compatibilidad para escribir archivos de compilación, por lo que no tiene que descargar nada en este caso.

Usando Maven

Maven no es tan trivial para establecer y trabajar, pero aprender vale la pena. Aquí hay un gran tutorial para comenzar un proyecto en 5 minutos .

  • Su principal ventaja (para mí) es que también maneja dependencias, por lo que no necesitará descargar más archivos Jar y administrarlos a mano, y me pareció más útil para crear, empaquetar y probar proyectos más grandes.
  • El inconveniente es que tiene una curva de aprendizaje abrupta, y si a los complementos de Maven les gusta suprimir errores :-) Otra cosa es que bastantes herramientas también operan con repositorios de Maven (como Sbt para Scala, Ivy para Ant, Graddle para Groovy) .

Usando un IDE

Ahora que lo que podría impulsar su productividad de desarrollo. Hay algunas alternativas de código abierto (como Eclipse y NetBeans , prefiero el primero) e incluso comerciales (como IntelliJ ) que son bastante populares y potentes.

Pueden administrar la construcción del proyecto en segundo plano para que no tenga que lidiar con todas las cosas de la línea de comando. Sin embargo, siempre es útil si sabes lo que sucede realmente en el fondo para poder buscar errores ocasionales como una ClassNotFoundException .

Una nota adicional

Para proyectos más grandes, siempre se recomienda usar un IDE y una herramienta de compilación. El primero aumenta su productividad, mientras que el segundo hace posible usar diferentes IDE con el proyecto (p. Ej., Maven puede generar descriptores de proyecto Eclipse con un simple mvn eclipse:eclipse ). Además, tener un proyecto que pueda ser probado / construido con un único comando de línea es fácil de presentar a nuevos colegas y en un servidor de integración continua, por ejemplo. Pedazo de pastel :-)


Te aconsejaría que aprendieras a usar hormiga , que es muy adecuada para esta tarea y es muy fácil de entender y documentar.

Solo tendría que definir un objetivo como este en el archivo build.xml:

<target name="compile"> <javac srcdir="your/source/directory" destdir="your/output/directory" classpath="xyz.jar" /> </target>


find . -name "*.java" -print | xargs javac

Un poco brutal, pero funciona como el infierno. (Usar solo en programas pequeños, no es absolutamente eficiente)