J'ai écrit un programme Java pour tester les services Web RESTful en utilisant Netbeans7.0.1 et cela fonctionne très bien là-bas. Maintenant, j'ai écrit le fichier build.xml pour compiler le code et quand j'essaie d'exécuter le généré Fichier .class J'ai toujours eu cette exception:
Exception in thread "main" Java.lang.NoClassDefFoundError: ClientREST (wrong name: clientrest/ClientREST)
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClassCond(ClassLoader.Java:632)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:616)
at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:141)
at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:283)
at Java.net.URLClassLoader.access$000(URLClassLoader.Java:58)
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:197)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:307)
at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:248)
Could not find the main class: ClientREST. Program will exit.
Le nom et le chemin d'accès sont corrects, alors quelles sont les raisons pour lesquelles je reçois cette exception?
Exception dans le thread "principal" Java.lang.NoClassDefFoundError: ClientREST
Vous l'avez donc exécuté en tant que Java ClientREST
. Il attend un ClientREST.class
sans package
.
(nom incorrect: clientrest/ClientREST)
Hé, la classe essaie de vous dire qu'elle a un package clientrest;
. Vous devez l'exécuter à partir de la racine du package. Remontez d'un dossier pour vous trouver dans le dossier qui contient à son tour le dossier clientrest
représentant le package, puis exécutez Java clientrest.ClientREST
.
Vous devez pas aller dans le dossier du package clientrest
et exécuter Java ClientREST
.
J'ai rencontré cette erreur en utilisant la ligne de commande Java:
Java -cp stuff/src/mypackage Test
où Test.Java
réside dans le package mypackage
.
Au lieu de cela, vous devez définir le chemin de classe -cp
dans le dossier de base, dans ce cas, src, puis ajoutez le package au nom de fichier.
Donc, cela finira par ressembler à ceci:
Java -cp stuff/src mypackage.Test
Pour en savoir plus sur la réponse de Garry: Le chemin de classe est le répertoire de base où réside la classe elle-même. Donc, si le fichier de classe est ici -
/home/person/javastuff/classes/package1/subpackage/javaThing.class
Vous devez référencer le chemin de classe comme suit:
/ accueil/personne/javastuff/cours
Donc, pour exécuter à partir de la ligne de commande, la commande complète serait -
Java -cp/home/person/javastuff/classes package1/subpackage/javaThing
c'est-à-dire que le modèle pour ce qui précède est
Java_executable -cp classpath the_class_itself_within_the_class_path
C'est comme ça que j'ai finalement fait travailler le mien sans avoir le chemin de la classe dans l'environnement
Essayez la syntaxe ci-dessous:
Supposons que Java Le fichier réside ici: fm/src/com/gsd/FileName.Java
Vous pouvez donc exécuter en utilisant la syntaxe ci-dessous:
(Transformez le répertoire courant en 'fm')
Java src.com.gsd.FileName
L'emplacement dans lequel vous générez vos classes n'existe probablement pas sur le chemin d'accès aux classes. Lors de l'exécution, utilisez l'argument jvm -verbose lors de l'exécution et vérifiez le journal si la classe est en cours de chargement ou non.
La sortie vous donnera également un indice quant à l'emplacement de chargement de la classe, assurez-vous que vos fichiers de classe sont présents à cet emplacement.