J'utilise le compilateur javac pour compiler des fichiers Java dans mon projet. Les fichiers sont répartis sur plusieurs packages tels que: com.vistas.util
, com.vistas.converter
, com.vistas.LineHelper
, com.current.mdcontect
.
Chacun de ces packages contient plusieurs fichiers Java. J'utilise javac comme ceci:
javac com/vistas/util/*.Java com/vistas/converter/*.Java
com.vistas.LineHelper/*.Java com/current/mdcontect/*.Java
(en une ligne)
Au lieu de donner autant de chemins, comment puis-je demander au compilateur de compiler de manière récursive tous les fichiers Java du répertoire parent parent?
Je suggérerais également d’utiliser un type d’outil de compilation ( Ant ou Maven , Ant est déjà suggéré et plus facile à démarrer) ou un IDE qui gère la compilation (Eclipse utilise la compilation incrémentale avec la stratégie de réconciliation, et vous ne devez même pas vous soucier d’appuyer sur les boutons "Compiler").
Si vous avez besoin d'essayer quelque chose pour un projet plus important et que vous ne disposez pas des outils de construction appropriés à proximité, vous pouvez toujours utiliser une petite astuce proposée par javac
: les noms de classe à compiler peuvent être spécifiés dans un fichier. Vous devez simplement passer le nom du fichier à javac
avec le préfixe @
.
Si vous pouvez créer une liste de tous les fichiers *.Java
de votre projet, rien de plus simple:
# Linux / MacOS
$ find -name "*.Java" > sources.txt
$ javac @sources.txt
:: Windows
> dir /s /B *.Java > sources.txt
> javac @sources.txt
sources.txt
chaque fois que vous créez une nouvelle source ou renommez un fichier existant, ce qui est une tâche fastidieuse et facile à oublier (donc sujette aux erreurs).Sur le long terme, il est préférable d’utiliser un outil conçu pour créer des logiciels.
Si vous créez un simple fichier build.xml
décrivant comment construire le logiciel:
<project default="compile">
<target name="compile">
<mkdir dir="bin"/>
<javac srcdir="src" destdir="bin"/>
</target>
</project>
vous pouvez compiler l’ensemble du logiciel en exécutant la commande suivante:
$ ant
Maven n’est pas si simple à installer et à utiliser, mais l’apprentissage en vaut la peine. Voici un excellent tutoriel pour démarrer un projet en moins de 5 minutes .
Maintenant, qu'est-ce qui pourrait augmenter votre productivité de développement? Il existe quelques alternatives open source (comme Eclipse et NetBeans , je préfère le premier) et même commerciales (comme IntelliJ ) qui sont très populaires et puissantes.
Ils peuvent gérer la construction du projet en arrière-plan afin que vous n'ayez pas à traiter tous les éléments de la ligne de commande. Cependant, il est toujours utile de savoir ce que se produit réellement en arrière-plan, ce qui vous permet de rechercher les erreurs occasionnelles comme une variable ClassNotFoundException
.
Pour les projets plus importants, il est toujours conseillé d'utiliser un outil de construction IDE . Le premier augmente votre productivité, tandis que le second permet d'utiliser différents IDE avec le projet (Maven peut, par exemple, générer des descripteurs de projet Eclipse avec une simple commande mvn Eclipse:eclipse
). De plus, il est facile de présenter un projet pouvant être testé/construit avec une seule ligne de commande à de nouveaux collègues et à un serveur d'intégration continue par exemple. Part de gâteau :-)
find . -name "*.Java" -print | xargs javac
Un peu brutal, mais fonctionne comme un diable. (Utilisez uniquement sur de petits programmes, ce n'est absolument pas efficace)
Si votre shell le supporte, cela pourrait-il fonctionner?
javac com/**/*.Java
Si votre Shell ne supporte pas **
, alors peut-être
javac com/*/*/*.Java
fonctionne (pour tous les paquets avec 3 composants - adapter pour plus ou moins).
Dans le cas habituel où vous souhaitez compiler l'ensemble de votre projet, vous pouvez simplement fournir javac avec votre classe principale et le laisser compiler toutes les dépendances requises:
javac -sourcepath . path/to/Main.Java
Je vous conseillerais d'apprendre à utiliser ant , qui convient très bien à cette tâche et qui est très facile à comprendre et bien documenté.
Il vous suffira de définir une cible comme celle-ci dans le fichier build.xml:
<target name="compile">
<javac srcdir="your/source/directory"
destdir="your/output/directory"
classpath="xyz.jar" />
</target>
J'utilise juste make avec un simple makefile qui ressemble à ceci:
JAVAC = javac -Xlint:unchecked
sources = $(Shell find . -type f -name '*.Java')
classes = $(sources:.Java=.class)
all : $(classes)
clean :
rm -f $(classes)
%.class : %.Java
$(JAVAC) $<
Il compile les sources une à la fois et ne le recompile que si nécessaire.
la commande javac ne suit pas un processus de compilation récursive. Vous devez donc spécifier chaque répertoire lors de l'exécution de la commande ou fournir un fichier texte avec les répertoires à inclure:
javac -classpath "${CLASSPATH}" @Java_sources.txt
Je l'utilise dans un projet Xcode JNI pour construire de manière récursive mes classes de test:
find ${PROJECT_DIR} -name "*.Java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}