web-dev-qa-db-fra.com

comment compiler plusieurs fichiers Java lorsqu'il y a des fichiers Java dans d'autres packages)

Je compile plusieurs fichiers dans un répertoire (javac * .Java) mais j'ai un problème lorsque j'essaye de faire ceci:

Je reçois des erreurs de compilation disant que javac ne peut pas trouver le symbole d'un objet.

J'ai plusieurs packages qui contiennent Java qui sont nécessaires pour exécuter le programme principal. Mais il semble que tenter de les compiler un par un ne fonctionnera pas. Il fonctionne très bien dans mon IDE mais je suis intéressé à savoir comment cela se fait via l'invite de commande.

Le programme principal se trouve dans le dossier des pilotes.

J'ai essayé de compiler les fichiers par ordre de dépendance mais cela n'a pas fonctionné.this is a screenshot of the folders

16
OKGimmeMoney

Javac documentation fournit toutes les informations nécessaires. Cependant, il peut être utile d'utiliser Ant ou Maven pour les générations en ligne de commande.

This page fournit un bon exemple d'utilisation du premier javac puis de Ant pour construire un projet simple.


Voici un exemple de projet et comment le compiler avec javac.

La structure arborescente du projet est la suivante:

   .
    ├── build
    └── src
        ├── attacks
        ├── drivers
        │   └── Driver.Java
        └── exceptions
            └── MyException.Java

Il existe deux répertoires spéciaux - build pour contenir les classes compilées et src pour contenir les fichiers source (peuvent se trouver dans différents sous-répertoires - packages).

La commande suivante compile l'ensemble du projet et place le résultat dans le répertoire build.

javac -sourcepath src -d build src/**/*.Java

Le -sourcepath src Spécifie le répertoire src comme l'endroit où toute la source peut être trouvée par le compilateur. Les options -d build Indiquent au compilateur où placer les fichiers compilés.

L'option src/**/*.Java Indique au compilateur les fichiers à compiler réellement. Dans ce cas spécifique, il indique à javac de regarder deux niveaux plus bas et de sélectionner tous les * .Java à ce niveau.

S'il existe des fichiers *.Java À différents niveaux, une liste de fichiers doit être spécifiée. Pour cela, on pourrait créer une telle liste en tant que fichier externe et passer ces fichiers comme option d'entrée pour javac.

Voici comment cela pourrait se faire sous Linux/Unix:

find -name "*.Java" > source.txt

La commande ci-dessus crée le fichier source.txt qui contient les chemins d'accès complets aux fichiers * .Java trouvés. Pour cet exemple, il contient:

./src/drivers/Driver.Java
./src/exceptions/MyException.Java

Afin de compiler le projet avec la liste des fichiers source vers source.txt, La commande suivante peut être utilisée:

javac -d build @source.txt

Veuillez noter que @source.txt Spécifié à la fin qui indique au compilateur où chercher une liste de fichiers source. Veuillez également noter que l'option -sourcepath Peut être omise.

Voici comment la structure du répertoire a changé après l'exécution de la commande ci-dessus.

.
├── build
│   ├── drivers
│   │   └── Driver.class
│   └── exceptions
│       └── MyException.class
└── src
    ├── attacks
    ├── drivers
    │   └── Driver.Java
    └── exceptions
        └── MyException.Java

Comme on peut le constater, le répertoire build contient désormais les fichiers de classe compilés dans les packages respectifs.

Et, si vous souhaitez l'exécuter, en supposant, par exemple, que Driver possède la méthode main, la commande suivante exécute le programme.

Java -cp .:build:**/*.class drivers.Driver

Veuillez noter que le séparateur de fichiers : (Deux-points) est utilisé sous Unix, pour Windows, changez-le en ; (Point-virgule).

21
01es

Je compile plusieurs fichiers dans un répertoire (javac * .Java)

Déjà mal. Cela ne fonctionnera correctement que si les classes Java ne sont pas dans des packages. La façon correcte de procéder est la suivante, où src est le nom du répertoire dans lequel tous vos répertoires de package sont enracinés:

cd src
javac package1/package2/*.Java
javac package3/package4/package5/*.Java

etc quelle que soit la disposition de votre package/répertoire. Chaque ligne de commande javac compilera tous les fichiers dans le répertoire nommé et tous les fichiers .Java dans d'autres packages/répertoires dont elle dépend qui ne sont pas déjà compilés ou qui sont sortis de date.

Voir la documentation de l'outil pour javac.

3
user207421

deux options:

1) Utilisez la ligne de commande pour spécifier tous les fichiers à compiler

2) Créez un fichier avec tous les noms de fichiers (sortie de find, peut-être), et exécutez javac @argfile

1
Niels Bech Nielsen