2010-07-12 12 views
12

Estoy intentando ejecutar una aplicación de ejemplo de HttpClient 4.0.1. Es el archivo ClientMultiThreadedExecution.java de la sección de ejemplos. Pongo en estos archivos en la ruta de clase: apache-mime4j-0.6.jar; commons-codec-1.3.jar; commons-logging-1.1.1.jar; httpclient-4.0.1.jar; httpcore-4.0.1.jar; httpmime-4.0.1.jar y el archivo se compila correctamente. En tiempo de ejecución me sale el siguiente error:HttpClient NoClassDefFoundError

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest 
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpUriRequest 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 

¿Falta una referencia? Parece un error de classpath pero no puedo averiguar qué archivo jar incluir? Gracias de antemano por su ayuda.

Respuesta

5

Esta excepción dice que la clase mencionada no se encuentra en el tiempo de ejecución ruta de clase.

Existen varias formas de especificar el classpath en tiempo de ejecución, dependiendo de cómo se está ejecutando el programa. Como un IDE decente toma todo esto de forma transparente de sus manos, apuesto a que lo está ejecutando en un símbolo del sistema.

Si se está utilizando como un archivo JAR java.exe -jar o doble clic en el archivo, a continuación, debe especificar la ruta de clase en el Class-Path entrada del archivo JAR del MANIFEST.MF. Tenga en cuenta que la variable de entorno %CLASSPATH% y los argumentos -cp y -classpath son ignorados cada vez que ejecuta un JAR.

Si lo está ejecutando como una aplicación Java "plain vanilla" por java.exe, entonces debe especificarlo en el argumento -cp o -classpath. Tenga en cuenta que cada vez que se utiliza este argumento, la variable de entorno es %CLASSPATH%ignorados.

De cualquier forma, el classpath debe existir de una cadena de rutas (semi) separadas por columnas a archivos JAR (rutas absolutas o relativas al directorio de trabajo actual). P.ej.

java -cp .;/path/to/file1.jar;/path/to/file2.jar com.example.MyClass

(si está en Unix/Linux, utiliza dos puntos en lugar de punto y coma como separador de ruta)

5

Esa clase está en httpclient-4.0.1.jar (la acabo de descargar para estar seguro) así que sospecho que no la ha colocado correctamente en el classpath.

¿Cómo compila y ejecuta su código?

+0

Uso del panel de texto. Está en el mismo directorio que los archivos JAR y lo tengo en la configuración $ File -cp.; Apache-mime4j-0.6.jar; commons-codec-1.3.jar; commons-logging-1.1.1.jar; httpclient-4.0.1.jar; httpcore-4.0.1.jar; httpmime-4.0.1.jar Se compila bien pero no se ejecuta. – user389753

-1

con Maven esto se puede hacer a través de alcance de importación.

0

Cuando experimenté este problema, resultó que cuando agregué la API de Fluent como una dependencia de Maven, importó una versión diferente de la API de HTTPClient que la que ya estaba usando. Ambas versiones de la API se empaquetaron en la carpeta lib resultante de JAR. El conflicto de versión es lo que causó este error.

Adición de entradas a la ruta de clases se solucionará el problema, ya que está justo especificando manualmente la versión de usar. Sin embargo, para solucionar el problema subyacente, solo necesitaba eliminar mi carpeta de destino antes de reconstruir (o ejecutar Maven Clean). Esto eliminó todos los JAR de la biblioteca "en caché", y en la siguiente compilación, solo volvió a descargar el correcto.

la esperanza de que ayude a alguien!

1

Ejecutando Eclipse Luna 2 (4.4.2) dentro de cloudera-quickstart-vm-5.8.0 he tenido que añadir la siguiente

  • Apache-httpcomponents-httpcore.jar
  • httpclient-4.5.3.jar
  • httpclient-cache-4.5.3.jar

.. .y luego funcionó sin errores