web-dev-qa-db-fra.com

Java: Comment puis-je compiler une structure de répertoire complète de code?

Le cas d'utilisation est simple. J'ai obtenu les fichiers source créés à l'aide d'Eclipse. Il existe donc une structure de répertoires profonde dans laquelle toute classe Java pourrait faire référence à une autre classe Java dans le même dossier, enfant, frère ou parent.

Comment puis-je compiler tout cela depuis le terminal en utilisant javac?

75
euphoria83

Vous devez connaître tous les répertoires, ou être capable d'utiliser un joker.

javac dir1/*.Java dir2/*.Java dir3/dir4/*.Java dir3/dir5/*.Java dir6/*src/*.Java
52
Manidip Sengupta

Avec Bash 4, vous pouvez simplement activer globstar

shopt -s globstar

et ensuite

javac **/*.Java
46
Daniel Lubarov

Si tout ce que vous voulez faire est d’exécuter votre classe principale (sans compiler le fichier .Java fichiers dont la classe principale ne dépend pas), vous pouvez effectuer les opérations suivantes:

cd <root-package-directory>
javac <complete-path-to-main-class>

ou

javac -cp <root-package-directory> <complete-path-to-main-class>

javac résoudrait automatiquement toutes les dépendances et les compilerait également.

36
Bharat Khatri

Je prendrais la suggestion de Jon et utiliserais Ant, car il s’agit d’une tâche assez complexe.

Cependant, si vous êtes déterminé à tout obtenir sur une seule ligne du terminal, vous pouvez utiliser la commande find . Mais je ne le recommande pas du tout, car rien ne garantit que Foo.Java sera compilé après Bar.Java, même si Foo utilise Bar. Un exemple serait:

find . -type f -name "*.Java" -exec javac {} \;

Si toutes vos classes n'ont pas encore été compilées, s'il existe une classe de harnais ou de pilote principale (essentiellement celle contenant votre méthode principale), la compilation individuelle de cette classe principale devrait compiler la plupart des projets, même s'ils se trouvent dans des dossiers différents, car Javac fera de son mieux pour résoudre les problèmes de dépendance.

12
Zach L

Voici la méthode que j'ai trouvée:

1) Créez une liste de fichiers avec des chemins relatifs dans un fichier (par exemple, FilesList.txt) comme suit (séparés par des espaces ou des lignes):

foo/AccessTestInterface.Java
foo/goo/AccessTestInterfaceImpl.Java

2) Utilisez la commande:

javac @FilesList.txt -d classes

Cela compilera tous les fichiers et placera les fichiers de classe dans le répertoire classes.

Voici un moyen simple de créer FilesList.txt: Accédez au répertoire racine de votre source.

dir *.Java /s /b > FilesList.txt

Mais, cela va peupler le chemin absolu. En utilisant un éditeur de texte "Remplacer tout", le chemin jusqu’au répertoire source (inclure\à la fin) avec "" (c’est-à-dire une chaîne vide) et Enregistrer.

10
Ameya Gokhale

Vous devez utiliser quelque chose comme Ant pour le faire de manière hiérarchique:

http://ant.Apache.org/manual/Tasks/javac.html

Vous devrez créer un script de construction avec une cible appelée compile contenant les éléments suivants:

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.Java"/>
</javac>

Ensuite, vous pourrez compiler tous les fichiers en lançant:

 ant compile

Vous pouvez également importer votre projet dans Eclipse, qui compilera automatiquement tous les fichiers source de ce projet.

9
Jon

Les réponses existantes semblent ne concerner que les fichiers * .Java eux-mêmes et ne pas expliquer comment le faire facilement avec des fichiers de bibliothèque éventuellement nécessaires à la construction.

Une situation sympa sur une ligne qui récupère de manière récursive tous les fichiers * .Java et inclut les fichiers * .jar nécessaires à la construction est la suivante:

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .Java)

Ici, le fichier bin est la destination des fichiers de classe, lib (et éventuellement le répertoire de travail en cours) contient les fichiers de bibliothèque et tous les fichiers Java du répertoire src et des répertoires inférieurs sont compilés).

9
demongolem

Solution Windows: Supposons que tous les fichiers contenus dans le sous-répertoire "src" et que vous souhaitez les compiler dans "bin".

for /r src %i in (*.Java) do javac %i -sourcepath src -d bin

Si src contient un fichier .Java immédiatement en dessous, cela est plus rapide

javac src\\*.Java -d bin
2
Mike

Il existe un moyen de le faire sans utiliser de caractère majuscule, ce qui est pratique si vous utilisez un processus d'un autre langage de programmation pour le faire:

find $Java_SRC_DIR -name '*.Java' -exec javac -d $OUTPUT_DIR {} +

Bien que si vous êtes dans Bash et/ou que cela ne vous dérange pas d'utiliser un tuyau, alors vous pouvez faire:

find $Java_SRC_DIR -name '*.Java' | xargs javac -d $OUTPUT_DIR
2
bolinfest