Je continue à recevoir des erreurs quand je fais mon .class
partie d'un package
et essayez de l'exécuter à partir de cmd.
Voici le code qui fonctionne après avoir utilisé javac
puis Java:
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
puis le code qui ne fonctionne pas:
package com;
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
me donnant cette erreur après avoir essayé d'exécuter le programme via la commande: Java HelloWorld
:
Exception in thread "main" Java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: com/HelloWorld)
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClass(Unknown Source)
at Java.security.SecureClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.access$100(Unknown Source)
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Voici ce que j'ai essayé de faire jusqu'à présent:
Java -cp . HelloWorld
Java -cp . com.HelloWorld
Java -cp . com/HelloWorld
Java HelloWorld
Java com.HelloWorld
Java com/HelloWorld
Gardez à l'esprit que javac
revient sans erreur et que la simple suppression de package com;
résout le problème. Parfois, dans d'autres scénarios, j'obtiens une erreur indiquant que le fichier de classe principal est introuvable ou quelque chose du genre.
Qu'est-ce que je fais mal?
Supposons que vous ayez cd C:/projects
et HelloWorld.class
est dans C:/projects/com
, puis tapez simplement:
Java com.HelloWorld
Les packages sont directement liés à l'emplacement de répertoire attendu du fichier.
Autrement dit, si vous disposez d'un fichier source avec la directive de package com
, il est prévu que le fichier réside dans le répertoire com
.
Dans votre exemple HelloWorld
, on s'attendrait à ce que le HelloWorld.Java
le fichier serait stocké dans le répertoire com
, comme com\HelloWorld.Java
Lorsque vous compilez le fichier, il créera un fichier de classe appelé HelloWorld.class
dans le répertoire com
, comme com\HelloWorld.class
De cette façon, lorsque Java va chercher le com.HelloWorld
class, il s'agit en fait de rechercher son chemin de classe et d'ajouter com\HelloWorld.class
jusqu'à ce qu'il trouve votre fichier de classe ou soit à court de chemin de classe
Exemple
J'ai donc copié votre HelloWorld.Java
_ (avec package) exemple à C:\Java\com\HelloWord.Java
Depuis la ligne de commande, je suis passé à C:\Java
répertoire ...
C:\Java>dir com
Volume in drive C is OS
Volume Serial Number is ####-####
Directory of C:\Java\com
09/08/2013 01:55 PM <DIR> .
09/08/2013 01:55 PM <DIR> ..
09/08/2013 01:55 PM 135 HelloWorld.Java
Ensuite, j'ai compilé le HelloWorld.Java
C:\Java>javac com\HelloWorld.Java
Ensuite, je l'ai couru ...
C:\Java>Java com.HelloWorld
Hello World!
Vous voudrez peut-être lire le tutoriel Packages
La syntaxe est:
Java -classpath /path/to/package-folder <packageName>.<MainClassName>
Vous pouvez donc essayer: Java com.HelloWorld
qui attendrait com/HelloWorld.class
le fichier présent comme chemin de classe pointe par défaut vers le répertoire courant (s'il n'est pas spécifié).
Si vous êtes dans un dossier différent, essayez de spécifier classpath:
$ CLASSPATH=/path/to/package-folder/ Java com.HelloWorld
Hello World!
$ Java -cp /path/to/package-folder/ com.HelloWorld
Hello World!
$ cd /path/to/package-folder/ && Java com.HelloWorld
Hello World!
Pour plus d'explications, vérifiez: Comment exécuter Java .class files?
Exécutez le programme à partir du répertoire parent du répertoire com.
Java com.HelloWorld
Supposons que le fichier se trouve dans C:/projects/com/HelloWorld et vous pouvez essayer les méthodes suivantes.
1.Java -cp c:/projects com.HelloWorld
2 .cd c:/projects
Java com.HelloWorld
(L'exemple 2 ne fonctionne pas dans de nombreuses situations, telles que Java process.)
s'il n'y a pas de déclaration de paquet et qu'il y aura un petit changement.
1.Java -cp c:/projects/com HelloWorld
2 .cd c:/projects/com
Java HelloWorld
(Ce n'est pas bon pour la même raison.)
alternativement, le chemin relatif sera correct mais comporte un certain risque. N'oubliez pas de mettre le fichier de classe à la fin de cmd.
Lorsque vous compilez le code Java code, utilisez -d, dans votre cas, ce serait
javac -d . com.HelloWorld.Java
Après la commande ci-dessus, Java génère un dossier nommé "com", sous le dossier "com", vous verrez votre HelloWorld.class
Ensuite, sous le même dossier que vous exécutez javac, exécutez la commande suivante
Java com.HelloWorld
Il pourrait y avoir un tel problème, lorsque vous exécutez la commande "Java" directement à partir du dossier de vos fichiers "* .class". Cette commande doit être exécutée à partir du répertoire "parent" du projet. Tout est bien expliqué dans l'article suivant:
Créez un dossier nommé com
sous Java et placez le HelloWorld.Java
dans le dossier com
. Exécutez ensuite à nouveau javac
et Java
.
Essayez d'utiliser un répertoire absolu ou placez votre HelloWorld.class dans ..\last_directory\com
1. Java -cp .......\last_directory com.HelloWorld
2. Java -cp .......\last_directory HelloWorld(with created com)
Vous n'avez pas besoin d'un indicateur -cp lors de l'exécution d'une classe Java, -cp nécessaire lors de l'exécution d'une classe ou d'un programme principal à partir d'un fichier binaire (jar). Lors de l'exécution d'un programme principal à partir d'une commande vous devez vous assurer que la classe se trouve dans la même structure de dossiers que le nom du package dans le fichier Java, ex.
home/user/foo Java com.test.className
here classNmae class file and exist under home/user/foo/com/test
j'espère que ça aide.