web-dev-qa-db-fra.com

Erreur: impossible de trouver ou de charger la classe principale

Je ne parviens pas à compiler et à exécuter mon code Java, destiné à me permettre d'interfacer Java avec un objet partagé pour Vensim, un logiciel de modélisation de simulation.

Le code suivant compile sans erreur:

javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java     VensimHelper.Java VensimException.Java VensimContextRepository.Java

Cependant, lorsque j'essaie d'exécuter ce qui suit:

Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars

J'ai l'erreur suivante: "Erreur: impossible de trouver ou de charger la classe principale SpatialModel". Mon code SpatialModel.Java contient une méthode 'principale' (ci-dessous). Je ne suis donc pas sûr du problème. Quelqu'un peut-il m'aider, s'il vous plaît? Merci.

import Java.io.File;
import Java.text.NumberFormat;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;

import org.Apache.log4j.Logger;

public class SpatialModel {

    private VensimHelper vh;

    public static final String DLL_LIBNAME_PARAM = "vensim_lib_nam";

    public static final String MODEL_PATH_PARAM = "vensim_model_path";

    private final static int VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT = 10;

    public SpatialModel() throws SpatialException {

        String libName = System.getProperty(DLL_LIBNAME_PARAM);
        String modelPath = System.getProperty(MODEL_PATH_PARAM);        

        if(libName == null || libName.trim().equals("")) {
            log.error("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
            throw new SpatialException("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
        }

        if(modelPath == null || modelPath.trim().equals("")) {
            log.error("Model path has to set with -D" + MODEL_PATH_PARAM);
            throw new SpatialException("Model path ahs to be set with -D" + MODEL_PATH_PARAM);
        }

        for (int i = 0; i < VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT && vh == null; i++) {
            try {
                log.info("creating new vensim helper\n\tdll lib: " + libName + "\n\tmodel path: " + modelPath);
                vh = new VensimHelper(libName, modelPath);
            } catch (Throwable e) {
                log.error("An exception was thrown when initializing Vensim, try: " + i, e);
            }
        }
        if (vh == null) {
            throw new SpatialException("Can't initialize Vensim");
        }

    }

    public static void main(String[] args) throws VensimException {

        long before = System.currentTimeMillis();   
        String libName = System.getProperty(DLL_LIBNAME_PARAM);
        String modelPath = System.getProperty(MODEL_PATH_PARAM);

        if (libName == null) {
            libName = "libvensim";
        }
        if(modelPath == null) {
            modelPath = "~/BassModel.vmf";
        }

        System.setProperty(DLL_LIBNAME_PARAM, libName);
        System.setProperty(MODEL_PATH_PARAM, modelPath);

        if (args.length > 0 && args[0].equals("info")) {
            System.out.println(new VensimHelper(libName, modelPath).getVensimInfo());
        } else if (args.length > 0 && args[0].equals("vars")) {
            VensimHelper helper = new VensimHelper(libName, modelPath);
            String[] vars = helper.getVariables();
            for (String var : vars) {
                System.out.println(helper.getVariableInfo(var));
            }
        } else {

            File f = new File(".");
            System.out.println(f.getAbsolutePath());

            SpatialModel sm = new SpatialModel();
        }

        System.out.println("Execution time: " + (System.currentTimeMillis() - before));
    }

}
340
Dave

Vous devez vous assurer que vous ajoutez l'emplacement de votre fichier .class à votre chemin de classe. Donc, si c'est dans le dossier actuel, ajoutez . à votre chemin de classe. Notez que le séparateur de chemin de classe Windows est un point-virgule, c’est-à-dire un ;.

261
Saket

Si la classe est dans un package

package thepackagename;

public class TheClassName {
  public static final void main(String[] cmd_lineParams)  {
     System.out.println("Hello World!");
  } 
}

Puis en appelant:

Java -classpath . TheClassName

résulte en Error: Could not find or load main class TheClassName. En effet, il doit être appelé avec son nom complet:

Java -classpath . thepackagename.TheClassName

Et ce répertoire thepackagename doit exister dans le chemin de classe. Dans cet exemple, ., signifiant le répertoire en cours, représente l'intégralité du chemin de classe. Par conséquent, cet exemple particulier doit être appelé à partir du répertoire dans lequel thepackagename existe.

Pour être clair, le nom de cette classe n'est pas TheClassName, c'est thepackagename.TheClassName. Tenter d'exécuter TheClassName ne fonctionne pas, car aucune classe portant ce nom n'existe. Pas sur le classpath actuel de toute façon.

Enfin, notez que la version compilée (. Class) est exécutée et non la version du code source (. Java). D'où "CLASSPATH".

131
aliteralmind

Vous pouvez essayer ces deux quand vous obtenez le message d'erreur: 'Impossible de trouver ou de charger la classe principale'

Si votre fichier de classe est enregistré dans le répertoire suivant avec HelloWorld nom du programme d:\sample

  1. Java -cp d:\sample HelloWorld
  2. Java -cp . HelloWorld
58
Sudhakar Pabbati

Je crois que vous devez ajouter le répertoire en cours au chemin de classe Java

Java -cp .:./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
36
Rafael Cordones

Vous devez inclure classpath à vos commandes javac et Java

javac -cp . PackageName/*.Java
java -cp . PackageName/ClassName_Having_main

supposons que vous ayez ce qui suit

Paquet nommé: com.test Nom de classe: Hello (le fichier principal) est situé dans "src/com/test/Hello.Java"

depuis l'annuaire extérieur:

$ cd src
$ javac -cp . com/test/*.Java
$ Java -cp . com/test/Hello
  • Dans Windows, la même chose fonctionnera aussi, j'ai déjà essayé
30
Muhammad Soliman

Si vous travaillez dans Eclipse, effectuez simplement un nettoyage (project\clean..clean all projects) du projet.

26
cane

Vous devez définir le chemin de classe si vous obtenez l'erreur:

Impossible de trouver ou de charger la classe principale XYZ

Par exemple:

E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.Java
E:\>Java XYZ
17
user2318595

J'ai eu cette erreur parce que j'essayais de courir

javac HelloWorld.Java && Java HelloWorld.class

quand j'aurais dû enlever .class:

javac HelloWorld.Java && Java HelloWorld
16
Lri

Vérifiez votre BuildPath, il est possible que vous référeniez une bibliothèque qui n’existe plus.

9
Samsky

Si vous essayez d'exécuter une application Java qui nécessite JDK 1.6 et que vous essayez de l'exécuter sur JDK 1.4, vous rencontrerez cette erreur. En général, essayer d'exécuter une application Java sur un ancien JRE peut échouer. Essayez d'installer le nouveau JRE/JDK.

7
Shaddu

Je sais que cette question a été étiquetée avec linux, mais sur windows , vous devrez peut-être séparer vos arguments cp avec un ; au lieu d'un :.

Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar;./vensim.jar SpatialModel vars

http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

7
Snekse

Si vous obtenez cette erreur et que vous êtes en utilisant Maven pour construire vos fichiers JAR, il y a de fortes chances que vous n'ayez tout simplement pas vos classes Java dans src/main/Java/.

Dans mon cas, j'ai créé mon projet dans Eclipse dont la valeur par défaut est src (plutôt que src/main/Java/.

Je me suis donc retrouvé avec quelque chose comme mypackage.morepackage.myclass et une structure de répertoires ressemblant à src/mypackage/morepackage/myclass, qui n'a fondamentalement rien à redire. Mais lorsque vous exécuterez mvn clean install, il recherchera src/main/Java/mypackage/morepackage/myclass. Il ne trouvera pas la classe mais ne commettra pas d'erreur non plus. Donc, il va réussir à construire et lorsque vous exécutez votre fichier jar généré, le résultat est le suivant:

Error: Could not find or load main class mypackage.morepackage.myclass

Parce que cela n'a tout simplement jamais inclus votre classe dans le pot emballé.

6
Mike S

Java -verbose:class HelloWorld pourrait vous aider à comprendre quelles classes sont chargées.

En outre, comme mentionné précédemment, rappelez-vous d'appeler le nom qualifié complet (c'est-à-dire, package inclus).

5
Jose Alban

Projet> Nettoyer, puis assurez-vous que BuildPath> Libraries a la bonne bibliothèque.

5
Giri

Le problème ne concerne pas votre fonction principale. Départ pour

javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java     VensimHelper.Java VensimException.Java VensimContextRepository.Java

sortie et exécutez-le.

5
ymutlu

Si vous utilisez Eclipse ... j'ai renommé mon fichier de classe principal et j'ai cette erreur. Je suis allé à "Run As" configurator et sous le chemin de classe pour ce projet, il avait répertorié les deux fichiers dans le chemin de classe. J'ai supprimé l'ancienne classe que j'ai renommée et j'ai quitté la classe portant le nouveau nom. Elle a été compilée et fonctionne parfaitement.

4
Argyle Ghost

Si simple que beaucoup de gens pensent, moi inclus :)

cd to Project Folder/src/package vous devriez y voir yourClass.Java puis lancer javac yourClass.Java ce qui créera yourClass.class puis cd du src et dans le build, vous pouvez y exécuter Java package.youClass

J'utilise le terminal sur Mac ou vous pouvez accomplir la même tâche à l'aide de l'invite de commande sous Windows

4
don

Ce problème s'est produit lorsque j'ai importé un projet existant dans Eclipse. Qu'est-ce qui se passe est-il copié tous les fichiers pas dans le package, mais en dehors du package. Par conséquent, lorsque j'ai essayé d'exécuter> les configurations d'exécution, il n'a pas pu trouver la méthode principale car elle ne figurait pas dans le package. Tout ce que je fis fut de copier les fichiers dans le paquet et Eclipse fut alors capable de détecter la méthode principale. Assurez-vous donc qu'Eclipse trouve votre méthode principale en vous assurant que vos fichiers Java se trouvent dans le bon package.

4
JohnMerlino

J'utilisais Java 1.8, et cette erreur s'est produite lorsque j'ai appuyé sur "Construire et nettoyer" dans NetBeans. J'ai brièvement basculé de nouveau à 1,7, cliqué sur OK, rouvert les propriétés et suis revenu à 1,8, et tout a fonctionné à la perfection.

J'espère pouvoir aider quelqu'un avec cela, car ces erreurs peuvent prendre beaucoup de temps.

4
Maxim Geerinck

J'ai un problème similaire dans Windows, il est lié au classpath. A partir de la ligne de commande, naviguez jusqu'au répertoire où se trouve votre fichier Java (* .Java et * .class), puis réessayez avec vos commandes.

1
edwindh

J'utilise Anypoint Studio (un IDE basé sur Eclipse). Dans mon cas, tout a bien fonctionné, jusqu'à ce que je découvre qu'en exécutant le code Java, quelque chose de totalement différent est exécuté. Ensuite, j'ai supprimé les fichiers .class. Après ce point, j'ai reçu le message d'erreur du titre de cette question. Nettoyer le projet n'a pas résolu le problème.

Après avoir redémarré le IDE, tout a bien fonctionné.

1
Zsolti

Cela a résolu le problème pour moi aujourd'hui:

cd /path/to/project
cd build
rm -r classes

Puis nettoyez et construisez-le et exécutez les fichiers individuels dont vous avez besoin.

1
Luc