Java Mail: NoClassDefFoundError: javax/activation/DataSource
bash-3.00$ echo $CLASSPATH
.:/users/steve/TestProgramsLib/mail.jar:users/steve/TestProgramsLib/activation.jar
You appear to be missing a /
between mail.jar:
and users/steve
. This means java
is looking in the wrong place for activation.jar
(in ./users
rather than /users
).
Steve
Updated on June 04, 2022Comments
-
Steve almost 2 years
I wrote a small Java command line program to test sending emails from a remote server. I'm getting the dreaded "NoClassDefFoundError" and I can't figure out why.
The server is running:
- SunOS 5.10 Generic January 2005
- Java 1.5.0_30-b03 ( Sun, standard )
My java program is called
SendEmailACME
The error message is
Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource
The complete output from the run of the program is:
bash-3.00$ javac SendEmailACME.java bash-3.00$ java SendEmailACME SendEmailACME: Classpath: .:/users/steve/TestProgramsLib/mail.jar:users/steve/TestProgramsLib/activation.jar DEBUG: setDebug: JavaMail version 1.4.4 Exception in thread "main" java.lang.NoClassDefFoundError: javax/activation/DataSource at SendEmailACME.main(SendEmailACME.java:47) bash-3.00$
I ran
java -verbose SendEmailACME
The ouput was too long for stackoverflow. All it included was the regular output, plus a bunch of messages about java loading all of its regular libraries, the libraries from mail.jar, but I didn't see any from javax.activation.*
Output from "$ echo $CLASSPATH" is:
bash-3.00$ echo $CLASSPATH .:/users/steve/TestProgramsLib/mail.jar:users/steve/TestProgramsLib/activation.jar bash-3.00$
My home directory is
/users/steve
It contains these two directories
- TestPrograms
- TestProgramsLib
The first has my program SendEmailACME.java, SendEmailACME.class/ The second has the following jars in it:
bash-3.00$ ls -l total 1102 -rw-r--r-- 1 steve acme 55932 Apr 19 2006 activation.jar -rw-r--r-- 1 steve acme 494975 Jan 14 2011 mail.jar bash-3.00$
This is the source code of my command line program SendEmailACME:
import javax.mail.*; import javax.mail.internet.*; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import java.util.Properties; public class SendEmailACME { public static void main(String[] args) throws Exception{ String smtpServer = "msg.abc.acme.com"; int port = 25; String userid = "acme.staffdirectory"; String password = "password"; String contentType = "text/html"; String subject = "test: Send An Email, From A Java Client Using msg.abc.acme.com"; String from = "[email protected]"; String to = "[email protected],[email protected],[email protected],[email protected]"; String body = "<h1>Test. An Email, From A Java Client Using msg.abc.acme.com.</hi>"; System.out.println("SendEmailACME: Classpath: " + System.getProperty("java.class.path")); Properties props = new Properties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.host", smtpServer); Session mailSession = Session.getInstance(props); // Get runtime more runtime output when attempting to send an email mailSession.setDebug(true); MimeMessage message = new MimeMessage(mailSession); message.setFrom(new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, to); message.setSubject(subject); message.setContent(body,contentType); Transport transport = mailSession.getTransport(); transport.connect(smtpServer, port, userid, password); transport.sendMessage(message,message.getRecipients(Message.RecipientType.TO)); transport.close(); }// end function main() }// end class SendEmailACME
Here is the output from running a command to see what is inside activation.jar:
bash-3.00$ jar -tf activation.jar META-INF/MANIFEST.MF META-INF/SUN_MICR.SF META-INF/SUN_MICR.RSA META-INF/ META-INF/mailcap.default META-INF/mimetypes.default javax/ javax/activation/ javax/activation/ActivationDataFlavor.class javax/activation/MimeType.class javax/activation/MimeTypeParameterList.class javax/activation/MimeTypeParseException.class javax/activation/CommandInfo.class javax/activation/DataHandler$1.class javax/activation/DataHandler.class javax/activation/DataSource.class javax/activation/CommandMap.class javax/activation/DataContentHandler.class javax/activation/DataContentHandlerFactory.class javax/activation/CommandObject.class javax/activation/DataHandlerDataSource.class javax/activation/DataSourceDataContentHandler.class javax/activation/ObjectDataContentHandler.class javax/activation/FileDataSource.class javax/activation/FileTypeMap.class javax/activation/MailcapCommandMap.class javax/activation/MimetypesFileTypeMap.class javax/activation/SecuritySupport$1.class javax/activation/SecuritySupport$2.class javax/activation/SecuritySupport$3.class javax/activation/SecuritySupport$4.class javax/activation/SecuritySupport$5.class javax/activation/SecuritySupport.class javax/activation/URLDataSource.class javax/activation/UnsupportedDataTypeException.class com/ com/sun/ com/sun/activation/ com/sun/activation/registries/ com/sun/activation/registries/MailcapFile.class com/sun/activation/registries/MailcapParseException.class com/sun/activation/registries/MimeTypeFile.class com/sun/activation/registries/MimeTypeEntry.class com/sun/activation/registries/LineTokenizer.class com/sun/activation/registries/LogSupport.class com/sun/activation/registries/MailcapTokenizer.class com/sun/activation/viewers/ com/sun/activation/viewers/ImageViewer.class com/sun/activation/viewers/ImageViewerCanvas.class com/sun/activation/viewers/TextEditor.class com/sun/activation/viewers/TextViewer.class bash-3.00$
Everything compiles fine, but it can't seem to find javax.activation.DataSource despite activation.jar being in the classpath
I do not have access to the jdk_home/jre/lib/ext directory.
I have been attempting to execute SendEmailACME from my directory /users/steve/TestPrograms
Thanks in advance for any help
Steve
-
Steve over 11 yearsDo you mean that the CLASSPATH does not contain a path to the jars the JDK uses BESIDES mail.jar and activation.jar? If so, I am confused because I have never had to tell the JDK where to find its basic jar files.
-
tcb over 11 yearsUsually yes, but it might be not true is case of non-standard classes. Your seems to be fine. Maybe the reason is that your CLASSPATH contains
activation.jar
which name has common part withjavax.activation.DataSource
. Try runningjava -verbose
-
Steve over 11 yearstcb, I ran java -verbose. The ouput was too long for stackoverflow. All it included was the regular output, plus a bunch of messages about java loading all of its regular libraries, the libraries from mail.jar, but I didn't see any from javax.activation.*
-
tcb over 11 yearsWell, you can try to extract this jar, add the folder into CLASSPATH and try to run again.
-
Steve over 11 yearsI extracted the jar and added user1/sterus01/TestProgramsLib to the CLASSPATH, no difference. Thanks for the idea though