¿Cómo resuelvo ClassNotFoundException?

106

Estoy intentando ejecutar una aplicación Java, pero obtengo este error:

java.lang.ClassNotFoundException:

Después de los dos puntos aparece la ubicación de la clase que falta. Sin embargo, sé que esa ubicación no existe ya que la clase se encuentra en otro lugar. ¿Cómo puedo actualizar la ruta de esa clase? ¿Tiene algo que ver con la ruta de clases?

usuario2426316
fuente
1
Debe agregar el frasco que tiene la clase que falta a la clase ptah
Crom
si su clase tiene un paquete, vaya a la carpeta que contiene la clase. por ejemplo, si el paquete es el paquete test.abc, vaya a la carpeta antes de la prueba y luego ejecute java -cp. test.abc.CLASSNAME (sin .class). Si no hay ningún paquete, vaya a la carpeta que contiene la clase y diga java -cp. CLASSNAME
Opcional
O una clase no se implementó en su tiempo de ejecución (por ejemplo, jar faltante), o la clase no está visible en un cargador de clases determinado, verifique esta herramienta que ayuda a solucionar estos problemas: jhades.org
Angular University
1
También me encuentro con esto a veces. Esta excepción viola claramente la regla de indicar todo el contexto necesario en un mensaje de excepción. Debe mencionar dónde intentó buscar la cosa, qué hay en su ruta de clases. Crea mejores mensajes de excepción. No nos obligue a buscar información que pueda ayudar a resolver el problema.
masterxilo

Respuestas:

32

Su classpath está rota (que es un problema muy común en el mundo de Java).

Dependiendo de cómo inicie su aplicación, debe revisar el argumento de -cpsu entrada Class-Path en MANIFEST.MF o el diseño de su disco.

Thorbjørn Ravn Andersen
fuente
34
¿Puedes ser más específico sobre el eclipse? ¿Que tengo que hacer?
user2426316
24
Su pregunta no contiene suficiente información para proporcionar una respuesta más específica. Considere agregar eso.
Thorbjørn Ravn Andersen
La resolución de dependencias / desajustes de versión es un problema muy común en básicamente todos los entornos de programación. Podríamos decir que todo lo que hace cualquier programa es resolver tales definiciones ... la pregunta siempre es ¿qué / dónde está la definición y a qué versión se refería?
masterxilo
2
Solo estoy enfatizando que, además del mundo Java, todo el software tiene una lucha para garantizar que se encuentren las versiones correctas de las dependencias. Puedo mencionar dll-hell, administradores de paquetes, administradores de versiones, lista de materiales de Spring Boot y contenedores Docker como ejemplos de este problema y posibles soluciones. Cuanto mayor sea la fracción de código foráneo becones, mayor será el problema.
masterxilo
@masterxilo Sí, pero ese no es necesariamente el problema aquí y es posible que esté ladrando al árbol equivocado. Todo lo que se puede decir es que el classpath está roto.
Thorbjørn Ravn Andersen
45

Un classpath es una lista de ubicaciones desde las que cargar clases.

Estas 'ubicaciones' pueden ser directorios o archivos jar.

Para los directorios, la JVM seguirá un patrón esperado para cargar una clase. Si tengo el directorio C: / myproject / classes en mi classpath, e intento cargar una clase com.mycompany.Foo , buscará en el directorio de clases un directorio llamado com , luego debajo de ese directorio llamado mycompany , y finalmente buscará un archivo llamado Foo.class en ese directorio.

En la segunda instancia, para archivos jar, buscará el archivo jar para esa clase. Un archivo jar es en realidad solo una colección comprimida de directorios como el anterior. Si descomprime un archivo jar, obtendrá un montón de directorios y archivos de clases siguiendo el patrón anterior.

Entonces, la JVM atraviesa una ruta de clase de principio a fin buscando la definición de la clase cuando intenta cargar la definición de la clase. Por ejemplo, en la ruta de clases:

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

La JVM intentará buscar primero en las clases del directorio , luego en stuff.jar y finalmente en otherstuff.jar .

Cuando obtiene una ClassNotFoundException, significa que la JVM ha atravesado toda la ruta de clases y no ha encontrado la clase a la que ha intentado hacer referencia. La solución, como ocurre tan a menudo en el mundo Java, es comprobar su classpath.

Defina una ruta de clase en la línea de comando diciendo java -cp y luego su ruta de clase . En un IDE como Eclipse, tendrá una opción de menú para especificar su ruta de clases.

usuario2000590
fuente
13

Esta es la mejor solución que encontré hasta ahora.

Supongamos que tenemos un paquete llamado que org.mypackagecontiene las clases:

  • HelloWorld (clase principal)
  • SupportClass
  • UtilClass

y los archivos que definen este paquete se almacenan físicamente en el directorio D:\myprogram(en Windows) o /home/user/myprogram(en Linux).

La estructura del archivo se verá así: ingrese la descripción de la imagen aquí

Cuando invocamos Java, se especifica el nombre de la aplicación se ejecute: org.mypackage.HelloWorld. Sin embargo, también debemos decirle a Java dónde buscar los archivos y directorios que definen nuestro paquete. Entonces, para lanzar el programa, tenemos que usar el siguiente comando: ingrese la descripción de la imagen aquí

NOTA: Debe ejecutar el javacomando anterior sin importar cuál sea su ubicación actual. Pero este no es el caso de javac. Para compilar, incluso puede ir directamente al directorio donde tiene sus .javaarchivos y ejecutarlos directamente javac ClassName.java.

Ram Patra
fuente
6

Si conoce la ruta de la clase o el jar que contiene la clase, agréguelo a su ruta de clases mientras la ejecuta. Puede usar el classpath como se menciona aquí:

en Windows

java -classpath .;yourjar.jar YourMainClass

en UNIX / Linux

java -classpath .:yourjar.jar YourMainClass
Juned Ahsan
fuente
4

Pruebe estos si usa maven. Utilizo maven para mi proyecto y cuando lo hago mvn clean installe intento ejecutar un programa, lanza la excepción. Entonces, limpio el proyecto y lo ejecuto nuevamente y funciona para mí.

Yo uso eclipse IDE.

Para la excepción de clase no encontrada al ejecutar la prueba Junit, intente ejecutar mvn clean testuna vez. Compilará todas las clases de prueba.

Arun
fuente
¿En qué directorio estaba cuando ejecutó "mvn clean test"? ¿Está en el mismo directorio que el POM?
TacoB0t
1
Si. Lo ejecuté desde el directorio donde está presente el archivo pom.
Arun
3

Para agregar la ubicación de una clase a su ruta de clases a través de la línea de comando, simplemente agregue -cpoy -classpathla ubicación de la clase mientras la ejecuta. ES DECIR

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

O si está ejecutando un IDE como eclipse, puede hacer clic derecho en project -> build path -> configure build path y agregar el JAR externo que contiene su clase a la ruta de compilación, entonces debería funcionar bien.

invictvs1
fuente
3

Utilizar ';' como separador. Si sus variables de entorno están configuradas correctamente, debería ver su configuración. Si su PATH y CLASSPATH son correctos, Windows debería reconocer esos comandos. NO necesita reiniciar su computadora al instalar Java.

Kiran S Kulkarni
fuente
5
Eso está en Windows (punto y coma), en Unix / Linux es ':' (dos puntos)
Joeblade
3

Agregue la ruta completa del archivo jar a CLASSPATH. En uso de linux:export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH" . Otra forma de trabajar (sin editar CLASSPATH) fue descomprimir el archivo jar en la carpeta del proyecto actual.

Las formas no funcionaron para mí:

1) Usando la -cpopción con la ruta completa del archivo jar.

2) Usar -cpsolo con el nombre de jar cuando se encuentra en la carpeta actual

3) Copiar el tarro a la carpeta del proyecto actual

4) Copiar el archivo jar en la ubicación estándar de los archivos Java (/ usr / share / java)

Esta solución se informa para la clase com.mysql.jdbc.Driver en mysql-connector-java.5 - *. Jar, trabajando en linux con OpenJDK versión 1.7

Persona anónima
fuente
Solo descomprimir el JAR funcionó para mí, ninguna de las otras soluciones lo hizo
OverCoder
2

Suba a la parte superior y elimine la declaración de importación si la hay, y vuelva a importar la clase. Pero si ese no es el caso, haz una limpieza y luego construye. ¿Estás usando Netbeans o Eclipse?

batatas
fuente
2

Me encontré con esto también y probé todas las otras soluciones. No tenía el archivo .class en mi carpeta HTML, solo tenía el archivo .java. Una vez que agregué el archivo .class, el programa funcionó bien.

Jason Robertson
fuente
2
  1. Podría suceder si su ruta de clases no es correcta

  2. Postulemos una clase serializable y una clase deserializable bajo el mismo nombre de proyecto. Ejecuta la clase serializable, creando un objeto serializable en una carpeta específica. Ahora necesita los datos desearializados. Mientras tanto, si cambia el nombre del proyecto, no funcionará. Primero debe ejecutar la clase serializable y luego deserializar el archivo.

Omar Faroque Anik
fuente
2

Si está utilizando maven, intente actualizar todos los proyectos y forzar las instantáneas. También limpiará y reconstruirá todas las rutas de clases. Resolvió mi problema.

ibrahimgunes
fuente
2

Lo acabo de hacer

1.Invalidar cachés y reiniciar

2. Reconstruí mi proyecto que resolvió el problema

Jyoti JK
fuente
1

Estaba tratando de ejecutar .jar desde el código C # usando Processclass. El código java se ejecutó con éxito desde eclipse pero no desde C # visual studio e incluso haciendo clic directamente en el archivo jar, siempre se detuvo con ClassNotFoundException:excepción. La solución para mi fue exportar el programa Java como "Archivo JAR ejecutable" en lugar de "Archivo JAR". Espero que pueda ayudar a alguien.

Dani Aya
fuente
1

Esto puede suceder en Windows después de una actualización de Java en la que falta la versión anterior del SDK de Java y hay una nueva. Verificaría si su IDE está usando la versión del SDK de java instalada (IntelliJ: CTRL + SHIFT + ALT + S)

s5s
fuente
1

Si ha agregado varias bibliotecas (de terceros) ** y amplía ** la clase de aplicación

Entonces podría ocurrir.

Para eso, debe configurar multiDexEnabled truey reemplazar su Applicationclase extendida con MultiDexApplication.

Se solucionará.

Parth Patel
fuente
1

Pregunta genérica básica - Respuesta genérica más simple;)

Dada la información, asumiré que puede estar probando un enfoque básico para codificar, construir / compilar y ejecutar una aplicación de consola simple como "Hello World", usando un editor de texto simple y algo de Command Shell.

Este error ocurre en el escenario de barbecho:

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

En otras palabras, use:

..\SomePath>java HelloWorld

PD: La adición de la extensión de archivo .class produce el mismo error. También asegúrese de tener la carpeta bin de Java (JDK / JRE) en la RUTA de Variables de entorno del sistema operativo. (Busque más detalles en otras publicaciones sobre esto) PPS ¿Estaba en lo correcto en mis suposiciones?

Vasil
fuente
1

Si usa maven, verifique que tenga este complemento en su 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>

Pondrá su dependencia (la razón de la excepción) a su jar.

FYI : esto incluirá todas las dependencias infladas en el frasco final

techkuz
fuente
@Archit agregado.
techkuz
0

En mi caso, la clase lanzada como excepción de clase no encontrada tiene propiedades relacionadas con los certificados ssl. Cierre el eclipse y ábralo con "Ejecutar como administrador", luego el problema se resolvió. Como el eclipse tiene permisos relacionados con el problema, generará este tipo de excepción.

Shaik Elias
fuente
-7

Coloque todo el código en el bloque try y luego capture la excepción en un bloque catch

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}
sharukh
fuente
5
Esto no resuelve la excepción. Esto oculta la excepción. Además, "e1.getmessage ()" es a) el uso incorrecto de mayúsculas de getMessage () yb) no va a hacer mucho, ya que devuelve una cadena con un mensaje y no lo imprime ni lo registra ni nada.
IBBoard