web-dev-qa-db-fra.com

Comment compiler un programme Java avec la bibliothèque .jar

Je ne peux pas faire que javac reconnaisse un fichier .jar externe, dont je tente d'étendre les classes. J'ai deux fichiers dans le même répertoire: TestConsole.Java et acm.jar. Je compile à partir du même répertoire en utilisant la commande suivante:

javac -classpath .:acm.jar TestConsole.Java

Mais il semble que javac ignore simplement acm.jar. Cela me donne l'erreur:

TestConsole.Java:1: package acm does not exist
import acm.program;
          ^

Bien sûr, acm.program est un paquet dans acm.jar. Toutes les classes dans acm.jar sont déjà compilées; Je veux juste les utiliser dans mes cours, pas les compiler.

Qu'est-ce que je fais mal?

J'exécute ceci sur un Mac et la structure de répertoire de acm.jar semble être valide: elle contient un répertoire acm/program, qui contient ConsoleProgram.class, la seule classe dont TestConsole s'étend.

javac -classpath ".:acm.jar" TestConsole.Java ne fonctionne pas non plus.

15
Rebecca Nelson

Liste de contrôle:

  1. vos classes dans acm.jar apparaissent sous la forme:

    acm/programme/CLASSX.class

    acm/programme/CLASSY.class

    décanté avec le pot tf acm.jar

  2. Vous les importez comme:

importer un programme.CLASSX;

ou

importer un programme. *;

2
Andrew
javac -cp <jar you want to include>;<jar you want to include> <source.Java> 

<jar you want to include> si dans le même répertoire, juste le nom du fichier jar fera, sinon, spécifier les chemins complets ou relatifs

si plus d'un bocal, séparer avec ,

remplacez ; par : sur unix

Si possible, utilisez des IDE comme Eclipse. J'avais l'habitude de passer beaucoup de temps sur des choses similaires, mais dans l'industrie, vous ne le ferez presque jamais de cette façon.

22
Bhushan

Exécutez-vous ces commandes sur une machine Windows? Sous Windows, les éléments du classpath sont séparés par un point-virgule et non par deux points. Alors:

javac -classpath .;acm.jar TestConsole.Java

Une autre possibilité: la structure de acm.jar est incorrecte. Il ne suffit pas que les fichiers de classe à l'intérieur aient été compilés à partir de fichiers déclarant package acm.program; la structure du paquet doit également être représentée comme une hiérarchie de répertoires. acm.jar doit donc contenir un répertoire acm, et à l'intérieur de celui-ci un sous-répertoire program contenant les fichiers de classe réels. classes utilisées dans TestConsole.

6

Quiconque essaie de compiler et a toujours le problème alors que je luttais pendant des heures, je suivais toutes les réponses ci-dessus mais je ne pouvais toujours pas exécuter le programme à cause d’un problème mineur.

La question évidente est le point-virgule après chaque colis. Je ne suis pas sûr à propos de Mac ou Linux, mais pour l'invite de commande Windows, c'était le cas

javac -cp mysql-connector-Java-8.0.12.jar; Testing.Java

Java -cp mysql-connector-Java-8.0.12.jar; Testing

Devrait suivre les deux cas de compilation ou en cours d'exécution.

0
Kirk