Javamail

Underpay0299

Mitglied
Hallo,
ich versuche mich momentan mit Javamail 1.4.5. In Eclipse neon.3 klappt das auch. Aber sobald ich das Projekt exportiere bekommen ich den Fehler:
Code:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
        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)
        ... 7 more

Was kann ich tun?
Code:
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class main {
   public static void main(String[] args) {

       final String username = "ich";
       final String password = "mein pwd";

       Properties props = new Properties();
       props.put("mail.smtp.auth", "true");
       props.put("mail.smtp.starttls.enable", "true");
       props.put("mail.smtp.host", "smtp.gmail.com");
       props.put("mail.smtp.port", "587");

       Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
           protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
           }
         });

       try {

           Message message = new MimeMessage(session);
           message.setFrom(new InternetAddress("xyz@xyz.xyz"));
           message.setRecipients(Message.RecipientType.TO,
               InternetAddress.parse("xyz@xyz.xyz"));
           message.setSubject("Testing Subject");
           message.setText("Dear Mail Crawler,"
               + "\n\n No spam to my email, please!");

           Transport.send(message);

           System.out.println("Done");

       } catch (MessagingException e) {
           throw new RuntimeException(e);
       }
   }

}
 
Liegt die Bibliothek auch nach dem Exportieren noch im Class Path?
Öffne deine exportierte JAR einmal mit WinRar/7Zip und guck in "META_INF" > "MANIFEST.MF"
 
Das hier steht da drin:
Code:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: 1.6.0_26 (Sun Microsystems Inc.)
Built-By: shannon
Build-Jdk: 1.6.0_26
Extension-Name: javax.mail
Implementation-Title: javax.mail
Implementation-Vendor: Oracle
Implementation-Vendor-Id: com.sun
Implementation-Version: 1.4.5
Probe-Provider-XML-File-Names: META-INF/gfprobe-provider.xml
Specification-Title: JavaMail(TM) API Design Specification
Specification-Vendor: Oracle
Specification-Version: 1.4
Export-Package: javax.mail.internet;uses:="com.sun.mail.util,javax.mai
 l,javax.activation,javax.mail.util";version="1.4",javax.mail.util;use
 s:="javax.activation,javax.mail.internet";version="1.4",javax.mail.se
 arch;uses:="javax.mail.internet,javax.mail";version="1.4",javax.mail;
 uses:="javax.mail.event,javax.mail.search,javax.activation,com.sun.ma
 il.util";version="1.4",javax.mail.event;uses:="javax.mail";version="1
 .4",com.sun.mail.imap;uses:="com.sun.mail.iap,com.sun.mail.imap.proto
 col,javax.mail,javax.activation,com.sun.mail.util,javax.mail.internet
 ,javax.mail.search,javax.mail.event";version="1.4.5",com.sun.mail.ima
 p.protocol;uses:="com.sun.mail.iap,com.sun.mail.util,javax.mail.inter
 net,javax.mail,javax.mail.search,com.sun.mail.imap,javax.security.sas
 l,javax.security.auth.callback";version="1.4.5",com.sun.mail.iap;uses
 :="com.sun.mail.util";version="1.4.5",com.sun.mail.pop3;uses:="javax.
 mail,com.sun.mail.util,javax.mail.internet,javax.net.ssl,javax.mail.u
 til";version="1.4.5",com.sun.mail.smtp;uses:="com.sun.mail.util,javax
 .mail.internet,javax.mail,javax.security.sasl,javax.security.auth.cal
 lback";version="1.4.5",com.sun.mail.util;uses:="javax.mail,javax.net.
 ssl,javax.mail.internet,javax.mail.util,sun.security.util,javax.net,j
 avax.security.auth.x500";version="1.4.5",com.sun.mail.util.logging;us
 es:="javax.mail,javax.mail.internet,javax.mail.util,javax.activation,
 com.sun.mail.smtp";version="1.4.5",com.sun.mail.handlers;uses:="javax
 .activation,javax.mail.internet,javax.mail,javax.xml.transform,javax.
 xml.transform.stream";version="1.4.5"
Tool: Bnd-0.0.357
Bundle-Name: JavaMail API
Bundle-Vendor: Oracle
DynamicImport-Package: *
Bundle-Version: 1.4.5
Bnd-LastModified: 1332282371691
Bundle-ManifestVersion: 2
Bundle-Description: JavaMail API
Bundle-License: http://www.sun.com/cddl, https://glassfish.dev.java.ne
 t/public/CDDL+GPL.html
Import-Package: com.sun.mail.handlers;version="1.4",com.sun.mail.iap;v
 ersion="1.4",com.sun.mail.imap;version="1.4",com.sun.mail.imap.protoc
 ol;version="1.4",com.sun.mail.pop3;version="1.4",com.sun.mail.smtp;ve
 rsion="1.4",com.sun.mail.util;version="1.4",com.sun.mail.util.logging
 ;version="1.4",javax.activation,javax.crypto,javax.crypto.spec,javax.
 mail;version="1.4",javax.mail.event;version="1.4",javax.mail.internet
 ;version="1.4",javax.mail.search;version="1.4",javax.mail.util;versio
 n="1.4",javax.net,javax.net.ssl,javax.security.auth.callback,javax.se
 curity.auth.x500,javax.security.sasl;resolution:=optional,javax.xml.t
 ransform,javax.xml.transform.stream,sun.security.util;resolution:=opt
 ional
Bundle-SymbolicName: com.sun.mail.javax.mail
Bundle-DocURL: http://www.oracle.com
 
Ist das das MANIFEST deiner JAR oder ist es das MANIFEST der Java Mail API?
Wichtig ist nämlich das MANIFEST deiner JAR.

Da müsste es dann einen Eintrag "Class-Path" geben und in diesem Eintrag müsste auf die Java Mail API verwiesen werden.
 
Jo es wird auf die Mail API verwiesen:
Code:
Bundle-Name: JavaMail API
Bundle-Vendor: Oracle
DynamicImport-Package: *
Bundle-Version: 1.4.5
Bnd-LastModified: 1332282371691
Bundle-ManifestVersion: 2
Bundle-Description: JavaMail API
 
Normalerweise sieht eine MANIFEST Datei etwa so aus:
Code:
Manifest-Version: 1.0
Class-Path: . lib/mail.jar
Main-Class: de.pak.MyMainClass
 
Keine Ahnung aber du kannst es selber fixen indem du beim exportieren ein Benutzerdefiniertes MANIFEST mitgibst.

Müsste so aussehen:
Code:
Manifest-Version: 1.0
Class-Path: . pfad/zu/der/java/mail/api.jar
Main-Class: voller.name.der.Hauptklasse
<HIER MUSS EINE LEERZEILE HIN>

Die Bibliotheken auf dem Class-Path werden mit einem Leerzeichen getrennt.
Der Punkt am Anfang ist wichtig.
 

Zurück
Oben