Eclipse: java.lang.ClassNotFoundException


95

Quando provo ad avviare il mio JUnit-Test da Eclipse, ottengo una "ClassNotFoundException". Quando si esegue "mvn test" dalla console, tutto funziona correttamente. Inoltre, non ci sono problemi segnalati in Eclipse.

La struttura del mio progetto è la seguente:

  • progetto padre (pom-packaging)
    • Progetto web (war-packaging - il mio test JUnit è qui)
    • Progetto Flex
    • Progetto di configurazione

modifica: come si fa a non trovare la classe? È una semplice applicazione HelloWorld senza librerie speciali.

Ecco la configurazione di esecuzione della mia JUnit: testo alternativo http://www.walkner.biz/_temp/runconfig.png


Testclass (ma come ho detto; non funziona neanche con un semplice HelloWorld ...):

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import biz.prognoserechnung.domain.User;
import biz.prognoserechnung.domain.UserRepository;
import biz.prognoserechnung.domain.hibernate.UserHibernateDao;

public class UserDaoTest {
/**
 * the applicationcontext.
 */
private ApplicationContext ctx = null;

/**
 * the user itself.
 */
private User record = null;

/**
 * Interface for the user.
 */
private UserRepository dao = null;

@Before
public void setUp() throws Exception {
String[] paths = { "WEB-INF/applicationContext.xml" };
ctx = new ClassPathXmlApplicationContext(paths);
dao = (UserHibernateDao) ctx.getBean("userRepository");
}

@After
public void tearDown() throws Exception {
dao = null;
}

@Test
public final void testIsUser() throws Exception {
Assert.assertTrue(dao.isUser("John", "Doe"));
}

@Test
    public final void testIsNoUser() throws Exception {
    Assert.assertFalse(dao.isUser("not", "existing"));
        Assert.assertFalse(dao.isUser(null, null));
        Assert.assertFalse(dao.isUser("", ""));
    }
}

3
Ottengo lo stesso errore quando provo a eseguire una semplice classe HelloWorld senza JUnit inclusa ... Più esattamente: java.lang.NoClassDefFoundError: HelloWorld Causato da: java.lang.ClassNotFoundException: HelloWorld
swalkner

ClassNotFoundException viene generata quando si tenta di riflettere su una classe. NoClassDefFoundError viene generato quando si tenta di utilizzare la classe in una normale chiamata al metodo.
akf

puoi mostrare il codice per la tua lezione di prova?
akf

hai build automaticamente attivato o disattivato?
Jon,

la compilazione automatica è attivata
swalkner

Risposte:


194

Mi sono imbattuto in quella situazione più volte e, dopo molti tentativi, ho trovato la soluzione.

Controlla il percorso di compilazione del tuo progetto e abilita cartelle di output specifiche per ciascuna cartella. Vai uno per uno attraverso ciascuna cartella di origine del tuo progetto e imposta la cartella di output che Maven userebbe.

Ad esempio, il tuo progetto web src/main/javadovrebbe avere target/classessotto il progetto web, le classi di test dovrebbero avere target/test-classesanche sotto il progetto web e così via.

L'utilizzo di questa configurazione ti consentirà di eseguire unit test in eclipse.

Solo un altro consiglio, se i test del tuo progetto web richiedono alcuni file di configurazione che si trovano sotto le risorse, assicurati di includere quella cartella come cartella di origine e di effettuare la corretta configurazione del percorso di compilazione.

Spero che sia d'aiuto.


1
Ciao Carlos, grazie mille per il tuo consiglio. Ma sfortunatamente non ha aiutato. Ho aggiunto / src / main / java (target / classes) e / src / test / java (target / test-classes) alle cartelle di origine così come src / main / resources (applicationContext.xml, alcune proprietà - target / classes ). Stesso problema - quando avvio il mio src / test / java / UserDaoTest.java come JUnit-test da Eclipse, ottengo "Classe non trovata UserDaoTest java.lang.ClassNotFoundException: UserDaoTest". Almeno, è un po 'diverso dal messaggio di errore originale ...
swalkner

5
Sei sulla strada giusta, controlla se la classe UserDaoTest si trova nella cartella di output corrispondente all'interno del tuo file system (come forse saprai, Eclipse compila tutti i tuoi file sorgente e li inserisce nella cartella di output specificata, tra gli altri, per essere in grado di avviare test). Se la classe non viene visualizzata nella cartella di output, controlla i filtri di inclusione / esclusione del percorso di compilazione per questa cartella specifica. In bocca al lupo.
Carlos

Per me questo non ha risolto il problema. Si è scoperto che si trattava di un problema di AspectJ. Se stai usando AspectJ prova a rimuovere e leggere le funzionalità di AspectJ - ha funzionato per me
Stefan Haberl

1
Ha avuto lo stesso problema. Penso che sia un progetto eclissi - maven - problema di git. Ciò non lo restringe davvero, ma cancellare tutte le cartelle di metadati (.project, .wunque ...), eliminare il progetto e reimportare solo come progetto esperto ha funzionato per me. Ho anche scoperto qualcosa che non sapevo che eclipse-junit potesse fare: evidenziare il metodo di test e selezionare RunAs-Junit esegue solo quel particolare metodo di test, non l'intero test! Non più @Ignoredappertutto e scorciatoie dalla GUI!
bgs

Stavo affrontando lo stesso problema, ho semplicemente usato Eclipse -> Progetto -> pulito e ha funzionato. Mvn clean non ha funzionato.
Nutan il

46

L'approccio di Carlos ha aiutato! Eclipse: java.lang.ClassNotFoundException

Prova a controllare il classpath della configurazione di esecuzione di junit:

  1. Apri le configurazioni della corsa
  2. Fare clic sul jUnit-Test che si desidera avviare
  3. vai alla scheda classpath
  4. Prova ad aggiungere una cartella (fai clic sulle voci utente, fai clic su avanzate, fai clic su aggiungi cartelle, fai clic su ok e cerca nella cartella di output le tue classi di test (quelle che trovi in ​​projektproperties java build path, source))

per me va bene.


2
Non è molto strano? Per me ha funzionato, ma la directory delle classi di destinazione fa parte del percorso classi di compilazione per il progetto. Non ha molto senso che sia necessario aggiungere una classe specifica.
Jose Muanis

Non penso che questa azione aggiunga necessariamente una directory necessaria tanto quanto attiva qualcosa da ricaricare. È probabile che tu possa rimuovere immediatamente la directory appena aggiunta dopo un'esecuzione corretta e dovrebbe funzionare normalmente. Inoltre, il commento sopra è giusto. Potrebbe anche voler dare un voto positivo anche al commento di Carlos.
Awied

Ho trovato la risposta su un'altra domanda in modo da essere più utile a questo problema: stackoverflow.com/a/5718520/901641
ArtOfWarfare

16

il tuo percorso di classe build è corretto, motivo per cui puoi compilare. il classpath per la tua JUnit deve essere controllato. vai al menu Esegui e scegli "apri finestra di dialogo Esegui". lì dovresti vedere un albero a sinistra con JUnit come opzione. apri quel nodo e trova e seleziona il tuo test. nel riquadro di destra vedrai una scheda per classpath. dai un'occhiata per assicurarti che la classe che il test sta cercando di istanziare venga trovata.

modificare:

questo sembra essere un problema con Maven e il suo comportamento dopo che una versione ha modificato le cartelle di output di Eclipse predefinite. ho visto soluzioni descritte dove

  • inserendo Maven nel bootclasspath SOPRA jre funziona, o
  • correre mvn clean testfa il trucco o
  • aggiornare tutti i tuoi progetti eclipse, provocando una ricostruzione risolve il problema
  • andando al tuo progetto e selezionando Maven-> Aggiorna configurazione risolvi il problema

con i primi tre, ci sono state segnalazioni del problema ricorrente. l'ultimo mi sembra il migliore, ma se non funziona, prova con gli altri.

qui e qui alcune informazioni


1
sfortunatamente, "Maven => Aggiorna configurazione" non risolve affatto il problema ... è vero il contrario; cancella le configurazioni del percorso di compilazione ... O significa che qualche altra configurazione è sbagliata?
swalkner

Esattamente come ha sottolineato @swalkner: Maven => La configurazione dell'aggiornamento rovinerà la configurazione del percorso di compilazione. Per qualche ragione che mi sfugge il plugin imposterà filtri di esclusione che devo sempre rimuovere manualmente dopo aver eseguito il comando
Stefan Haberl

"vai al menu Esegui e scegli" apri finestra di dialogo Esegui ". Eh ?? Dov'è?
Berit Larsen

4

Il problema potrebbe essere la mancanza del file di classe nella cartella build. Una soluzione è pulire il progetto e ricostruirlo.


4

Abilitare [x] Usa JAR temporaneo per specificare classpath (per evitare limitazioni di lunghezza del classpath) nella scheda Classpath della configurazione Run ha funzionato per me.

Se il tuo progetto è enorme e hai molte dipendenze da altri progetti di pari livello e dipendenze maven, potresti raggiungere i limiti di lunghezza del percorso di classe e questa sembra essere l'unica soluzione (a parte rendere più breve la directory del tuo repository locale di maven (il nostro inizia già in c: / m2)

inserisci qui la descrizione dell'immagine


3

Ci sono molti suggerimenti contorti qui.

Ho riscontrato questo problema più volte con i progetti Maven dopo aver spostato le risorse trascinando e rilasciando o eseguendo il refactoring dei nomi delle classi.

In tal caso, è sufficiente copiare (non spostare) il test case problematico ( .java) tramite terminale / browser di file in un'altra posizione, right-click -> Deletein Eclipse e scegliere di eliminare su disco quando viene data l'opzione, spostare / copiare il file copiato nella posizione del file originale, quindi seleziona il tuo progetto in Eclipse e premi F5 per aggiornare le risorse.

Questa operazione è rapida e semplice e ogni volta mi ha risolto il problema in modo permanente.


Sono tentato di chiedere se ha risolto il tuo problema in modo permanente , o ogni volta ... ma capisco cosa intendi e, sorprendentemente, questo ha funzionato per me.
Amos M. Carpenter

3

Ho avuto lo stesso identico problema ma l'ho capito! Vai al file di progetto e fai clic con il pulsante destro del mouse su di esso, quindi fai clic Refresho premi F5. Quindi prova a eseguirlo. Se ancora non funziona, dimenticalo, poiché ho avuto lo stesso ESATTO problema e significa solo che la tua versione di Eclipse è spazzatura.



2

Sachin ha ragione: anche con il percorso di classe corretto, la scheda dei problemi mostrerà che alcune dipendenze o la risorsa / progetto ha un errore che deve essere corretto affinché Maven possa costruire e creare automaticamente classi quando crei o apporti una modifica nella tua classe di test .

"Ciao,

È molto vecchio luglio (che anno) ma ho avuto lo stesso problema.

Il problema effettivo ha rilevato che eclipse non era in grado di generare file di classe per il file java, classpath era corretto.

Vedi la scheda del problema e controlla se nel tuo progetto manca qualcosa / file. puoi creare un nuovo progetto e aggiungere file uno per uno e costruirli fino a quando non smette di compilare e creare classi (controlla l'area di lavoro / proj / bin / pacchetto / cartella per le classi)

è strano ma vero, ecplise non era conforme perché 4 di 20 file java utilizzavano una singola immagine che mancava. e come risultato nessuno dei file java è stato compilato.

CLASSPATH non è un problema qui. "


2

Abbiamo avuto l'esatta eccezione (utilizzando SpringSource Tools, tomcat, su Win7) e la causa era che avevamo refactoring un nome file (rinominato un file) da SubDomain.java a Subdomain.java (D vs d) e in qualche modo si è scontrato anche se SpringSource era mostrando il nuovo nome Subdomain.java. La soluzione era eliminare il file (tramite SpringSource) e crearlo di nuovo con il nome Subdomain.java e copiare e incollare il suo contenuto precedente. Semplice come quella.


Ho sempre eseguito casi di test junit, fino a quando non ho eseguito il programma che controlla la compatibilità del PC prima di aggiornare Windows. Sembra che debba rompere qualcosa, non sono in grado di eseguire nuovamente i casi di test JUnit. (e tutte le risposte esistenti non funzionano)
CoffeDeveloper

2

Risolvo quel percorso Bulit ---> librerie ---> aggiungi libreria ---> Junit controlla junit4


1

fare clic su project->properties->Java build path->Sourcee verificare che ogni srccartella sia ancora valida, esistente o rimossa di recente. Correggere qualsiasi percorso mancante o errato, ricostruire ed eseguire il test. Risolverà il problema.


1

Tutto quello che ho fatto è stato Proprietà -> Percorso build Java -> Ordine ed esportazione -> Abilitato tutte le caselle deselezionate -> spostato Junit completamente in alto


1

Provato

Link : [here][1]

Open your run configurations
Click on the jUnit-Test you want to start
go to the classpath tab
Try to add a folder (click on user entries, click on advanced, click on add folders,click on ok and search the outputfolder for your test classes(those you find under projektproperties java build path, source))

lavorato dopo

Maven 2 LifeCycle >> test


1

Avevo provato tutte le soluzioni su questa pagina: aggiorna progetto, ricostruisci, pulisci tutti i progetti, riavvia Eclipse, reimport (anche) i progetti, ricostruisci Maven e aggiorna. Niente ha funzionato. Ciò che ha funzionato è stato copiare la classe con un nuovo nome che va bene - bizzarro ma vero.

Dopo aver sopportato questo per un po 'di tempo, l'ho risolto semplicemente:

  1. Tramite il Runmenu
  2. Selezionare Run Configurations
  3. Scegli la configurazione di esecuzione associata allo unit test.
  4. Rimuovere la voce Run Configurationda premendo Elimina o facendo clic sulla X rossa.

Qualcosa deve essere stato rovinato con la configurazione della corsa in cache.


1
Dopo aver perso troppo tempo ho finito per eseguire i passaggi precedenti. Ho quindi preso una decisione eroica di eliminare tutte le configurazioni dei test di esecuzione e ora nessuno dei miei test può essere trovato nel classpath anche se la nuova configurazione di esecuzione mostra chiaramente il progetto al suo interno (con le dipendenze maven sotto). Continuo a dimenticare quanto sia fragile l'eclissi. Dopo di che nessun test potrebbe essere eseguito con eclipse (prima che potessi selezionare un test particolare - ok). Infine, ho provato il suggerimento di KomodoDave di seguito. Questo ha risolto le cose ... sono incredibili i loop che devi attraversare con questo ide (l'ultimo di una serie ..)
justin

1

L'eliminazione del progetto da eclipse (non dal disco rigido) che in un certo senso sta pulendo l'area di lavoro e reimportare il progetto in eclipse di nuovo ha funzionato per me.


1

Di solito questo problema si verifica durante l'esecuzione dello javastrumento dell'applicazione Java che non è in grado di trovare il file di classe.

Principalmente nel progetto Maven vediamo questo problema a causa del problema di sincronizzazione Eclipse-Maven . Per risolvere questo problema: Maven-> Aggiorna configurazione


0

Hai provato a fare clic con il pulsante destro del mouse sulla radice del progetto, selezionando "proprietà" e assicurandoti che CLASSPATH sia corretto? Se ricordo bene, è così che lo fai.

Qualcosa sul modo in cui Eclipse esegue gli unit test che richiede di aggiungere il JAR junit al CLASSPATH di runtime in un modo speciale?

Uso IntelliJ, quindi non ho questi problemi.

Verificherei Eclipse da solo, ma preferisco non averlo sul desktop.


ok, senza portare a una discussione tra Eclipse e IntelliJ; Mi piacerebbe averlo in Eclipse in esecuzione ... e ho controllato il Java Build Path - il Java JDK è lì e non ho bisogno di nient'altro per il mio esempio HelloWorld ... penso che abbia qualcosa a che fare con 'cartelle di origine nel percorso di compilazione' ... le ho impostate nella cartella in cui inizia il mio pacchetto ... presumo che sia corretto.
swalkner

Hai bisogno di qualcosa oltre al JDK: questo è il percorso per HelloWorld.class, giusto? "cartelle di origine nel percorso di creazione" - suona meglio. Non c'è bisogno di presumere, essere un sperimentatore e provarlo. Eclipse ti dirà se hai ragione.
duffymo,

0

Hmm, sembra un po 'bizzarro, prova a eseguirlo con la seguente annotazione all'inizio della classe:

@RunWith(SpringJUnit4ClassRunner.class)
public class UserDaoTest {
}

e fammi sapere come te la cavi.

Verifica di avere anche la build abilitata automaticamente. Se vuoi assicurarti che le tue classi di test vengano compilate correttamente, cancella la cartella di destinazione di Maven (e qualsiasi cartella bin che Eclipse potrebbe utilizzare). Stai usando anche m2eclipse, perché trovo che sia un po 'problematico.


grazie mille per la tua risposta, ma comunque: non funziona neanche; per prima cosa, devo includere spring-test.jar, quindi un'altra dipendenza non è soddisfatta. non capisco perché non funziona con una semplice classe helloworld nello stesso pacchetto. e lì, non ho bisogno di un "hack" come quello suggerito da te ... qualcosa deve essere sbagliato con "classpath" o qualcosa di simile, ma non capisco dove / cosa devo controllare ...
swalkner

0

La soluzione al mio problema che era simile: le librerie non erano valide. Se guardi nel file .classpath del progetto, vedrai i tag classpathentry con la chiave / valore kind = "lib". Alcuni dei miei non erano corretti.

Non l'ho scoperto fino a quando non ho disattivato le impostazioni di convalida. Cioè, c'erano così tanti errori nei file JSP, ecc., Che gli errori del percorso di classe non erano evidenti (o forse addirittura visualizzati). Di conseguenza, non veniva compilato nulla nelle cartelle di output di destinazione, ma nessun errore utile sul perché.


0

Si prega di puntare per correggere JDK da Windows> Preferenze> Java> JRE installato.

Non indicare jre, ma un JDK corretto. Ho indicato JDK 1.6U29 e ho aggiornato il progetto.

D'ora in poi, il problema è stato risolto e i test jUnit funzionano correttamente.

Grazie,
-Tapas


0

Recentemente ho riscontrato lo stesso errore in Eclipse, ovvero l'IDE Eclipse non è riuscito a trovare la classe di test unitario indipendentemente da come cambio le configurazioni. Imparando dai post precedenti qui e in altri siti web, ho ricontrollato e controllato tre volte il percorso di classe e le informazioni sull'origine e ho spostato su e giù la cartella e le librerie di origine, sia in "Esegui configurazione" che in "Percorso build Java "config windows e ho anche pulito il progetto e ricostruito, ma nessuno dei trucchi funziona per me. Il progetto Java specifico è un vecchio progetto compilato da ANT e ha molti vasi inclusi nella libreria Eclipse.

Quindi, ho cambiato la classe di unit test per aggiungere un metodo main () e fare clic con il pulsante destro del mouse su "Esegui come" un'applicazione Java invece del test JUnit, e improvvisamente, Eclipse sembra svegliarsi e identificare correttamente la classe. Successivamente, l'ho ripristinato a un'applicazione di test unitario e funziona ancora.

Questo sembra essere un bug in Eclipse, immagino che il gran numero di librerie (> 260) possa confondere la capacità della JVM di individuare la mia classe JUnit.


0

Anche questo problema mi ha colpito e sono riuscito a trovare una soluzione sufficiente per il mio caso. Se il tuo progetto Eclipse ha un file .classpath nella root del tuo progetto (guardalo nella vista Navigator invece che nella vista Package Explorer), assicurati che il tuo classpathentry Maven appaia prima del tuo classpathentry JRE Container.

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>

Se il tuo progetto non ha un file .classpath, puoi modificare il Java Build Path del tuo progetto per cambiare Ordine ed Esporta. Se il tuo progetto ha il file .classpath e modifichi il tuo ordine solo in Java Build Path, vedrai che l'ordine non è influenzato e il problema continuerà a verificarsi.

E un progetto-> pulito non danneggia mai le cose dopo aver apportato il cambiamento.


0

Assicurati che la configurazione del lancio di prova NON contenga le seguenti righe, OPPURE prova ad abilitare la gestione automatica delle dipendenze Maven.

<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.classpathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.sourcepathProvider"/>

0

Ho provato tutto quello che ho letto in questo lungo post e, incredibilmente, quello che ha funzionato per me è stato, piuttosto che fare clic sulla classe di test e selezionare Run as JUnit test, fare clic sul metodo di prova ed eseguire come JUnit test. Non ho idea del perché?


0

Il test JUnit dall'interno di eclipse mi ha dato anche NoClassDefFoundError. L'esecuzione di 'mvn clean test' dalla riga di comando mi ha dato il seguente errore su diversi barattoli: intestazione LOC non valida (firma errata) L'eliminazione di questi barattoli dal repository m2 locale e l'esecuzione di 'mvn clean test' hanno risolto nuovamente il mio problema.


0

Ho avuto lo stesso problema. Tutto quello che ho fatto è stato

io). Artefatti Eclipse generati

mvn clean eclipse:eclipse

ii). Aggiorna il progetto ed esegui nuovamente il test junit. Dovrebbe funzionare bene.


0

Inoltre, CONTROLLA DOPPIA la finestra di dialogo "Web Deployment Assembly" di eclipse.

Questo può essere trovato: Proprietà progetto-> Assembly di distribuzione.

Recentemente ho avuto un plug-in di eclipse che modifica uno dei miei progetti web e ha aggiunto ~ misteriosamente ~ le directory di test maven / src / test / java, / src / test / resources al Deployment Assembly. UGGGG !!!

Questo è il motivo per cui il mio progetto ha funzionato bene quando ho costruito e distribuito solo direttamente Maven su Tomcat, senza ClassNotFoundExceptions ... Tuttavia, quando ho fatto il deploy tramite Eclipse, Whammo !! Comincio a ricevere ClassNotFoundExceptions perché il TestCode viene distribuito.

Eric


0

Ciò significa che il tuo pom.xml ha problemi irrisolti. Apri la vista dei problemi e risolvi di conseguenza. Quindi sarai in grado di eseguire i casi di test con successo senza incontrare l'eccezione classnotfoundexception.


0

La modifica dell'ordine degli artefatti del percorso di classe in Java Build Path ha risolto il problema per me.

  1. Fare clic con il tasto destro sul progetto e andare al percorso di creazione del progetto.
  2. Vai alla scheda Ordina ed esporta e sposta la libreria di sistema JRE dopo le sorgenti.

Questo dovrebbe risolverlo.

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.