J'utilise le compilateur javac pour compiler des fichiers java dans mon projet. Les fichiers sont répartis sur plusieurs paquets 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 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 récursivement tous les fichiers java du répertoire com parent?
Réponses:
Je suggérerais également d'utiliser une sorte 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 à soin d'appuyer sur les boutons "Compiler" ).
Utilisation de Javac
Si vous avez besoin d'essayer quelque chose pour un projet plus grand et que vous n'avez pas d'outils de construction appropriés à proximité, vous pouvez toujours utiliser une petite astuce qui
javac
offre: les noms de classe à compiler peuvent être spécifiés dans un fichier. Vous devez simplement passer le nom du fichierjavac
avec le@
préfixe.Si vous pouvez créer une liste de tous les
*.java
fichiers de votre projet, c'est simple:sources.txt
fichier chaque fois que vous créez une nouvelle source ou que vous renommez un fichier existant, ce qui est une tâche facile à oublier (donc sujette aux erreurs) et fastidieuse.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
build.xml
fichier simple décrivant comment créer le logiciel:vous pouvez compiler l'ensemble du logiciel en exécutant la commande suivante:
Utiliser Maven
Maven n'est pas si simple à mettre en place et avec lequel travailler, mais l'apprendre paie bien. Voici un excellent tutoriel pour démarrer un projet en 5 minutes .
Utilisation d'un IDE
Voilà ce qui pourrait booster votre productivité de développement. Il existe quelques alternatives open source (comme Eclipse et NetBeans , je préfère la première) 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 toutes les commandes en ligne. Cependant, cela est toujours pratique si vous savez ce qui se passe réellement en arrière-plan afin de pouvoir traquer des erreurs occasionnelles comme un
ClassNotFoundException
.Une note supplémentaire
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
mvn eclipse:eclipse
commande). De plus, avoir un projet qui peut être testé / construit avec une seule ligne de commande est facile à introduire à de nouveaux collègues et dans un serveur d'intégration continue par exemple. Part de gâteau :-)la source
javac
, il serait 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.javac
, le concept deCLASSPATH
, comment exécuter du codejava
, comment gérer les paquets, qui devrait être le dossier racine pour l'exécution, etc. ne sont généralement pas clairs. Ainsi j'ai omis le dir de sortie. Quoi qu'il en soit, merci pour la suggestion!find
commande est:find . -name "*.java" > sources.txt
(notez le.
)Un peu brutal, mais ça marche comme l'enfer. (À n'utiliser que sur de petits programmes, ce n'est absolument pas efficace)
la source
find ... -print0
etxargs -0 ...
au lieu de ne pas casser sur les espaces dans les noms de fichiersSi votre shell le supporte, est-ce que quelque chose comme ça fonctionnerait?
Si votre shell ne prend pas en charge
**
, alors peut-êtrefonctionne (pour tous les packages avec 3 composants - adapter pour plus ou moins).
la source
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
la source
Main.java
, ce que vous ne feriez probablement pas juste après la création de votre deuxième fichier, rien d'autre n'obtient le compilateur.javac -cp "jar_path/*" $(find . -name '*.java')
(Je préfère ne pas utiliser xargs car il peut les diviser et exécuter javac plusieurs fois, chacun avec un sous-ensemble de fichiers java, dont certains peuvent en importer d'autres non spécifiés sur la même ligne de commande javac)
Si vous avez un point d'entrée App.java, la méthode freaker avec -sourcepath est la meilleure. Il compile tous les autres fichiers java dont il a besoin, en suivant les dépendances d'importation. par exemple:
javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java
Vous pouvez également spécifier une cible de classe fichier dir:
-d target/
.la source
Je vous conseille d'apprendre à utiliser la fourmi , qui est très bien adaptée à cette tâche et est très facile à comprendre et bien documentée.
Il vous suffirait de définir une cible comme celle-ci dans le fichier build.xml:
la source
J'utilise juste make avec un makefile simple qui ressemble à ceci:
Il compile les sources une à la fois et ne recompile que si nécessaire.
la source
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:
la source
J'ai utilisé ceci dans un projet Xcode JNI pour construire de manière récursive mes classes de test:
la source