Eclipse - java.lang.ClassNotFoundException


95

Al intentar iniciar mi JUnit-Test desde Eclipse, obtengo una "ClassNotFoundException". Al ejecutar "mvn test" desde la consola, todo funciona bien. Además, no se han informado problemas en Eclipse.

La estructura de mi proyecto es la siguiente:

  • proyecto principal (pom-packaging)
    • Proyecto web (war-packaging - mi JUnit-test está aquí)
    • Proyecto Flex
    • Proyecto de configuración

editar: ¿Cómo no se puede encontrar la clase? Es una simple aplicación HelloWorld sin bibliotecas especiales.

Aquí está la configuración de ejecución de mi JUnit: texto alternativo http://www.walkner.biz/_temp/runconfig.png


Testclass (pero como dije; tampoco funciona con un simple 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
Recibo el mismo error cuando intento ejecutar una clase simple HelloWorld sin JUnit incluido ... Más exactamente: java.lang.NoClassDefFoundError: HelloWorld Causado por: java.lang.ClassNotFoundException: HelloWorld
swalkner

Se lanza ClassNotFoundException cuando se intenta reflexionar sobre una clase. NoClassDefFoundError se lanza cuando intenta utilizar la clase en una llamada de método normal.
akf

¿Puedes mostrar el código de tu clase de prueba?
akf

¿Tiene compilación activada o desactivada automáticamente?
Jon

la compilación está activada automáticamente
swalkner

Respuestas:


193

Me he encontrado con esa situación varias veces y, después de muchos intentos, encontré la solución.

Verifique la ruta de construcción de su proyecto y habilite carpetas de salida específicas para cada carpeta. Vaya uno por uno a través de cada carpeta de origen de su proyecto y configure la carpeta de salida que usaría maven.

Por ejemplo, su proyecto web src/main/javadebe tener target/classesbajo el proyecto web, las clases de prueba target/test-classestambién deben tener bajo el proyecto web y así.

El uso de esta configuración le permitirá ejecutar pruebas unitarias en eclipse.

Solo un consejo más, si las pruebas de su proyecto web requieren algunos archivos de configuración que se encuentran debajo de los recursos, asegúrese de incluir esa carpeta como carpeta de origen y de realizar la configuración de ruta de compilación adecuada.

Espero eso ayude.


1
Hola Carlos, muchas gracias por tu consejo. Pero no ayudó, desafortunadamente. Agregué / src / main / java (target / classes) y / src / test / java (target / test-classes) a las carpetas de origen, así como src / main / resources (applicationContext.xml, algunas propiedades - target / classes ). El mismo problema: al iniciar mi src / test / java / UserDaoTest.java como JUnit-test de Eclipse, obtengo "Class not found UserDaoTest java.lang.ClassNotFoundException: UserDaoTest". Al menos, eso es un poco diferente al mensaje de error original ...
swalkner

5
Estás en el camino correcto, verifica si la clase UserDaoTest está en la carpeta de salida correspondiente dentro de tu sistema de archivos (como sabrás, Eclipse compila todos tus archivos fuente y los coloca en la carpeta de salida especificada, entre otros, para ser capaz de lanzar pruebas). Si la clase no aparece en la carpeta de salida, verifique los filtros de inclusión / exclusión de la ruta de compilación para esta carpeta específica. Buena suerte.
Carlos

Para mí, esto no solucionó el problema. Resultó que era un problema de AspectJ. Si está utilizando AspectJ, intente eliminar y leer las capacidades de AspectJ - me funcionó
Stefan Haberl

1
Tenía el mismo problema. Creo que es un proyecto de eclipse, maven, problema de git. Eso realmente no lo reduce, pero borrar todas las carpetas de metadatos (.project, .whatever ...), eliminar el proyecto y volver a importar solo como un proyecto maven funcionó para mí. También encontré algo que no sabía que eclipse-junit podía hacer: resaltar el método de prueba y seleccionar RunAs-Junit solo ejecuta ese método de prueba en particular, ¡no toda la prueba! ¡No más por @Ignoretodo el lugar y atajos gui!
bgs

Estaba enfrentando el mismo problema, simplemente usé Eclipse -> Proyecto -> limpio y funcionó. Mvn clean no funcionó.
Nutan

46

¡El acercamiento de Carlos ayudó! Eclipse: java.lang.ClassNotFoundException

Intente verificar la ruta de clase de la configuración de ejecución de junit:

  1. Abra sus configuraciones de ejecución
  2. Haga clic en el jUnit-Test que desea iniciar
  3. ir a la pestaña classpath
  4. Intente agregar una carpeta (haga clic en las entradas de usuario, haga clic en avanzado, haga clic en agregar carpetas, haga clic en aceptar y busque la carpeta de salida para sus clases de prueba (las que encuentra en projektproperties java build path, source))

funciona para mi.


2
¿No es esto muy extraño? Funcionó para mí, pero el directorio de clases de destino es parte de la ruta de clases de compilación para el proyecto. No tiene mucho sentido que necesite agregar una clase específica.
Jose Muanis

No creo que esta acción agregue necesariamente un directorio necesario, sino que desencadena que se vuelva a cargar algo. Es probable que pueda eliminar inmediatamente el directorio recién agregado después de una ejecución exitosa y debería funcionar normalmente. Además, el comentario anterior es correcto. Es posible que también desee votar a favor del elogio mencionado de Carlos.
Publicado el

Encontré que la respuesta a otra pregunta SO es más útil con este problema: stackoverflow.com/a/5718520/901641
ArtOfWarfare

16

su ruta de clase de compilación es correcta, por lo que puede compilar. el classpath para su JUnit necesita ser verificado. vaya al menú Ejecutar y elija 'abrir diálogo de ejecución'. allí debería ver un árbol a la izquierda con JUnit como opción. abra ese nodo y busque y seleccione su prueba. en el panel derecho verá una pestaña para classpath. eche un vistazo para asegurarse de que se encuentre la clase que la prueba está intentando crear.

editar:

esto parece ser un problema con maven y su comportamiento después de un lanzamiento cambió las carpetas de salida predeterminadas de Eclipse. he visto soluciones descritas donde

  • colocando maven en el bootclasspath POR ENCIMA del jre funciona, o
  • correr mvn clean testhace el truco o
  • Actualizar todos sus proyectos de eclipse, lo que hace que una reconstrucción solucione el problema
  • yendo a su proyecto y seleccionando Maven-> Actualizar configuración para resolver el problema

con los tres primeros, hubo informes del problema recurrente. el último me parece mejor, pero si no funciona, intente con los demás.

aquí y aquí hay algo de información


1
desafortunadamente, "Maven => Actualizar configuración" no resuelve el problema en absoluto ... lo contrario es cierto; elimina las configuraciones de ruta de construcción ... ¿O eso significa que alguna otra configuración es mala?
swalkner

Exactamente como señaló @swalkner: Maven => La configuración de actualización arruinará la configuración de la ruta de compilación. Por alguna razón que se me escapa, el complemento establecerá filtros de exclusión que siempre tengo que eliminar manualmente después de ejecutar el comando
Stefan Haberl

"vaya al menú Ejecutar y elija 'abrir diálogo de ejecución'. ¿Dónde está eso?
Berit Larsen

4

El problema puede ser que falte el archivo de clase en su carpeta de compilación. Una solución es limpiar el proyecto y reconstruirlo.


4

Habilitando [x] Use JAR temporal para especificar classpath (para evitar limitaciones de longitud de classpath) dentro de la pestaña Classpath de la configuración Ejecutar me resultó útil.

Si su proyecto es enorme y tiene muchas dependencias de otros proyectos hermanos y dependencias de maven, puede alcanzar las limitaciones de longitud de classpath y esta parece ser la única solución (además de hacer que el directorio de su repositorio local de maven sea más corto (el nuestro ya comienza) en c: / m2)

ingrese la descripción de la imagen aquí


3

Aquí hay muchas sugerencias complicadas.

Me he encontrado con este problema varias veces con los proyectos de Maven después de mover recursos arrastrando y soltando, o refactorizando los nombres de las clases.

Si esto ocurre, simplemente copie (no mueva) el caso de prueba problemático ( .java) a través del terminal / navegador de archivos a otra ubicación, right-click -> Deleteen Eclipse y elija eliminar en el disco cuando se le presente la opción, mueva / copie el archivo copiado a la ubicación del archivo original, luego seleccione su proyecto en Eclipse y presione F5 para actualizar los recursos.

Esto es rápido y fácil de hacer, y siempre me ha solucionado el problema de forma permanente.


Me siento tentado a preguntar si se ha solucionado tu problema de forma permanente , o siempre ... pero entiendo lo que quieres decir y, sorprendentemente, esto funcionó para mí.
Amos M. Carpenter

3

Tuve exactamente el mismo problema, ¡pero lo resolví! Vaya a su archivo de proyecto y haga clic derecho sobre él, luego haga clic Refresho presione F5. Luego intente ejecutarlo. Si aún no funciona, olvídelo, ya que tuve EXACTO el mismo problema y solo significa que tu versión de Eclipse es basura.



2

Sachin tiene razón: incluso con la ruta de clases correcta, la pestaña de problemas mostrará que alguna dependencia o el recurso / proyecto tiene un error que debe corregirse para que maven pueda construir y crear clases automáticamente cuando crea o hace un cambio en su clase de prueba .

"Hola,

Es julio muy antiguo (qué año) pero tuve el mismo problema.

El problema real encontró que eclipse no pudo generar un archivo de clase para el archivo java, classpath era correcto.

Vea la pestaña de problemas y verifique si a su proyecto le falta algo / archivo. puede crear un nuevo proyecto y agregar archivos uno por uno y compilarlos hasta que deje de compilar y crear clases (consulte el espacio de trabajo / proj / bin / paquete / carpeta para ver las clases)

Su extraño pero cierto, ecplise estaba fallando en la conformidad porque 4 de 20 archivos java usaban una sola imagen que faltaba. y como resultado, no se compiló ninguno de los archivos java.

CLASSPATH no es un problema aquí ".


2

Tuvimos la excepción exacta (usando SpringSource Tools, tomcat, en Win7) y la causa fue que habíamos refactorizado un nombre de archivo (renombrado un archivo) de SubDomain.java a Subdomain.java (D vs d) y de alguna manera chocó aunque SpringSource estaba mostrando el nuevo nombre Subdomain.java. La solución fue eliminar el archivo (a través de SpringSource) y volver a crearlo con el nombre Subdomain.java y copiar y pegar su contenido anterior. Simple como eso.


Siempre ejecuté casos de prueba junit, hasta que ejecuté el programa que verifica la compatibilidad de la PC antes de actualizar Windows. Eso pareció romper algo, no puedo volver a ejecutar los casos de prueba de JUnit. (y todas las respuestas existentes no funcionan)
CoffeDeveloper

2

Resuelvo esa ruta Bulit ---> bibliotecas ---> agregar biblioteca ---> Junit check junit4


1

haga clic en project->properties->Java build path->Sourcey verifique que cada srccarpeta aún sea válida, exista o se haya eliminado recientemente. Corrija cualquier ruta que falte o una ruta incorrecta y reconstruya y ejecute la prueba. Arreglará el problema.


1

Todo lo que hice fue Propiedades -> Ruta de compilación de Java -> Ordenar y exportar -> Activar todas las casillas sin marcar -> moví Junit completamente hacia arriba


1

Intentó

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

trabajado después

Maven 2 LifeCycle >> prueba


1

Probé todas las soluciones en esta página: actualizar el proyecto, reconstruir, limpiar todos los proyectos, reiniciar Eclipse, volver a importar (incluso) los proyectos, reconstruir maven y actualizar. Nada funcionó. Lo que funcionó fue copiar la clase a un nuevo nombre que funciona bien, extraño pero cierto.

Después de aguantar esto por un tiempo, lo solucioné:

  1. Mediante el Run menú
  2. Seleccione Run Configurations
  3. Elija la configuración de ejecución que está asociada con su prueba unitaria.
  4. Eliminando la entrada del Run Configurationpresionando eliminar o haciendo clic en la X roja.

Algo debe haberse estropeado con la configuración de ejecución en caché.


1
Después de perder demasiado tiempo, terminé siguiendo los pasos anteriores. Luego tomé la decisión heroica de eliminar todas las configuraciones de prueba de ejecución y ahora ninguna de mis pruebas se puede encontrar en la ruta de clase a pesar de que la nueva configuración de ejecución muestra claramente el proyecto en ella (con las dependencias de maven debajo). Sigo olvidando lo frágil que es el eclipse. Después de eso, no se pudieron ejecutar pruebas con eclipse (antes de que pudiera seleccionar una prueba en particular, ok). Finalmente, probé la sugerencia de KomodoDave a continuación. Eso solucionó las cosas ... asombrosos los bucles que tienes que atravesar con este ide (el último de una serie ...)
justin

1

Eliminar el proyecto de eclipse (no del disco duro) que de alguna manera es limpiar el espacio de trabajo y reimportar el proyecto a eclipse nuevamente funcionó para mí.


1

Por lo general, este problema ocurre mientras se ejecuta la javaherramienta de aplicación Java y no se puede encontrar el archivo de clase.

Principalmente en el proyecto maven, vemos este problema porque el problema de sincronización de Eclipse-Maven . Para solucionar este problema: Maven-> Actualizar configuración


0

¿Ha intentado hacer clic derecho en la raíz de su proyecto, seleccionar "propiedades" y asegurarse de que CLASSPATH sea correcto? Si mal no recuerdo, así es como lo haces.

¿Algo sobre la forma en que Eclipse ejecuta las pruebas unitarias que requiera que agregue junit JAR al tiempo de ejecución CLASSPATH de una manera especial?

Yo uso IntelliJ, así que no tengo estos problemas.

Verificaría Eclipse yo mismo, pero prefiero no tenerlo en mi escritorio.


bien, sin llevar a una discusión de Eclipse vs. IntelliJ; Me gustaría tenerlo en Eclipse ejecutándose ... y verifiqué la ruta de compilación de Java: el JDK de Java está allí y no necesito nada más para mi ejemplo de HelloWorld ... creo que tiene algo que ver con 'carpetas de origen en la ruta de compilación' ... las configuré en la carpeta donde comienza mi paquete ... supongo que es correcto.
swalkner

Necesita algo además del JDK, ese es el camino a HelloWorld.class, ¿verdad? "carpetas de origen en la ruta de construcción" - suena mejor. No hay necesidad de asumir, sea un experimentalista y pruébelo. Eclipse te dirá si estás en lo cierto.
duffymo

0

Mmm, parece un poco extraño, intente ejecutarlo con la siguiente anotación en la parte superior de la clase:

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

y déjame saber cómo te va.

Compruebe que también haya habilitado la compilación automáticamente. Si desea asegurarse de que sus clases de prueba se estén compilando correctamente, borre la carpeta de destino de Maven (y cualquier carpeta bin que Eclipse pueda estar usando). ¿Está utilizando m2eclipse también, ya que lo encuentro un poco problemático?


muchas gracias por tu respuesta, pero sin embargo: tampoco funciona; primero, tengo que incluir spring-test.jar, luego otra dependencia no se completa. No entiendo por qué no funciona con un simple helloworld-class en el mismo paquete. y ahí, no necesito un "truco" como el sugerido por usted ... algo debe estar mal con "classpath" o algo similar, pero no entiendo dónde / qué tengo que verificar ...
swalkner

0

La solución a mi problema era similar: las bibliotecas no eran válidas. Si busca en el archivo .classpath del proyecto, verá etiquetas classpathentry con la clave / valor kind = "lib". Algunos de los míos eran incorrectos.

No descubrí esto hasta que desactivé la configuración de Validación. Es decir, había tantos errores en los archivos JSP, etc., que los errores de classpath no eran evidentes (o posiblemente ni aparecieran). Como resultado, no se estaba compilando nada en las carpetas de salida de destino, pero no hubo errores útiles sobre el motivo.


0

Apunte para corregir JDK desde Windows> Preferencias> Java> JRE instalado.

No apunte a jre, apunte a un JDK adecuado. Señalé JDK 1.6U29 y actualicé el proyecto.

De ahora en adelante, el problema desapareció y las pruebas de jUnit funcionan bien.

Gracias,
-Tapas


0

Recientemente me encontré con el mismo error en Eclipse, es decir, el IDE de Eclipse no pudo encontrar la clase de prueba de unidad sin importar cómo cambie las configuraciones. Aprendiendo de las publicaciones anteriores aquí y en otros sitios web, verifiqué dos veces y tres veces la ruta de clase y la información de la fuente, y moví hacia arriba y hacia abajo la carpeta de origen y las bibliotecas, tanto en la "Configuración de ejecución" como en la "Ruta de compilación de Java "config windows, y también limpié el proyecto y lo reconstruí, pero ninguno de los trucos me funciona. El proyecto Java específico es un antiguo proyecto compilado de ANT y tiene muchos frascos incluidos en la biblioteca de Eclipse.

Luego, cambié la clase de prueba unitaria para agregar un método main () y haga clic con el botón derecho en "Ejecutar como" una aplicación Java en lugar de la prueba JUnit, y de repente, Eclipse parece despertar e identificar la clase correctamente. Luego, lo cambié de nuevo a una aplicación de prueba de unidad y todavía está funcionando.

Esto parece ser un error en Eclipse, supongo que la gran cantidad de bibliotecas (> 260) puede confundir la capacidad de la JVM para localizar mi clase JUnit.


0

También tuve este problema y pude encontrar una solución suficiente para mi caso. Si su proyecto Eclipse tiene un archivo .classpath en la raíz de su proyecto (véalo en la vista del navegador en lugar de en la vista del Explorador de paquetes), asegúrese de que su patrón de clase de Maven aparezca antes que su patrón de clase de contenedor de JRE.

<?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>

Si su proyecto no tiene un archivo .classpath, puede editar la ruta de compilación Java de su proyecto para cambiar el orden y la exportación. Si su proyecto tiene el archivo .classpath y solo cambia su orden en Java Build Path, verá que el orden no se ve afectado y el problema continuará ocurriendo.

Y un proyecto-> limpio nunca daña las cosas después de realizar el cambio.


0

Asegúrese de que su configuración de lanzamiento de prueba NO contenga las siguientes líneas, O intente habilitar la administración automatizada de dependencias de 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

Probé todo lo que leí en esta publicación larga y, increíblemente, lo que funcionó para mí fue, en lugar de hacer clic en la clase de prueba y seleccionar Run as JUnit test, hacer clic en el método de prueba y ejecutar como JUnit test. ¿No tengo ni idea de porqué?


0

La prueba JUnit desde el interior de eclipse también me dio NoClassDefFoundError. Ejecutar 'mvn clean test' desde la línea de comando me dio el siguiente error en varios frascos: encabezado LOC no válido (mala firma) Eliminar estos frascos del repositorio local m2 y ejecutar 'mvn clean test' nuevamente resolvió mi problema.


0

Yo tuve el mismo problema. Todo lo que hice fue

yo). Artefactos Eclipse generados

mvn clean eclipse:eclipse

ii). Actualice el proyecto y vuelva a ejecutar su prueba junit. Debería funcionar bien.


0

Además, COMPRUEBE DOBLE el cuadro de diálogo "Ensamblado de implementación web" del eclipse.

Esto se puede encontrar: Propiedades del proyecto-> Ensamblaje de implementación.

Recientemente, un complemento de eclipse modificó uno de mis proyectos web, y agregó ~ misteriosamente ~ agregó los directorios de prueba de maven / src / test / java, / src / test / resources al Ensamblado de implementación. UGGGG !!!

Es por eso que mi proyecto funcionó bien cuando construí e implementé solo maven en tomcat, sin ClassNotFoundExceptions ... Sin embargo, cuando hice la implementación a través de Eclipse, ¡¡Whammo !! Empiezo a recibir ClassNotFoundExceptions porque el TestCode se está implementando.

Eric


0

Eso significa que su pom.xml tiene problemas sin resolver. Abra la vista de problemas y resuelva en consecuencia. Entonces podrá ejecutar los casos de prueba con éxito sin encontrar la excepción classnotfoundexception.


0

Cambiar el orden de los artefactos de classpath en Java Build Path lo resolvió para mí.

  1. Haga clic derecho en el proyecto y vaya a la ruta de construcción del proyecto.
  2. Vaya a la pestaña Ordenar y exportar y mueva la biblioteca del sistema JRE después de las fuentes.

Esto debería arreglarlo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.