[java] Cosa significa "Impossibile trovare o caricare la classe principale"?



14 Answers

Se il nome del codice sorgente è HelloWorld.java, il codice compilato sarà HelloWorld.class .

Otterrai quell'errore se lo chiami usando:

java HelloWorld.class

Invece, usa questo:

java HelloWorld
Question

Un problema comune ai nuovi sviluppatori Java è che i loro programmi non riescono a girare con il messaggio di errore: Could not find or load main class ...

Che cosa significa questo, che cosa lo causa e come dovresti risolverlo?




In Java, when you sometimes run the JVM from the command line using the java executable and are trying to start a program from a class file with public static void main (PSVM), you might run into the below error even though the classpath parameter to the JVM is accurate and the class file is present on the classpath:

Error: main class not found or loaded

This happens if the class file with PSVM could not be loaded. One possible reason for that is that the class may be implementing an interface or extending another class that is not on the classpath. Normally if a class is not on the classpath, the error thrown indicates as such. But, if the class in use is extended or implemented, java is unable to load the class itself.

Reference: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/




Sometimes, in some online compilers that you might have tried you will get this error if you don't write public class [Classname] but just class [Classname] .




Usa questo comando:

java -cp . [PACKAGE.]CLASSNAME

Esempio: se il tuo nome classe è Hello.class creato da Hello.java, usa il seguente comando:

java -cp . Hello

Se il file Hello.java si trova nel pacchetto com.demo, utilizzare il comando seguente

java -cp . com.demo.Hello

Con JDK 8 molte volte accade che il file di classe sia presente nella stessa cartella, ma il comando java aspetta il percorso di classe e per questa ragione aggiungiamo -cp . prendere la cartella corrente come riferimento per classpath.




A volte ciò che potrebbe causare il problema non ha nulla a che fare con la classe principale, e ho dovuto scoprirlo nel modo più difficile. Era una libreria di riferimento che ho spostato e mi ha dato:

Impossibile trovare o caricare la classe principale xxx Linux

Ho appena cancellato quel riferimento, l'ho aggiunto di nuovo e ha funzionato di nuovo bene.




I was unable to solve this problem with the solutions stated here (although the answer stated has, no doubt, cleared my concepts). I faced this problem two times and each time I have tried different solutions (in the Eclipse IDE).

  • Firstly, I have come across with multiple main methods in different classes of my project. So, I had deleted the main method from subsequent classes.
  • Secondly, I tried following solution:
    1. Right click on my main project directory.
    2. Head to source then clean up and stick with the default settings and on Finish. After some background tasks you will be directed to your main project directory.
    3. After that I close my project, reopen it, and boom, I finally solved my problem.



Posizione del file di classe: C: \ test \ com \ company

Nome file: Main.class

Nome classe completo : com.company.Main

Comando della riga di comando:

java  -classpath "C:\test" com.company.Main

Nota che il percorso di classe NON include \ com \ company




Prima imposta il percorso usando questo comando;

set path="paste the set path address"

Quindi è necessario caricare il programma. Digita "cd (nome cartella)" nell'unità salvata e compila. Ad esempio, se il mio programma è memorizzato sull'unità D, digita "D:" premi invio e digita "cd (nome cartella)".




Quello che ha risolto il problema nel mio caso è stato:

Fare clic con il tasto destro del mouse sul progetto / classe che si desidera eseguire, quindi Run As -> Run Configurations . Quindi è necessario correggere la configurazione esistente o aggiungerne una nuova nel seguente modo:

aprire la scheda Classpath , fare clic sul pulsante Advanced... quindi aggiungere la cartella bin del progetto.




You really need to do this from the src folder. There you type the following command line:

[name of the package].[Class Name] [arguments]

Let's say your class is called CommandLine.class , and the code looks like this:

package com.tutorialspoint.java;

    /**
     * Created by mda21185 on 15-6-2016.
     */

    public class CommandLine {
        public static void main(String args[]){
            for(int i=0; i<args.length; i++){
                System.out.println("args[" + i + "]: " + args[i]);
            }
        }
    }

Then you should cd to the src folder and the command you need to run would look like this:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

And the output on the command line would be:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100



Prova -Xdiag .

La risposta di Steve C copre bene i casi possibili, ma a volte per determinare se la classe non può essere trovata o caricata potrebbe non essere così facile. Usa java -Xdiag (da JDK 7). Questo stampa una bella traccia di stack che fornisce un suggerimento su ciò che il messaggio Could not find or load main class .

Ad esempio, può puntare ad altre classi utilizzate dalla classe principale che non è stato possibile trovare e ha impedito il caricamento della classe principale.




Quello che mi ha aiutato è stato specificare il classpath sulla riga di comando, ad esempio:

  1. Crea una nuova cartella, C:\temp

  2. Crea il file Temp.java in C:\temp , con la seguente classe in esso:

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
    
  3. Aprire una riga di comando nella cartella C:\temp e scrivere il seguente comando per compilare la classe Temp:

    javac Temp.java
    
  4. Esegui la classe Java compilata, aggiungendo l'opzione -classpath per consentire a JRE di sapere dove trovare la classe:

    java -classpath C:\temp Temp Hello!
    



Ho trascorso una discreta quantità di tempo cercando di risolvere questo problema. Ho pensato che in qualche modo stavo impostando il mio classpath in modo errato ma il problema era che ho digitato:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

invece di:

java -cp C:/java/MyClasses utilities/myapp/Cool   

Pensavo che il significato di pienamente qualificato significasse includere il nome completo del percorso invece del nome completo del pacchetto.




Se il tuo metodo principale è nella classe sotto un pacchetto, dovresti eseguirlo sulla directory gerarchica.

Supponiamo che ci sia un file di codice sorgente (Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

Per eseguire questo codice, devi inserire Main.Class nella Main.Class del pacchetto ./com/test/Main.Java . E nella directory root usare java com.test.Main .




All answers here are directed towards Windows users it seems. For Mac, the classpath separator is : , not ; . As an error setting the classpath using ; is not thrown then this can be a difficult to discover if coming from Windows to Mac.

Here is corresponding Mac command:

java -classpath ".:./lib/*" com.test.MyClass

Where in this example the package is com.test and a lib folder is also to be included on classpath.




Related