[JAVA] [Pour les débutants] Où vérifier lorsqu'une classe est introuvable au moment de la compilation

Public cible de l'article

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.

Point de vue 1: le nom de la classe correspond-il?

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.

Point de vue 2: quel est le type de cours?

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.

Si la classe bootstrap n'est pas trouvée

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.

Si la classe dans le fichier jar est introuvable

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

Si la classe d'utilisateurs est introuvable

Dans ce cas, il y a encore quelques perspectives à examiner. Si tel est le cas, veuillez continuer à lire le contenu suivant.

Point de vue 3: le chemin de classe est-il correctement spécifié?

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.

Point de vue 3-1: La route du package est-elle spécifiée?

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. スクリーンショット 2020-05-25 16.25.32.png

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.

Point de vue 3-2: Le paramètre par défaut est-il désactivé?

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. スクリーンショット 2020-05-25 16.16.19.png

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. スクリーンショット 2020-05-25 17.00.46.png 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

À la fin

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

[Pour les débutants] Où vérifier lorsqu'une classe est introuvable au moment de la compilation
Consulter les notes de la classe java.util.Scanner
Consultez les notes de la classe java.util.Optional
Une note de révision pour la classe java.util.Objects
[Ubuntu] Que faire lorsque MongoDB ne peut pas être démarré en raison d'une erreur SocketException
Mémo à faire pour le moment lors de la construction de la série CentOS 6 avec VirtualBox
Points à surveiller lors de la création d'un framework
[Spring Boot] Comment créer un projet (pour les débutants)
Que faire si le référentiel Git ne peut pas être affiché dans Azure Team Explorer pour Eclipse