Domanda

Sto sviluppando un'applicazione in Eclipse e funziona benissimo dall'interno di Eclipse. Il problema che sto avendo è che quando esporto in un file jar ed eseguirlo da riga di comando ottengo un errore NoClassDefFound per javax.mail.internet.

In entrambi mio percorso del progetto di costruzione e il percorso di classe Ho compreso l'activation.jar e librerie mail.jar necessari per me di utilizzare javax.mail.internet, e come ho detto funziona benissimo dall'interno di Eclipse, ma non quando ho esportazione ad un barattolo. Se il mio percorso di generazione ha quei file e così fa il mio percorso di classe perché sarebbe questo non lavorare?

Questa è la stack errori: 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

È stato utile?

Soluzione

Wow mi sento come un completo idiota. Tutto quello che dovete fare è durante l'esportazione in un file jar invece di scegliere "File JAR" in Eclipse scegliere "Runnable file JAR" e poi dirgli di confezionare le librerie richieste in esso per mantenerlo piccolo e wa-la, tutto funziona bene .

Un'altra possibilità è quella di aggiungere questa riga nel file manifesto in cui si crea il vaso: Class-Path: lib/mail.jar

E poi basta avere una cartella lib con mail.jar in esso all'interno della stessa cartella che il vaso esportato sarà in. Boom.

La prima opzione è la migliore a mio parere.

Altri suggerimenti

Questa è quasi certamente un problema di percorso di classe. Provare ad aprire il JAR è stato esportato (tramite WinZip, o rinominare a un .zip e utilizzare Windows) e sia esaminare la struttura delle cartelle Jarred per stabilire che "javax / mail / internet /" esiste e il file InternetAddress.class è contenuto con esso. O aprire il MANIFEST.MF situato all'interno del JAR per determinare che esso contiene una voce di percorso di classe e le giare specificati nella esistono manifesta nelle posizioni specificate dal manifesto.

Modifica Esaminare classpath runtime stampando dalla proprietà di sistema nella JVM.

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

Credo che lo troverete mancanti, mi dispiace per farvi passare attraverso il lavoro supplementare di ispezione manuale, ma a volte è rivelatrice.

In genere file jar non sono contenuti all'interno di un barattolo. Ci sono due modi per esportare un jar eseguibile:

  1. Jar file di classe e includono un manifesto che specifica il percorso di classe in cui la JVM può trovare altre librerie relative al proprio.
  2. Jar file di classe insieme con il contenuto di altri vasi in un unico vaso. Questo è più probabile che ciò che si vuole e può essere realizzato utilizzando Eclipse "esportazione ...> Runnable file JAR" mago. Assicurarsi di utilizzare "File JAR Runnable" e selezionare le configurazioni passano proprio.

Si potrebbe trovare questa domanda così rilevante: Percorso di classe tra cui JAR all'interno di un JAR

Una possibilità potrebbe essere che qualcosa di quella classe quel pacchetto javax.mail dipende (dipendenza aka transitiva) mancava. Ma vorrei prima controllare due classpath; java riga di comando eseguibile non indica le directory mancanti (o non-esistente vasetti di cui) a tutti -. Ho a volte mescolato punto e virgola e due punti come separatore di percorso, e questo si traduce in classi non essere trovati

Una cosa bella JDK 1.6 finalmente avuto è stata la capacità di definire i caratteri jolly, in modo tale che si può fare:

  java -cp lib/\*

(barra rovesciata usato per citare asterisco modo unix shell non espanderla)

che includerebbe tutte le giare dalla directory 'lib /'; in modo che non c'è bisogno di aggiungere manualmente tutti i singoli barattoli in quella directory.

add mail.jar al classpath, e assicurarsi che la directory di partenza è il genitore del lib (quest'ultimo sembra il più problema probabile). è possibile avviare il principale metodo w / smth come:

System.getProperties().store(System.out, "boot props");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top