web-dev-qa-db-fra.com

option javac pour compiler tous les fichiers Java dans un répertoire donné de manière récursive

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?

108
user496934

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").

Utiliser Javac

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
  • L’avantage est qu’il s’agit d’une solution simple et rapide.
  • L’inconvénient est que vous devez régénérer le fichier 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).

Utiliser un outil de construction

Sur le long terme, il est préférable d’utiliser un outil conçu pour créer des logiciels.

Utiliser Ant

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
  • L'avantage est que vous utilisez un outil de construction standard facile à étendre.
  • L’inconvénient est que vous devez télécharger, configurer et apprendre un outil supplémentaire. Notez que la plupart des IDE (tels que NetBeans et Eclipse) offrent un excellent support pour l'écriture de fichiers de construction, vous n'avez donc rien à télécharger dans ce cas.

Utiliser Maven

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 .

  • L’avantage principal (pour moi) est qu’il gère également les dépendances. Vous n’avez donc pas besoin de télécharger des fichiers JAR et de les gérer à la main. Je l’ai trouvé plus utile pour la construction, l’emballage et le test de projets plus volumineux.
  • L’inconvénient est qu’elle nécessite beaucoup d’apprentissage et que les plugins Maven veulent supprimer les erreurs :-) Un autre problème est qu’un bon nombre d’outils fonctionnent également avec les dépôts Maven (comme Sbt pour Scala, Ivy pour Ant, Graddle pour Groovy).

Utiliser un IDE

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.

Une note supplémentaire

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 :-)

189
rlegendi
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)

39
Matthieu Riegler

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).

26
phtrivier

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

21
freaker

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>
3
JB Nizet

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.

2
Edward Doolittle

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
1
gvalenncia

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}
0
bishopthom