Estoy usando el compilador javac para compilar archivos java en mi proyecto. Los archivos se distribuyen en varios paquetes de la siguiente manera: 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 tantas rutas, ¿cómo puedo pedirle al compilador que compile recursivamente todos los archivos java del directorio com primario?
Respuestas:
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 comenzar con él) o un IDE que maneja la compilación (Eclipse usa compilación incremental con estrategia de conciliación, y ni siquiera tiene que hacerlo cuidado de presionar cualquier botón "Compilar" ).
Usando Javac
Si necesita probar algo para un proyecto más grande y no tiene ninguna herramienta de compilación adecuada cerca, siempre puede usar un pequeño truco que
javac
ofrece: los nombres de clase para compilar se pueden especificar en un archivo. Simplemente tiene que pasar el nombre del archivojavac
con el@
prefijo.Si puede crear una lista de todos los
*.java
archivos en su proyecto, es fácil:sources.txt
archivo cada vez que crea una nueva fuente o cambia el nombre de un archivo existente, lo cual es una tarea fácil de olvidar (propensa a errores) y agotadora.Usando una herramienta de construcción
A la larga, es mejor usar una herramienta diseñada para crear software.
Usando hormiga
Si crea un
build.xml
archivo simple que describe cómo construir el software:Puede compilar todo el software ejecutando el siguiente comando:
Usando Maven
Maven no es tan trivial de configurar y trabajar, pero aprenderlo paga bien. Aquí hay un gran tutorial para comenzar un proyecto en 5 minutos .
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 las primeras) 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 comandos. Sin embargo, siempre resulta útil si sabe lo que sucede realmente en segundo plano para poder detectar errores ocasionales como a
ClassNotFoundException
.Una nota adicional
Para proyectos más grandes, siempre se recomienda utilizar un IDE y una herramienta de compilación. El primero aumenta su productividad, mientras que el segundo hace posible utilizar diferentes IDEs con el proyecto (por ejemplo, Maven puede generar descriptores de proyecto Eclipse con un simple
mvn eclipse:eclipse
comando). Además, tener un proyecto que se pueda probar / construir con un solo comando de línea es fácil de presentar a nuevos colegas y, por ejemplo, en un servidor de integración continua. Pedazo de pastel :-)fuente
javac
, sería mejor especificar un directorio de salida.find -name "*.java" > sources.txt && javac -d bin @sources.txt
. De lo contrario, los archivos * .class se guardan en el directorio donde están las fuentes.javac
, el concepto deCLASSPATH
cómo ejecutar el códigojava
, cómo manejar los paquetes, que debería ser la carpeta raíz para ejecutar, etc., generalmente no está claro. Por lo tanto, omití el directorio de salida. De todos modos, gracias por la sugerencia!find
comando es:find . -name "*.java" > sources.txt
(tenga en cuenta el.
)Un poco brutal, pero funciona como el infierno. (Usar solo en programas pequeños, no es absolutamente eficiente)
fuente
find ... -print0
y, enxargs -0 ...
cambio, no rompa los espacios en los nombres de archivoSi su shell lo admite, ¿funcionaría algo así?
Si su shell no es compatible
**
, entonces tal vezfunciona (para todos los paquetes con 3 componentes - adaptar para más o menos).
fuente
En el caso habitual en el que desea compilar todo su proyecto, simplemente puede proporcionar javac con su clase principal y dejar que compile todas las dependencias requeridas:
javac -sourcepath . path/to/Main.java
fuente
Main.java
, lo que probablemente no haría después de crear su segundo archivo, nada más se compila.javac -cp "jar_path/*" $(find . -name '*.java')
(Prefiero no usar xargs porque puede dividirlos y ejecutar javac varias veces, cada uno con un subconjunto de archivos java, algunos de los cuales pueden importar otros no especificados en la misma línea de comando javac)
Si tiene un punto de entrada App.java, lo mejor es la forma de freaker con -sourcepath. Compila todos los demás archivos java que necesita, siguiendo las dependencias de importación. p.ej:
javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java
También puede especificar una clase de archivo de destino-dir:
-d target/
.fuente
Le aconsejaría que aprenda a usar la hormiga , que es muy adecuada para esta tarea y es muy fácil de entender y está bien documentada.
Simplemente tendría que definir un objetivo como este en el archivo build.xml:
fuente
Solo estoy usando make con un simple makefile que se ve así:
Compila las fuentes de una en una y solo se vuelve a compilar si es necesario.
fuente
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:
fuente
He estado usando esto en un proyecto Xcode JNI para construir recursivamente mis clases de prueba:
fuente