Pregunta

Estoy desarrollando una aplicación en Eclipse y funciona muy bien desde dentro de Eclipse. El problema que estoy teniendo es que cuando la exportación a un archivo JAR y ejecutarlo desde la línea de comandos consigo un error noClassDefFound para javax.mail.internet.

En tanto mi trayectoria de la estructura del proyecto y la ruta de clase He incluido el activation.jar y bibliotecas mail.jar requeridos para mí utilizar javax.mail.internet, y como dije funciona bien desde dentro de Eclipse, pero no me cuando la exportación a un frasco. Si mi trayectoria de la estructura tiene esos archivos y también lo hace mi ruta de clase ¿por qué esto no estar trabajando?

Esta es la pila de errores: Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/mai l/internet/InternetAddress at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour ce) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: javax.mail.internet.InternetAddress at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 27 more

¿Fue útil?

Solución

¡me siento como un completo idiota. Todo lo que tiene que hacer es cuando se exporta a un archivo JAR en lugar de elegir "JAR Archivo" en Eclipse elija "Archivo JAR Ejecutable" y luego dicen que para empaquetar las bibliotecas necesarias en ella para que sea pequeña y wa-la, todo funciona muy bien .

Otra de las opciones es añadir esta línea en el archivo de manifiesto cuando se crea el frasco: Class-Path: lib/mail.jar

Y a continuación, sólo tiene una carpeta lib con mail.jar en ella dentro de la misma carpeta que el frasco será exportada en. Boom.

La primera opción es el mejor en mi opinión.

Otros consejos

Esto es casi seguro que un problema de ruta de clases. Intente abrir el archivo JAR que ha exportado (a través de WinZip o cambiar el nombre de un archivo .zip y utilizar Windows) y, o bien examinar la estructura de carpetas en frasco para determinar que "javax / mail / Internet /" existe y el archivo InternetAddress.class está contenido con ella. O abrir la MANIFIEST.MF situado dentro de la jarra para determinar que contiene una entrada de ruta de clases y los frascos que se especifican en el existir manifiesta en los lugares especificados por el manifiesto.

Editar Examine su ruta de clase en tiempo de ejecución mediante la impresión de que la propiedad del sistema en la JVM.

System.out.println(System.getProperty("java.class.path"));

Creo que no lo encuentre, lo siento para que se vaya a través del esfuerzo adicional de inspección manual, pero a veces es revelador.

Normalmente archivos jar no están contenidos dentro de un frasco. Hay dos formas comunes para exportar un jar ejecutable:

  1. Tarro de archivos de clases e incluyen un manifiesto que especifica la ruta de clases, donde la JVM puede encontrar otras bibliotecas en relación con su cuenta.
  2. Tarro de archivos de clases junto con el contenido de otros frascos en un solo frasco. Esto es más probable lo que quiere y se puede lograr mediante el uso de "exportación ...> Ejecutable JAR Archivo" de Eclipse asistente. Asegúrese de utilizar "Archivo JAR Ejecutable" y seleccionar las configuraciones de ejecución correcta.

Usted puede encontrar esta cuestión tan relevante: de rutas de clases incluyendo JAR dentro de un JAR

Una posibilidad sería que algo de esa clase que el paquete depende de javax.mail (también conocido como dependencia transitiva) había desaparecido. Pero me gustaría primero asegúrese de ruta de clases; java línea de comandos ejecutable no indica los directorios que faltan (o no existente frascos se refiere) a todos -. He mezclado a veces hasta punto y coma y dos puntos como separador de ruta, y esto se traduce en clases no ser encontrado

Una cosa buena JDK 1.6 finalmente tuvo fue la capacidad para definir comodines, de manera que se puede hacer:

  java -cp lib/\*

(backslash solía citar asterisco tan UNIX shell no se expandirá IT)

que incluiría todos los frascos de directorio 'lib /'; de modo que usted no tiene que agregar manualmente todos los frascos individuales en ese directorio.

añadir mail.jar a la ruta de clases, y asegúrese de que el directorio de inicio es el padre de lib (este último parece lo más probable). usted puede comenzar su método principal w / Smth como:

System.getProperties().store(System.out, "boot props");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top