Quand j'ai pensé à compiler et exécuter des commandes Java par moi-même, Écrivez le code source, créez une hiérarchie de dossiers, placez le code source, etc. Quand il s'agit de compiler avec la commande javac
"Impossible de trouver le symbole"
N'est-il pas possible de créer un fichier de classe pour toujours à cause de cette seule ligne? Étant donné que les erreurs syntaxiques fournissent des informations relativement détaillées, il est facile d'en identifier la cause. Concernant l'erreur que la classe ne peut pas être trouvée, les points de correction sont différents selon le contenu de l'implémentation, donc Il n'y a rien de tel que "Si vous corrigez cela, ce sera corrigé!"
Mais ce dont un débutant a vraiment besoin, c'est Ce ne sont pas des informations qui ne peuvent être utilisées que dans des cas individuels tels que "comment réparer" Il peut être réutilisé car "la cause peut être comprise en regardant ici en raison du mécanisme" Je pense que c'est le débogage des connaissances.
Cette fois, quand j'ai étudié le mécanisme autour de la compilation, pour "Je ne trouve pas le symbole" Je suis venu voir comment l'aborder, alors Je voudrais présenter ma procédure de débogage à ce stade.
Les rayures doivent être peu profondes. À la suite de la réalisation d'une grande enquête dans la perspective de l'introduire plus tard,
C'est trop douloureux un jour où la cause de l'erreur était juste une faute de frappe,
Tout d'abord, la déclaration de la classe Test.java est-elle définie sur
public class Tst``` (un exemple)?
Je soupçonne une erreur de frappe.
À l'exception de la déclaration de classe et de la spécification de package, vous serez pris dans des erreurs de syntaxe.
Je ne poursuis pas aussi loin.
Le type ici est la classe qui ne peut pas être trouvée Que ce soit la ** classe d'amorçage ** ou la ** classe stockée dans le fichier jar ** Est-ce une ** classe d'utilisateurs **?
Si vous voulez en savoir plus sur la classe bootstrap et la classe utilisateur, Découvrez les chargeurs de classe Java et la recherche de type au moment de la compilation.
Je vais sauter les détails ici et vous donner une introduction approximative.
Ce qui peut être jugé ici, c'est la classe qui ne peut être trouvée Dans le cas de la classe bootstrap, définissez "Variable d'environnement Java qui spécifie JDK" Dans le cas des classes d'utilisateurs, cela signifie douter de la "variable de chemin de classe".
Je ne peux pas dire si c'est une classe bootstrap. Dans ce cas, reportez-vous au Core API Document.
Le JDK n'ayant pas été spécifié, la variable d'environnement "JAVA_HOME" est Voyons s'il est correctement défini. Il existe de nombreux articles sur la façon de définir JAVA_HOME, je vais donc l'omettre.
La spécification du chemin de classe dans le fichier jar est légèrement différente de la spécification du chemin de classe dans le fichier de classe. Cependant, la seule différence est de savoir si vous spécifiez un répertoire ou le fichier jar lui-même. Vérifions si la syntaxe de la commande est correcte.
#Pour pot
$ javac -classpath /lib/example-lib.jar Example.java
#Pour les fichiers de classe
$ javac -classpath /lib Example.java
Dans ce cas, il y a encore quelques perspectives à examiner. Si tel est le cas, veuillez continuer à lire le contenu suivant.
Chargement des classes d'utilisateurs et des bibliothèques tierces Le chemin de classe doit être spécifié correctement dans les lapins et les coins, Si vous ne comprenez pas correctement le mécanisme de la spécification de chemin de classe, cela ne fonctionnera pas.
Ci-dessous, nous présenterons les points de vue lors de l'examen du chemin de classe. Vous n'avez pas à enquêter dans l'ordre d'introduction.
En dehors de cela, il a été poussé par d'autres explications et ignoré. Le fait que "si vous spécifiez une hiérarchie de package dans le chemin de classe, elle ne sera pas importée avec succès". Je suppose que c'est trop évident pour être écrit, mais je me suis fait prendre ici.
Cela signifie qu'il existe la structure de dossiers suivante et dans UseCommons.java
Supposons que vous importiez
com.example.util '' parce que vous souhaitez utiliser StrFactory.
UseCommons.java
package com.example.util;
Dans le cas ci-dessus, src est reconnu comme la racine du package et com ~ app est reconnu comme la hiérarchie du package. Ce que j'ai fait lors de la compilation de ces
#Le répertoire actuel est/src
$ javac -classpath /src/com/example/util com/example/app/UseCommons.java
Comme mentionné ci-dessus, en spécifiant `` / src / com / example / utildans le chemin de classe, Je voulais charger les classes sous util et compiler UseCommons.java. Cependant, Java suit la hiérarchie des packages à partir du répertoire spécifié par le chemin de classe ** Avec les paramètres ci-dessus, lorsque UseCommons.java accède à StrFactory.java,
/src/com/example/util/com/example/util```J'irai le voir.
En d'autres termes, le chemin de classe correct est le suivant, en spécifiant la racine du package src.
#Le répertoire actuel est/src
$ javac -classpath /src com/example/app/UseCommons.java
Du point de vue ci-dessus, avec la racine du package spécifiée dans l'option -classpath À l'endroit où le contenu de l'instruction d'importation déclarée dans le fichier de classe est concaténé Vérifions si la classe que vous souhaitez charger est placée.
Je pense que c'est le meilleur auteur-compositeur. Ce qui a été défini par défaut est écrasé en spécifiant des options, etc. Si les paramètres requis sont désactivés, il est difficile de le remarquer car vous n'en avez généralement pas conscience.
-classpath est généralement défini sur ". (Répertoire actuel)". Dans cet esprit, jetez un œil à l'exemple ci-dessous.
Initialement, il avait la configuration ci-dessus, vous pouvez donc le compiler normalement avec la commande suivante.
#Le répertoire actuel est/src
$ javac com/example/app/UseCommons.java
Cependant, après cela, utilisez la bibliothèque externe "commons-lang3-3.10.jar" dans UseCommons.java. J'ai décidé de l'utiliser et j'ai changé la structure des dossiers comme suit. Ensuite, quand j'ai ajouté la bibliothèque commune au chemin de classe et exécuté la commande suivante, J'obtiens une erreur indiquant que StrFactory ne peut pas être trouvé.
#Le répertoire actuel est/src
$ javac -classpath /lib/commons-lang3-3.10.jar com/example/app/UseCommons.java
Il s'agit du paramètre par défaut de l'option classpath ". (Le répertoire actuel dans l'exemple est / src)" C'est parce que Java ne peut plus rechercher de classes sous src car il a été écrasé. Par conséquent, si vous modifiez la commande ci-dessus comme suit, l'erreur sera résolue.
#Le répertoire actuel est/src
$ javac -classpath /lib/commons-lang3-3.10.jar:. com/example/app/UseCommons.java
C'est la perspective de débogage à la compilation que je peux avoir aujourd'hui. Je pense qu'il y a plusieurs autres perspectives, donc c'est juste pour les débutants d'étudier. J'espère que vous le reconnaîtrez comme une aide pour la première étape. Plus la perspective est large, mieux c'est, alors je voudrais approfondir mon apprentissage.
J'ai également écrit sur la compilation Java dans d'autres articles, donc Si vous êtes intéressé par le fonctionnement de la compilation, veuillez également vous référer aux articles suivants.
Lien vers l'article: [Introduction aux commandes Java Chapitre 3 Compilation du code source](https://qiita.com/maple_syrup/items/c0aa2eacb8f486dc52a8#%E7%AC%AC%EF%BC%93%E7%AB% A0-% E3% 82% BD% E3% 83% BC% E3% 82% B9% E3% 82% B3% E3% 83% BC% E3% 83% 89% E3% 82% 92% E3% 82% B3 % E3% 83% B3% E3% 83% 91% E3% 82% A4% E3% 83% AB% E3% 81% 99% E3% 82% 8B)
Recommended Posts