159 votes

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

Je suis en train d'utiliser le compilateur javac pour compiler des fichiers java dans mon projet. Les fichiers sont répartis sur plusieurs packages comme ceci : com.vistas.util, com.vistas.converter, com.vistas.LineHelper, com.current.mdcontect.

Chacun de ces packages contient plusieurs fichiers java. J'utilise javac de cette manière :

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

(en une seule 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 com ?

2 votes

Tu devrais vraiment jeter un coup d'œil aux outils comme Ant ou Maven.

0 votes

Ce post SO pourrait être utile stackoverflow.com/questions/864630/…

262voto

rlegendi Points 4763

Je suggérerais également d'utiliser un certain type d'outil de construction (Ant ou Maven, Ant est déjà suggéré et est plus facile à démarrer) ou un IDE qui gère la compilation (Eclipse utilise une compilation incrémentielle avec une stratégie de réconciliation, et vous n'avez même pas besoin de vous soucier d'appuyer sur un quelconque bouton "Compiler").

Utilisation de Javac

Si vous devez essayer quelque chose pour un projet plus important et que vous n'avez pas d'outils de construction appropriés à proximité, vous pouvez toujours utiliser une petite astuce que javac propose : les noms de classe à compiler peuvent être spécifiés dans un fichier. Il vous suffit de 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, c'est facile :

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • L'avantage est que c'est une solution rapide et facile.
  • L'inconvénient est que vous devez régénérer le fichier sources.txt à chaque fois que vous créez un nouveau fichier source ou que vous en renommez un existant, ce qui est une tâche facile à oublier (donc sujette aux erreurs) et fastidieuse.

Utilisation d'un outil de construction

À long terme, il est préférable d'utiliser un outil conçu pour construire des logiciels.

Utilisation de Ant

Si vous créez un simple fichier build.xml qui décrit comment construire le logiciel :

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 qui est 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 (comme NetBeans et Eclipse) offrent un excellent support pour l'écriture des fichiers de construction afin que vous n'ayez rien à télécharger dans ce cas.

Utilisation de Maven

Maven n'est pas si trivial à configurer et à utiliser, mais apprendre à l'utiliser en vaut la peine. Voici un excellent tutoriel pour démarrer un projet en 5 minutes.

  • Son principal avantage (pour moi) est qu'il gère également les dépendances, vous n'aurez donc pas besoin de télécharger d'autres fichiers Jar et de les gérer manuellement, et je l'ai trouvé plus utile pour la construction, l'emballage et les tests de projets plus importants.
  • L'inconvénient est qu'il a une courbe d'apprentissage abrupte, et si les plugins Maven aiment à supprimer les erreurs :-) Une autre chose est que beaucoup d'outils fonctionnent également avec les référentiels Maven (comme Sbt pour Scala, Ivy pour Ant, Graddle pour Groovy).

Utilisation d'un IDE

Ce qui pourrait augmenter votre productivité en développement. Il existe quelques alternatives open source (comme Eclipse et NetBeans, je préfère le premier) et même des alternatives commerciales (comme IntelliJ) qui sont assez populaires et puissantes.

Ils peuvent gérer la construction du projet en arrière-plan afin que vous n'ayez pas à vous occuper de tout le travail en ligne de commande. Cependant, il est toujours utile de savoir ce qui se passe réellement en arrière-plan pour pouvoir traquer les erreurs occasionnelles comme une ClassNotFoundException.

Une note additionnelle

Pour les projets plus importants, il est toujours conseillé d'utiliser un IDE et un outil de construction. Le premier augmente votre productivité, tandis que le second permet d'utiliser différents IDE avec le projet (par exemple, Maven peut générer des descripteurs de projet Eclipse avec une simple commande mvn eclipse:eclipse). De plus, disposer d'un projet qui peut être testé/construit avec une seule commande est facile à présenter à de nouveaux collègues et à un serveur d'intégration continue, par exemple. Un jeu d'enfant :-)

8 votes

Lorsque vous utilisez javac, il est préférable de spécifier un répertoire de sortie. find -name "*.java" > sources.txt && javac -d bin @sources.txt. Sinon, les fichiers *.class sont enregistrés dans le répertoire où se trouvent les sources.

1 votes

Absolument vrai. Bien que, à mon avis, si quelqu'un vient de commencer à jouer avec javac, le concept de CLASSPATH, comment exécuter du code avec java, comment gérer les packages, quel devrait être le dossier racine pour l'exécution, etc. ne sont généralement pas clairs. J'ai donc omis le répertoire de sortie. Quoi qu'il en soit, merci pour la suggestion!

9 votes

Pour les utilisateurs de Mac qui tombent sur cela, la commande find est : find . -name "*.java" > sources.txt (notez le .)

45voto

Matthieu Riegler Points 1546
trouver . -name "*.java" -print | xargs javac

Genre brutal, mais ça fonctionne comme de l'enfer. (À utiliser seulement sur de petits programmes, ce n'est absolument pas efficace)

1 votes

Si vous utilisez ceci, envisagez find ... -print0 et xargs -0 ... à la place pour ne pas casser sur les espaces dans les noms de fichiers

32voto

phtrivier Points 2711

Si votre shell le supporte, quelque chose comme ceci fonctionnerait-il ?

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

0 votes

J'ai tenté d'utiliser ceci dans l'invite de commandes sur Windows 10. Quelqu'un peut-il confirmer si cela fonctionne sur Windows 10 ou si je le fais mal s'il vous plaît

3voto

JB Nizet Points 250258

Je vous conseillerais d'apprendre à utiliser ant, qui est très bien adapté pour cette tâche et est très facile à comprendre et bien documenté.

Il vous suffirait de définir une cible comme ceci dans le fichier build.xml :

1voto

gvalenncia Points 31

La commande javac ne suit pas un processus de compilation récursif, vous devez donc soit spécifier chaque répertoire lors de l'exécution de la commande, soit fournir un fichier texte avec les répertoires que vous souhaitez inclure :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X