Come risolvo ClassNotFoundException?


106

Sto provando a eseguire un'applicazione Java, ma ricevo questo errore:

java.lang.ClassNotFoundException:

Dopo i due punti viene visualizzata la posizione della classe mancante. Tuttavia, so che quella posizione non esiste poiché la classe si trova altrove. Come posso aggiornare il percorso di quella classe? Ha qualcosa a che fare con il percorso di classe?


1
È necessario aggiungere il barattolo con la classe mancante al classptah
Crom

se la tua classe ha un pacchetto, vai alla cartella contenente la classe. ad esempio, se il pacchetto è il pacchetto test.abc, vai alla cartella prima di test e poi esegui java -cp. test.abc.CLASSNAME (senza .class). Se non ci sono pacchetti, vai alla cartella contenente la classe e dì java -cp. CLASSNAME
Facoltativo

O una classe non è stata distribuita nel tuo runtime (ad esempio jar mancante), o la classe non è visibile in un determinato programma di caricamento classi, controlla questo strumento che aiuta a risolvere questi problemi: jhades.org
Angular University

1
A volte mi imbatto anche in questo. Questa eccezione viola chiaramente la regola di indicare tutto il contesto necessario in un messaggio di eccezione. Dovrebbe menzionare dove ha cercato di cercare l'oggetto, cosa c'è nel tuo classpath. Si prega di creare messaggi di eccezione migliori. Non farci cercare informazioni che potrebbero aiutare a risolvere il problema.
masterxilo

Risposte:


32

Il tuo classpath è rotto (che è un problema molto comune nel mondo Java).

A seconda di come si avvia l'applicazione, è necessario rivedere l'argomento in -cp, la voce del percorso di classe in MANIFEST.MF o il layout del disco.


34
Puoi essere più specifico per l'eclissi? Cosa devo fare?
user2426316

24
La tua domanda non contiene informazioni sufficienti per fornire una risposta più specifica. Considera l'idea di aggiungerlo.
Thorbjørn Ravn Andersen

Risoluzione delle dipendenze / mancata corrispondenza della versione è un problema molto comune praticamente in tutti gli ambienti di programmazione. Potremmo dire che tutto ciò che qualsiasi programma fa è risolvere tali definizioni ... la domanda è sempre: cosa / dove è la definizione e quale versione intendevi?
masterxilo

2
Sto solo sottolineando che, oltre al mondo Java, tutto il software lotta per garantire che vengano trovate le versioni corrette delle dipendenze. Posso citare dll-hell, gestori di pacchetti, gestori di versione, distinta base di avvio primaverile e contenitori Docker come esempi di questo problema e possibili soluzioni. Maggiore è la frazione di codice esterno, maggiore è il problema.
masterxilo

@masterxilo Sì, ma non è necessariamente questo il problema qui e potresti abbaiare sull'albero sbagliato. Tutto ciò che si può dire è che il classpath è rotto.
Thorbjørn Ravn Andersen

45

Un classpath è un elenco di posizioni da cui caricare le classi.

Queste "posizioni" possono essere directory o file jar.

Per le directory, la JVM seguirà un modello previsto per il caricamento di una classe. Se ho la directory C: / myproject / classes nel mio classpath e cerco di caricare una classe com.mycompany.Foo , cercherà sotto la directory classes una directory chiamata com , quindi sotto quella directory chiamata mycompany , e alla fine cercherà un file chiamato Foo.class in quella directory.

Nella seconda istanza, per i file jar, cercherà nel file jar quella classe. Un file jar è in realtà solo una raccolta compressa di directory come quella sopra. Se decomprimi un file jar, otterrai un mucchio di directory e file di classe seguendo lo schema sopra.

Quindi la JVM attraversa un percorso di classe dall'inizio alla fine alla ricerca della definizione della classe quando tenta di caricare la definizione della classe. Ad esempio, nel classpath:

C: / myproject / classi; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

La JVM tenterà di cercare prima nelle classi di directory , poi in stuff.jar e infine in otherstuff.jar .

Quando si ottiene un'eccezione ClassNotFoundException, significa che la JVM ha attraversato l'intero percorso di classe e non ha trovato la classe a cui si è tentato di fare riferimento. La soluzione, come spesso accade nel mondo Java, è controllare il proprio classpath.

Definisci un classpath sulla riga di comando dicendo java -cp e poi il tuo classpath. In un IDE come Eclipse, avrai un'opzione di menu per specificare il tuo classpath.


13

Questa è la migliore soluzione che ho trovato finora.

Supponiamo di avere un pacchetto chiamato org.mypackagecontenente le classi:

  • HelloWorld (classe principale)
  • SupportClass
  • UtilClass

ei file che definiscono questo pacchetto sono archiviati fisicamente nella directory D:\myprogram(su Windows) o /home/user/myprogram(su Linux).

La struttura del file sarà simile a questa: inserisci qui la descrizione dell'immagine

Quando invochiamo Java, specifichiamo il nome dell'applicazione per l'esecuzione: org.mypackage.HelloWorld. Tuttavia dobbiamo anche dire a Java dove cercare i file e le directory che definiscono il nostro pacchetto. Quindi, per avviare il programma, dobbiamo usare il seguente comando: inserisci qui la descrizione dell'immagine

NOTA: è necessario eseguire il javacomando precedente indipendentemente dalla posizione corrente. Ma questo non è il caso javac. Per la compilazione puoi anche andare direttamente nella directory in cui hai i tuoi .javafile ed eseguire direttamente javac ClassName.java.


6

Se conosci il percorso della classe o il jar contenente la classe, aggiungilo al tuo classpath mentre lo esegui. Puoi usare il classpath come menzionato qui:

Su Windows

java -classpath .;yourjar.jar YourMainClass

su UNIX / Linux

java -classpath .:yourjar.jar YourMainClass

4

Prova questi se usi Maven. Uso Maven per il mio progetto e quando lo faccio mvn clean installe provo a eseguire un programma genera l'eccezione. Quindi, pulisco il progetto e lo eseguo di nuovo e funziona per me.

Uso eclipse IDE.

Per l'eccezione Classe non trovata durante l'esecuzione del test Junit, provare a eseguire mvn clean testuna volta. Compilerà tutte le classi di test.


in quale directory eri quando hai eseguito "mvn clean test"? si trova nella stessa directory del POM?
TacoB0t

1
Sì. L'ho eseguito dalla directory in cui è presente il file pom.
Arun

3

Per aggiungere la posizione di una classe al percorso della classe tramite la riga di comando, è sufficiente aggiungere -cpo -classpathe la posizione della classe durante l'esecuzione. IE

java -cp "c:/location/of/file" YourProgram

Oppure, se stai utilizzando un IDE come eclipse, puoi fare clic con il pulsante destro del mouse su project -> build path -> configure build path e aggiungere il JAR esterno contenente la tua classe al percorso di compilazione, quindi dovrebbe funzionare bene.


3

Uso ';' come separatore. Se le tue variabili d'ambiente sono impostate correttamente, dovresti vedere le tue impostazioni. Se PATH e CLASSPATH sono corretti, Windows dovrebbe riconoscere quei comandi. NON è necessario riavviare il computer durante l'installazione di Java.


5
Questo è su windows (punto e virgola), su unix / linux è ':' (due punti)
Joeblade

3

Aggiungi il percorso completo del file jar a CLASSPATH. In Linux utilizzare:export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH" . In un altro modo funzionava (senza modificare CLASSPATH) decomprimere il jar nella cartella del progetto corrente.

I modi non hanno funzionato per me:

1) Utilizzo -cpdell'opzione con il percorso completo del file jar.

2) Utilizzo -cpsolo con il nome del jar quando si trova nella cartella corrente

3) Copiare il jar nella cartella del progetto corrente

4) Copiare il jar nella posizione standard dei java jar (/ usr / share / java)

Questa soluzione è riportata per la classe com.mysql.jdbc.Driver in mysql-connector-java.5 - *. Jar, lavorando su linux con OpenJDK versione 1.7


Solo decomprimere il JAR ha funzionato per me, nessuna delle altre soluzioni ha funzionato
OverCoder,

2

Vai in alto e rimuovi l'istruzione import, se presente, e reimportare la classe. Ma se questo non è il caso, fai una pulizia e poi costruisci. Stai usando Netbeans o Eclipse?


2

Mi sono imbattuto anche in questo e ho provato tutte le altre soluzioni. Non avevo il file .class nella mia cartella HTML, avevo solo il file .java. Una volta aggiunto il file .class, il programma ha funzionato bene.


2
  1. Potrebbe accadere se il tuo classpath non è corretto

  2. Poniamo una classe serializzabile e una classe deserializzabile sotto lo stesso nome progetto. Si esegue la classe serializzabile, creando un oggetto serializzabile in una cartella specifica. Ora hai bisogno dei dati desearializzati. Nel frattempo, se cambi il nome del progetto non funzionerà. Devi prima eseguire la classe serializzabile e quindi deserializzare il file.


2

Se stai usando Maven prova ad aggiornare Maven tutti i progetti e forzare gli snapshot. Pulirà anche e ricostruirà tutto il classpath .. Ha risolto il mio problema ..


2

L'ho appena fatto

1.Invalidare le cache e riavviare

2. Ricostruito il mio progetto che ha risolto il problema


1

Stavo cercando di eseguire .jar da codice C # usando Processclass. Il codice java è stato eseguito correttamente da eclipse ma non da C # visual studio e anche facendo clic direttamente sul file jar, si è sempre interrotto con ClassNotFoundException:eccezioni. La soluzione per il mio, è stata esportare il programma Java come "File JAR eseguibile" invece di "File JAR". Spero che possa aiutare qualcuno.


1

Questo può accadere su Windows dopo un aggiornamento java in cui manca la vecchia versione di java SDK ed è presente una nuova. Vorrei controllare se il tuo IDE utilizza la versione SDK Java installata (IntelliJ: CTRL + MAIUSC + ALT + S)


1

Se sono state aggiunte più librerie (di terze parti) ** ed Extends ** classe Application

Allora potrebbe accadere.

Per questo, devi impostare multiDexEnabled truee sostituire la tua Applicationclasse estesa con MultiDexApplication.

Sarà risolto.


1

Domanda generica di base - Risposta generica più semplice;)

Date le informazioni, presumo che tu stia provando un approccio di base alla codifica, compilando / compilando ed eseguendo una semplice app per console come "Hello World", utilizzando un semplice editor di testo e alcuni Command Shell.

Questo errore si verifica nello scenario seguente:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

In altre parole, usa:

..\SomePath>java HelloWorld

PS L'aggiunta dell'estensione del file .class produce lo stesso errore. Assicurati anche di avere la cartella bin di Java (JDK / JRE) nel PERCORSO delle variabili d'ambiente del sistema operativo (cerca ulteriori dettagli in altri post su questo) PPS Avevo ragione nel mio assunto / i?


1

Se usi Maven, controlla di avere questo plugin nel tuo pom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

Metterà la tua dipendenza (il motivo dell'eccezione) nel tuo jar.

FYI : questo includerà tutte le dipendenze gonfiate nel vaso finale


@Archit aggiunto.
techkuz

0

Nel mio caso la classe lanciata come eccezione di classe non trovata ha proprietà relative ai certificati ssl. Chiudi l'eclissi e aprilo con "Esegui come amministratore", quindi il problema è stato risolto. Poiché eclipse ha un'autorizzazione relativa al problema, genererà questo tipo di eccezione.


-7

Metti tutto il codice nel blocco try quindi cattura l'eccezione in un blocco catch

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

5
Ciò non risolve l'eccezione. Questo nasconde l'eccezione. Inoltre, "e1.getmessage ()" è a) la maiuscola errata di getMessage () eb) non farà molto perché restituisce una stringa con un messaggio e non la stai stampando o loggando o altro!
IBBoard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.