it-swarm-eu.dev

Errore: impossibile trovare o caricare la classe principale

Sto riscontrando dei problemi nella compilazione e nell'esecuzione del mio codice Java, inteso a consentirmi di interfacciare Java con un oggetto condiviso per Vensim, un pacchetto di modellazione di simulazione.

Il seguente codice viene compilato senza errori:

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

Tuttavia, quando provo a eseguire quanto segue:

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

Ottengo il seguente errore: "Errore: impossibile trovare o caricare SpatialModel della classe principale". Il mio codice SpatialModel.Java contiene un metodo "principale" (di seguito), quindi non sono sicuro di quale sia il problema: qualcuno può aiutarmi per favore? Grazie.

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));
    }

}
332
Dave

È necessario assicurarsi di aggiungere la posizione del file .class al classpath. Quindi, se è nella cartella corrente, aggiungere . al classpath. Si noti che il separatore del classpath di Windows è un punto e virgola ;

257
Saket

Se la classe è in un pacchetto

package thepackagename;

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

Quindi chiama:

Java -classpath . TheClassName

risultati in Error: Could not find or load main class TheClassName. Questo perché deve essere chiamato con il nome completo:

Java -classpath . thepackagename.TheClassName

E questa directory thepackagename deve esistere nel classpath. In questo esempio, ., che indica la directory corrente, è l'insieme di classpath. Quindi questo particolare esempio deve essere chiamato dalla directory in cui esiste thepackagename.

Per essere chiari, il nome di questa classe non è TheClassName, è thepackagename.TheClassName. Il tentativo di eseguire TheClassName non funziona, perché nessuna classe con quel nome esiste . Comunque non sul classpath corrente.

Infine, si noti che viene eseguita la versione compilata ( .class), non la versione del codice sorgente (. Java). Quindi "CLASSPATH".

127
aliteralmind

Puoi provare questi due quando ricevi l'errore: "impossibile trovare o caricare la classe principale"

Se il tuo file di classe viene salvato nella seguente directory con HelloWorld nome del programma d:\sample

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

Credo che sia necessario aggiungere la directory corrente al classpath Java

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

Devi includere classpath ai tuoi comandi javac e Java

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

supponiamo di avere il seguente

Nome del pacchetto: nome classe com.test: il file Hello (Avere principale) si trova all'interno di "src/com/test/Hello.Java"

dall'esterno della directory:

$ cd src
$ javac -cp . com/test/*.Java
$ Java -cp . com/test/Hello
  • Anche a Windows funzionerà la stessa cosa, ho già provato
30
msoliman

se lavori in Eclipse, effettua semplicemente la pulizia (project\clean..clean all projects) del progetto.

25
cane

Devi impostare il classpath se ottieni l'errore:

Impossibile trovare o caricare la classe principale XYZ

Per esempio:

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

Ho ricevuto questo errore perché stavo cercando di eseguire

javac HelloWorld.Java && Java HelloWorld.class

quando avrei dovuto rimuovere .class:

javac HelloWorld.Java && Java HelloWorld
16
Lri

controlla il tuo BuildPath, potrebbe essere che stai facendo riferimento a una libreria che non è più esistente.

9
Samsky

Se si tenta di eseguire un'applicazione Java che richiede JDK 1.6 e si sta tentando di eseguire su JDK 1.4, si incontrerà questo errore. In generale, provare a eseguire l'applicazione Java sul vecchio JRE potrebbe non riuscire. Prova ad installare il nuovo JRE/JDK

7
Shaddu

So che questa domanda è stata taggata con linux, ma su windows , potresti dover separare i tuoi argomenti di cp con un ; invece di 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

Se ricevi questo errore e stai usando Maven per costruire i tuoi Jars , allora ci sono buone probabilità che tu non abbia le tue classi Java in src/main/Java/.

Nel mio caso ho creato il mio progetto in Eclipse, che per impostazione predefinita src (piuttosto che src/main/Java/.

Così ho finito con qualcosa come mypackage.morepackage.myclass e una struttura di directory simile a src/mypackage/morepackage/myclass, che di per sé non ha nulla di sbagliato. Ma quando esegui mvn clean install cercherà src/main/Java/mypackage/morepackage/myclass. Non troverà la classe ma non sarà neanche l'errore. Così costruirà con successo e quando eseguirai il tuo Jar uscito il risultato sarà:

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

Perché semplicemente non ha mai incluso la tua classe nel Jar confezionato.

6
Mike S

Java -verbose:class HelloWorld potrebbe aiutarti a capire quali classi vengono caricate.

Inoltre, come accennato in precedenza, ricorda di chiamare il nome completo (ad esempio il pacchetto include).

5
Jose Alban

Progetto> Pulisci, quindi assicurati che BuildPath> Libraries abbia la libreria corretta.

5
Giri

Il problema non riguarda la tua funzione principale. Guarda per

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

uscita ed eseguirlo.

5
ymutlu

Se stai usando Eclipse ... Ho rinominato il mio file di classe principale e ho ricevuto quell'errore. Sono andato a "Esegui come" configuratore e sotto il percorso di classe per quel progetto, aveva elencato entrambi i file nel percorso della classe. Ho rimosso la vecchia classe che ho ribattezzato e ho lasciato la classe con il nuovo nome, che ha compilato e ha funzionato bene.

4
Argyle Ghost

Se così semplice di quanto pensano molte persone, io ho incluso :)

cd toProject Folder/src/packagelì dovresti vedere yourClass.Java quindi eseguirejavac yourClass.Javache creerà yourClass.class quindi cd fuori dalla cartellasrce inbuildcartella lì puoi eseguireJava package.youClass

Sto usando il terminale su Mac o puoi eseguire la stessa operazione utilizzando il prompt dei comandi su Windows

4
don

Questo problema si è verificato per me quando ho importato un progetto esistente in Eclipse. Quello che succede è copiato tutti i file non nel pacchetto, ma fuori dal pacchetto. Quindi, quando ho provato a eseguire> Esegui configurazioni, non è stato possibile trovare il metodo principale perché non era nel pacchetto. Tutto quello che ho fatto è stato copiare i file nel pacchetto ed Eclipse è stato quindi in grado di rilevare il metodo principale. Quindi assicurati che Eclipse possa trovare il tuo metodo principale, assicurandoti che i tuoi file Java siano nel giusto pacchetto.

4
JohnMerlino

Stavo usando Java 1.8, e questo errore si è verificato all'improvviso quando ho premuto "Costruisci e pulisci" in netbeans, sono passato di nuovo brevemente a 1.7, ho fatto clic su Ok, ho riaperto le proprietà e sono tornato a 1.8 e tutto ha funzionato perfettamente.

Spero di poter aiutare qualcuno con questo, questi errori possono richiedere molto tempo.

4
Maxim Geerinck

Ho un problema simile in Windows, è legato al classpath. Dalla riga di comando, navigare fino alla directory in cui si trova il file Java (* .Java e * .class), quindi riprovare con i comandi.

1
edwindh

Io uso Anypoint Studio (un IDE basato su Eclipse). Nel mio caso tutto ha funzionato bene, fino a quando ho scoperto che durante l'esecuzione del codice Java, viene eseguito qualcosa di completamente diverso. Quindi ho eliminato i file .class. Dopo questo punto ho ricevuto il messaggio di errore dal titolo di questa domanda. La pulizia del progetto non ha risolto il problema.

Dopo aver riavviato IDE, tutto ha funzionato di nuovo bene.

1
Zsolti

Questo ha risolto il problema per me oggi:

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

Quindi pulisci e crea ed esegui i singoli file necessari.

1
Luc