369 votes

Erreur : Impossible de trouver ou de charger la classe principale

J'ai des difficultés à 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 se 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'obtiens l'erreur suivante : "Erreur : Impossible de trouver ou de charger la classe principale SpatialModel ". Mon code SpatialModel.java contient une méthode 'main' (ci-dessous), donc je ne suis pas sûr de l'origine du problème - quelqu'un peut-il m'aider ? 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));
    }

}

288voto

Saket Points 9771

Vous devez vous assurer que vous ajoutez le lieu de votre .class à votre classpath. Ainsi, s'il est dans le dossier courant, ajoutez . à votre classpath. Notez que le séparateur de classpath de Windows est un point-virgule, c'est à dire un ; .

72 votes

Et si quelqu'un n'a pas remarqué dans la question que le séparateur de classpath sous Linux est un deux-points : .

6 votes

@JavierMr Merci d'avoir signalé le séparateur de classpath sous Linux. J'ai fini par utiliser ceci : javac -cp third_party_lib.jar MyClass.java et pour exécuter : java -cp .:./third_party_lib.jar MyClass (remarquez le point . et du côlon : après l'option -cp)

1 votes

63voto

Sudhakar Pabbati Points 201

Vous pouvez essayer les deux méthodes suivantes lorsque vous obtenez l'erreur suivante : "Impossible de trouver ou de charger la classe principale".

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

  1. java -cp d:\sample HelloWorld
  2. java -cp . HelloWorld

7 votes

Cela fonctionne très bien. Mais pourquoi s'il vous plaît ?

0 votes

Ça marche parce que ça indique à l'interpréteur java où se trouvent les fichiers de classe du bytecode.

0 votes

C'est la réponse la plus simple, je pense. Merci !

38voto

Rafael Cordones Points 555

Je crois que vous devez ajouter le répertoire actuel au classpath de Java.

java -cp .:./apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars

3 votes

Merci pour votre réponse. Ma vie a été sauvée ! Après une précédente modification de CLASSPATH. Le répertoire actuel n'était plus dans CLASSPATH. C'est pourquoi je continue à obtenir "impossible de trouver ou de charger la classe principale" et "impossible de trouver le symbole" alors qu'ils se trouvent dans le répertoire actuel. Merci beaucoup ! !!

2 votes

Pour ceux qui ont le même problème, voici comment ajouter le répertoire courant à CLASSPATH shell$ export CLASSPATH=.:$CLASSPATH

0 votes

C'est clairement ce qu'il faut faire, mais selon la documentation Java, cela ne devrait pas être nécessaire. Voici ce que dit la documentation Java d'Oracle docs.oracle.com/javase/tutorial/essentiel/environnement/ say "La valeur par défaut du chemin de la classe est ".", ce qui signifie que seul le répertoire courant est recherché".

31voto

cane Points 133

Si vous travaillez dans Eclipse, il suffit de faire un nettoyage ( project\clean.. clean all projects ) du projet.

20voto

user2318595 Points 91

Vous devez définir le classpath 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X