javac option pour compiler tous les fichiers java dans le cadre d'un répertoire de façon récursive
Je suis en utilisant le compilateur javac pour compiler les fichiers java dans mon projet. Les fichiers sont répartis sur plusieurs paquets comme ça: com.vistas.util
, com.vistas.converter
, com.vistas.LineHelper
, com.current.mdcontect
.
Chacun de ces paquets a plusieurs fichiers java. Je suis à l'aide de 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 le si de nombreux chemins, comment puis-je demander au compilateur pour compiler de manière récursive tous les fichiers java à partir du parent com annuaire?
- Vous devriez vraiment avoir un regard sur des outils tels que Ant ou Maven.
- Cette SORTE de post pourrait être utile stackoverflow.com/questions/864630/...
Vous devez vous connecter pour publier un commentaire.
Je vous suggère aussi d'utiliser un outil de construction (Ant ou Maven, Ant est déjà suggéré et il est plus facile pour commencer) ou un IDE qui gère la compilation (Eclipse utilise compilation incrémentielle à concilier stratégie, et vous n'avez même pas à les soins à appuyer sur une "Compiler" boutons).
À L'Aide De Javac
Si vous avez besoin d'essayer quelque chose pour un projet de plus grande envergure et n'ont pas de bon outils de construction à proximité, vous pouvez toujours utiliser un petit truc qui
javac
propose: les noms de classe à la compilation peut être spécifié 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
*.java
les fichiers dans votre projet, c'est facile:sources.txt
fichier chaque fois que vous créez une nouvelle source ou renommer un existant fichier qui est facile à oublier (et donc sujettes à l'erreur) et fastidieuse tâche.À l'aide d'un outil de construction
Sur le long terme, il est préférable d'utiliser un outil qui a été conçu pour développer des logiciels.
En Utilisant Ant
Si vous créez un simple
build.xml
fichier qui décrit la façon de construire le logiciel:vous pouvez compiler l'ensemble du logiciel en exécutant la commande suivante:
À L'Aide De Maven
Maven n'est pas trivial à configurer et à travailler avec, mais le fait d'apprendre qu'il paye bien. Voici un excellent tutoriel pour démarrer un projet dans un délai de 5 minutes.
L'aide d'un IDE
Maintenant que ce qui pourrait augmenter votre productivité du développement. Il y a quelques alternatives open source (comme Eclipse et NetBeans, je préfère l'ancien) et même commerciaux (comme IntelliJ) qui sont très populaires et puissants.
Ils peuvent gérer le projet de construction à l'arrière-plan de sorte que vous n'avez pas à traiter avec l'ensemble de la ligne de commande genre de choses. Cependant, il vient toujours à portée de main si vous savez ce que qui se passe réellement dans l'arrière-plan de sorte que vous pouvez chasser des erreurs occasionnelles, comme un
ClassNotFoundException
.Une remarque supplémentaire
Pour les grands projets, il est toujours conseillé d'utiliser un IDE et un outil de construction. L'ancien booste votre productivité, tandis que le second rend possible l'utilisation de plusieurs IDEs avec le projet (p. ex., Maven peut générer projet Eclipse descripteurs avec un simple
mvn eclipse:eclipse
de commande). En outre, un projet qui peut être testé/construit avec une seule ligne de commande est facile d'introduire de nouveaux collègues et dans un serveur d'intégration continue par exemple. Morceau de gâteau 🙂javac
, il serait préférable de spécifier un répertoire de sortie.find -name "*.java" > sources.txt && javac -d bin @sources.txt
. Autrement *.classe les fichiers sont enregistrés dans le répertoire des sources.javac
, le concept deCLASSPATH
, comment exécuter du code avecjava
, la façon de traiter avec les paquets qui doivent être à la racine du dossier en cours d'exécution, etc. sont généralement pas claire. Donc j'ai omis la sortie dir. De toute façon, merci pour la suggestion!find
commande est:find . -name "*.java" > sources.txt
(note de l'.
)Un peu brutal, mais fonctionne comme l'enfer. (A utiliser uniquement sur des petits programmes, il n'est absolument pas efficace)
find ... -print0
etxargs -0 ...
au lieu de ne pas casser sur des espaces dans les noms de fichiersSi votre shell prend en charge, serait quelque chose comme ce travail ?
Si votre shell ne prend pas en charge
**
, alors peut-êtrefonctionne (pour tous les forfaits avec 3 composants s'adaptent plus ou moins).
Dans le cas habituel où vous voulez compiler l'intégralité de votre projet, vous pouvez simplement fournir javac avec votre classe principale et laisser compiler toutes les dépendances nécessaires:
javac -sourcepath . path/to/Main.java
Main.java
, qui vous probablement ne serait pas juste après la création de votre deuxième fichier, rien d'autre n'obtient compilateur.Je vous conseille d'apprendre à l'aide de ant, ce qui est très bien adapté pour cette tâche et est très facile à comprendre et bien documenté.
Vous suffit de définir un objectif comme celui-ci dans la build.xml fichier:
javac -cp "jar_path/*" $(find . -name '*.java')
(Je préfère ne pas utiliser de xargs, car il peut les diviser et de les exécuter javac plusieurs fois, chacune avec un sous-ensemble de java fichiers, dont certains peuvent importer d'autres qui ne sont pas spécifiés sur la même ligne de commande javac)
Si vous avez un App.java point d'entrée, freaker son chemin avec -sourcepath est le meilleur. Il compile tous les autres java fichier dont il a besoin, à la suite de l'import-dépendances. par exemple:
javac -cp "jar_path/*" -sourcepath src/src/com/companyname/modulename/App.java
Vous pouvez aussi spécifier une cible de la classe fichier dir:
-d target/
.Je suis juste à l'aide de le faire avec un simple fichier "makefile" qui ressemble à ceci:
Il compile les sources d'un à la fois et seulement recompile si nécessaire.
javac commande n'est pas conforme récursive processus de compilation, donc vous devez spécifier chaque répertoire lors de l'exécution de la commande, ou de fournir un fichier texte avec les répertoires que vous souhaitez inclure:
J'ai été en utilisant ce dans un Xcode JNI projet récursive de construire mes classes de test: