web-dev-qa-db-fra.com

Comment exécuter un fichier .class qui fait partie d'un package à partir de cmd?

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?

36
user2666594

Supposons que vous ayez cd C:/projects et HelloWorld.class est dans C:/projects/com, puis tapez simplement:

Java com.HelloWorld
31
sgbj

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

14
MadProgrammer

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?

4
kenorb

Exécutez le programme à partir du répertoire parent du répertoire com.

Java com.HelloWorld
3
Ankur Shanbhag

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.

2
gogog

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
2
Robin

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:

http://javarevisited.blogspot.de/2015/04/error-could-not-find-or-load-main-class-helloworld-Java.html

1
Krystian

Créez un dossier nommé com sous Java et placez le HelloWorld.Java dans le dossier com. Exécutez ensuite à nouveau javac et Java.

1
ihsan kocak

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)
0
Eldar

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.

0
Pravin