Impossible d'exécuter avec java package name / class name
, alors que
Je me demandais ce que je pouvais faire avec java -classpath .package name / class name
,
J'ai trouvé ma propre solution de contournement sur la façon de l'exécuter avec java package name / class name
, donc je le posterai.
Si vous avez entré java package name / class name
(ou java package name.class name
) selon le manuel mais ne pouvez pas l'exécuter, veuillez essayer le contenu de cet article.
"Main.java" (appartient au paquet "hoge")
C'est un programme simple qui affiche "hello.java" dans le terminal lorsqu'il est exécuté. Le répertoire de stockage est "/Users/user/src/Java/sukiri1/Chapter6/hoge/Main.java".
Main.java
package hoge;
public class Main {
public static void main(String[] args) {
System.out.println("hello.java");
}
}
Je dois exécuter à partir du répertoire actuel où le fichier de classe est stocké, mais j'ai essayé d'exécuter à partir du chemin défini dans le chemin de classe dans ".bash_profile" où le fichier de classe correspondant n'est pas stocké. Trésor.
La cause est que la machine virtuelle Java (machine virtuelle) est allée chercher le fichier de classe au mauvais endroit.
Tout d'abord, définissez le répertoire courant sur "/ Users / user / src / Java / sukiri1 / Chapter 6" où le paquet "hoge" est stocké.
HIrokinoMacBook-Pro:hoge user$ cd /Users/user/src/Java/sukiri1/Chapter6
HIrokinoMacBook-Pro:Chapter6 user$
HIrokinoMacBook-Pro:Chapter6 user$ javac hoge/Main.java
HIrokinoMacBook-Pro:Chapter6 user$
java hoge / Main
J'ai eu une erreur disant "hoge.Main not found".
HIrokinoMacBook-Pro:Chapter6 user$ java hoge/Main
Erreur:Hoge de classe principale.Impossible de trouver et de charger Main
Cause: java.lang.ClassNotFoundException: hoge.Main
Entrez la commande suivante dans le terminal pour vérifier le chemin de classe actuel.
$ env | grep CLASSPATH
Le chemin défini dans "CLASSPATH =" de mon ".bash_profile" s'affiche. Dans "/Applications/Java/apache-tomcat-9.0.36/lib/servlet-api.jar", Le "hoge / Main.class" requis pour l'exécution du programme n'est pas stocké.
HIrokinoMacBook-Pro:Chapter6 user$ env | grep CLASSPATH
CLASSPATH=/Applications/Java/apache-tomcat-9.0.36/lib/servlet-api.jar
Référence ↓ Le ".bash_profile" de l'auteur
export JAVA_HOME="$(/usr/libexec/java_home -v 14.0.1)"
export CATALINA_HOME=/Applications/Java/apache-tomcat-9.0.36
export PATH="/usr/bin:${PATH}:${JAVA_HOME}"
export ANT_HOME=/Users/user/tool/apache-ant-1.10.8
export PATH=${PATH}:${ANT_HOME}/bin
export PATH=${PATH}:/Users/user/tool
export CATALINA_OPTS=-Dfile.encoding=UTF-8
export CLASSPATH=/Applications/Java/apache-tomcat-9.0.36/lib/servlet-api.jar
java -classpath .hoge / Main
Pour spécifier à partir de quel «emplacement» la machine virtuelle Java (machine virtuelle) doit lire les fichiers de classe requis Utilisez l'option "-classpath" pour spécifier le répertoire courant où "hoge / Main" est stocké. ". (Point)" fait référence au répertoire courant.
L'option "-classpath" a une fonction pour définir le chemin de classe pour chaque ** application **, Ici ** "Lancer l'application" hoge / Main "cette fois avec le" répertoire courant "comme chemin de classe!" ** C'est dit. Même si vous définissez le chemin d'accès aux classes dans la "variable d'environnement CLASSPATH" décrite ci-dessous, vous pouvez utiliser cette option. Le chemin d'accès aux classes défini dans la "variable d'environnement CLASSPATH" est invalidé et le chemin d'accès aux classes défini dans l'option "-classpath" est défini.
À propos de la "variable d'environnement CLASSPATH" Il s'agit d'une méthode pour pré-enregistrer le chemin de classe dans le système d'exploitation afin que vous n'ayez pas à indiquer à la VM Java l'emplacement avec "-class path" à chaque fois au moment de l'exécution. L'enregistrement du chemin de classe dans le système d'exploitation de cette manière s'applique à toutes les applications.
Quand j'ai tapé la commande "env | grep CLASSPATH" dans ④, le chemin défini dans "CLASSPATH =" de mon ".bash_profile" était affiché, mais c'est le chemin de classe enregistré dans l'OS. Sauf indication contraire avec "-classpath", ce chemin de classe défini dans la variable d'environnement est automatiquement appliqué, donc Si vous tapez la commande "env | grep CLASSPATH", elle ne sera pas dans le répertoire courant où sont stockés les fichiers de classe. Ce chemin de classe défini dans la variable d'environnement est envoyé au terminal.
Pour «-classpath» et «variable d'environnement CLASSPATH», reportez-vous aux articles suivants. L'article principal est très facile à comprendre. https://www.javaroad.jp/java_basic2.htm https://docs.oracle.com/javase/jp/6/technotes/tools/windows/classpath.html https://style.potepan.com/articles/17670.html https://www.atmarkit.co.jp/fjava/onepoint/java/jv_jcmd.html
Cela faisait longtemps, mais quand je l'ai exécuté avec java -classpath .hoge / Main
, cela fonctionnait bien comme ci-dessous.
HIrokinoMacBook-Pro:Chapter6 user$ java -classpath . hoge/Main
hello.java
Maintenant, à partir de là, je vais vous présenter la méthode d'exécution avec la commande "java package name / class name".
Entrez la commande suivante dans le terminal pour supprimer la variable d'environnement.
$ export CLASSPATH=
Entrez à nouveau $ env | grep CLASSPATH
, et ...
HIrokinoMacBook-Pro:Chapter6 user$ env | grep CLASSPATH
CLASSPATH=
J'ai pu confirmer que le chemin de classe a été supprimé.
référence Comment supprimer le chemin de classe http://javacafebreak.tripod.com/document/cpad_tips/cpad_classpath.html
Comment réécrire la variable d'environnement CLASSPATH à partir du terminal https://style.potepan.com/articles/17670.html
java hoge / Main
HIrokinoMacBook-Pro:Chapter6 user$ java hoge/Main
hello.java
C'est un succès.
En passant, vous pouvez également l'exécuter avec java hoge.Main
comme suit.
HIrokinoMacBook-Pro:Chapter6 user$ java hoge.Main
hello.java
Si aucun chemin de classe n'est spécifié dans la "variable d'environnement CLASSPATH" ou "-classpath"
Le répertoire courant est défini comme chemin de classe.
Par conséquent, même si vous entrez la commande sans inclure java hoge.Main
et le chemin de classe,
La machine virtuelle Java a pu trouver le package et les fichiers de classe, elle a donc pu s'exécuter.
Ça fait longtemps, mais c'est tout!