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