Tout le monde sait comment compiler du code source Java, c'est-à-direcmdse rendre dans le répertoire où se trouve le fichier sourcejavac **.javaet c'est tout. Lorsqu'un programme comporte une déclaration de package, peut-on encore simplement directementjavac **.java? La réponse est bien sûrnon, voici un exemple simple pour prouver ce qui se passe lorsqu'on compile directementjavac **.java.
Comme suit : dans le répertoire F:\javaweb2班\20160531 se trouve un fichier A.java. Notez que le fichier source comporte une déclaration de package :
Exemple

Maintenant, compilez A.java directement avec javac A.java, et le résultat est le suivant :
Nous pouvons clairement voir que le fichier bytecode A.class est apparu dans le répertoire courant. Peut-il s'exécuter directement comme ça ? Essayons !
Cette erreur est apparue parce que nous avons une déclaration de package dans A.java. Lors de l'exécution du fichier source A.java, la machine virtuelle Java cherche d'abord le fichier bytecode dans le répertoire courant de A.java. Bien qu'elle le trouve cette fois, comme il y a une déclaration de package dans A.java, la machine virtuelle Java va ensuite chercher le fichier bytecode A.class dans le répertoire du package. Ce n'est que lorsqu'elle le trouve là qu'elle peut s'exécuter avec succès. Si vous ne me croyez pas, faisons une expérience ! (Ici, je vais aussi vous apprendre à compiler A.java avec une déclaration de package, c'est-à-dire la compilation de package avec javac -d . A.java)
Maintenant, la compilation du package a réussi. À ce stade, nous pouvons voir que le fichier A.class est apparu dans le répertoire mypack. Essayons de l'exécuter.
À ce stade, nous constatons que l'exécution échoue encore ?? Pourquoi donc ?? C'est un problème que beaucoup de débutants rencontrent. Ici, tout le monde doit se rappeler un point : le paramètre de la commande Java est le "nom de classe pleinement qualifié", et non le "nom de fichier".
Le nom de classe pleinement qualifié de ce programme source devrait être mypack.A, donc il devrait être écrit comme ceci :java mypack.A
Maintenant, il peut s'exécuter avec succès !
Ne vous précipitez pas !! Il y a des choses encore plus passionnantes ci-dessous ! Pour ce qui est de l'utilisation des packages, comment pourrions-nous ne pas expliquer l'importation, la création et la compilation de packages !
Cette fois, nous introduisons une autre classe de test Test.java, avec le code suivant :
Exemple
Compilez et exécutez comme suit :

Le résultat, comme prévu, est certainement qu'il se compile et s'exécute. Le flux d'exécution est le suivant : après la compilation de Test.java, le fichier bytecode généré se trouve dans le répertoire courant (pendant la compilation, il vérifie s'il existe un fichier A.class dans mypack ; sinon, la compilation échoue). Lors de l'exécution, comme Test.java n'a pas de déclaration de package, la machine virtuelle Java trouve d'abord Test.class dans le répertoire courant et l'exécute. Lorsque l'exécution atteint l'endroit où la classe A est référencée dans le programme, la machine virtuelle Java vérifie s'il existe un fichier bytecode A.class dans le répertoire courant. À ce moment-là, même si elle en trouve un, elle entrera dans le package selon l'importation de package dans le programme source pour chercher A.class. Ce n'est que lorsqu'elle le trouve que l'exécution peut réussir (en fait, elle a déjà cherché pendant la phase de compilation !)
Pour aller plus loin : si nous ajoutons une déclaration de package package mypack1; à la classe de test Test.java,
Nous effectuons maintenant une compilation avec package sur Test.java. Ici, je veux expliquer à nouveau deux points de connaissance : 1. Lors d'une compilation avec package, le répertoire du package est créé automatiquement, et vous n'avez pas besoin de créer vous-même un dossier portant le nom du package ; 2. Lorsque plusieurs fichiers java du répertoire courant doivent être compilés ou compilés avec package,javac -d . *.javaLa commande peut compiler ou compiler avec package tous les fichiers java du répertoire courant selon qu'il y a ou non une déclaration de package dans le programme.
Maintenant, comment exécutons-nous le fichier Test.java ? java Test.java ? Évidemment, cela ne fonctionnera pas. Rappelez-vous ce que j'ai dit plus tôt : le paramètre de la commande Java est le « nom de classe pleinement qualifié », et non le « nom de fichier ».
Par conséquent, nous devons l'exécuter comme ceci :

De cette façon :
Tout ce qui a été discuté ci-dessus est le cas général, c'est-à-dire que le classpath se trouve dans le répertoire courant. Lorsque le classpath n'est pas dans le répertoire courant, peut-on encore l'exécuter ? Et comment doit-il être exécuté ?
Comme le montre la figure ci-dessous, j'ai placé Test.java dans le répertoire situé un niveau au-dessus. Dans ce cas, nous devons définir nous-mêmes le paramètre classpath. Par exemple :F:\javaweb2班>java -cp F:/javaweb2class/20160531 mypack1.java; ou dans n'importe quel répertoire :java -cp F:/javaweb2class/20160531 mypack1.java

De cette façon, cela fonctionne ! À vous d'analyser et de comprendre vous-même le déroulement précis de l'exécution !
Résumé
- 1. Le paramètre de la commande Java est le « nom de classe pleinement qualifié », et non le « nom de fichier ».
- 2. Lors d'une compilation avec package, le répertoire du package est créé automatiquement, et vous n'avez pas besoin de créer vous-même un dossier portant le nom du package.
- 3. Lorsque plusieurs fichiers java du répertoire courant doivent être compilés ou compilés avec package,javac -d . *.javaLa commande peut compiler ou compiler avec package tous les fichiers java du répertoire courant selon qu'il y a ou non une déclaration de package dans le programme.
- 4. Lorsque le classpath n'est pas dans le répertoire courant, vous devez utiliserjava -cp ..., par exemple :java -cp F:/javaweb2class/20160531 mypack1.java。
- 5. Comprenez bien le processus par lequel la machine virtuelle Java exécute les fichiers bytecode en fonction des déclarations de package et des imports de package.
Adresse originale : https://www.cnblogs.com/xiaoming0601/p/5551113.html