【问题标题】:NoClassDefFoundError when I call the class through commnad line当我通过命令行调用类时出现 NoClassDefFoundError
【发布时间】:2014-11-25 17:04:38
【问题描述】:

我正在编写一个简单的类来发送电子邮件,因此需要外部 JAR。我所做的是在 Eclipse 项目中添加了外部 JARS。这是工作。

但是当我从命令行调用该类时,它会给出 NoClassDefFoundError:javax.mail.Address。这里有两件事,我已经复制了 Java Lib 文件夹中的所有 JAR,第二是 javax.mail.Address 没有在代码中直接引用。知道发生了什么问题或如何解决它。

该类有一个主要功能,无需电子邮件代码即可正常工作。


附言

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import java.util.Properties;

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

public class EmailNotifications {

    protected static String     message_loseEvent ;
    protected static Properties properties;
    protected static Connection connection;
    protected static Session    session;

    public static void main(String [] args)throws Exception
    {
        loadPropertiesFromXML("applicatiosnSettings.xml");
        setupMailServer();
        _openDBConnection();

        ResultSet R = _executeQuery( getQuery("TodaysLossEventQuery")  );
        while(R.next()) {
                    message_loseEvent = "<table border=1 ><tr><td>Name</td><td>Description</td><td>URL</td></tr><tr><td>" + R.getString( R.findColumn("Name") ) + "</td><td>" + R.getString( R.findColumn("Description") ) + "</td><td><a href='" + R.getString( R.findColumn("DetailURL") ) + "'>See on OpenPages</a></td></tr></table>"; 
                }
        Email("openpages@fvb.com","subject","content");
        connection.close();
    }

    protected static Properties loadPropertiesFromXML(String filePath)
    {
        try
        {
            File file = new File(filePath);
            FileInputStream fileInput = new FileInputStream(file);
            properties = new Properties();
            properties.loadFromXML(fileInput);
            fileInput.close();
            return properties;
        }catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    protected static String _getProperty(String key)
    {
        Enumeration enuKeys = properties.keys();        

        while (enuKeys.hasMoreElements()) {
            String _key = (String) enuKeys.nextElement();
            if(_key.equals(key))
            {
                // System.out.println( " _getProperty() > " + properties.getProperty(key));
                return properties.getProperty(key);
            }       
        }

        return null;        
    }

    protected static void  _openDBConnection() 
            throws ClassNotFoundException, SQLException, IOException
    {
        //working Drivers
        Class.forName ( "COM.ibm.db2os390.sqlj.jdbc.DB2SQLJDriver"  );
        //Class. forName ( "com.ibm.db2.jcc.DB2Driver"  );

        String db_host      = _getProperty("db_host");
        String db_port      = _getProperty("db_port");
        String db_name      = _getProperty("db_name");
        String db_user      = _getProperty("db_username");
        String db_password  = _getProperty("db_password");
        connection = DriverManager.getConnection("jdbc:db2://"+db_host+":"+db_port+"/"+db_name,db_user,db_password); 
        //System.out.println( "> DataBase connection obtained " );


    }

    protected static String getQuery(String queryTitle)
    {
        return _getProperty(queryTitle);        
    }

    //SELECT OPAGES.RT_LossEvent.LOSSEVENT_ID as LossEventId,OPAGES.RT_LossEvent.NAME00 as Name,OPAGES.RT_LossEvent.DESCRIPTION as Description,OPAGES.ACTORINFO.EMAIL as EmailAddress, OPAGES.RT_LossEvent.DETAIL_PAGE_URL as DetailURL FROM OPAGES.RT_LossEvent JOIN OPAGES.ACTORINFO ON (OPAGES.ACTORINFO.NAME = OPAGES.RT_LossEvent.OWNER AND CONCAT(CONCAT(Year(current date),'-'),CONCAT(Month(current date),CONCAT('-',Day(current date)))) = CONCAT(CONCAT(Year(OPAGES.RT_LossEvent.Creation_Date),'-'),CONCAT(Month(OPAGES.RT_LossEvent.Creation_Date),CONCAT('-',Day(OPAGES.RT_LossEvent.Creation_Date)))))
    //ResultSet R
    protected static ResultSet _executeQuery(String _query) 
            throws ClassNotFoundException, SQLException, IOException {  
        //System.out.println(_query);
        Statement s = connection.createStatement();
        return s.executeQuery(_query);
        //while(R.next()) {

        //  message_loseEvent = "<table border=1 ><tr><td>Name</td><td>Description</td><td>URL</td></tr><tr><td>" + R.getString( R.findColumn("Name") ) + "</td><td>" + R.getString( R.findColumn("Description") ) + "</td><td><a href='" + R.getString( R.findColumn("DetailURL") ) + "'>See on OpenPages</a></td></tr></table>"; 
        //}       
    }

    protected static void setupMailServer()
    {
          // Recipient's email ID needs to be mentioned.
          String to = _getProperty("from_address");
          // Sender's email ID needs to be mentioned
          String from = _getProperty("from_address");
          // Assuming you are sending email from localhost
          String host = _getProperty("email_host");

          // Get system properties
          Properties properties = System.getProperties();
          // Setup mail server
          properties.setProperty( _getProperty("email_server") , host);

          // Get the default Session object.
          session = Session.getDefaultInstance(properties);


    }

    protected static void Email(String _toAddress,String _subject,String _content)
    {
        try
        {
            // Create a default MimeMessage object.
            MimeMessage message = new MimeMessage(session);

            // Set From: header field of the header.
            message.setFrom(new InternetAddress( _getProperty("from_address") ));
            // Set To: header field of the header.
            message.addRecipient(Message.RecipientType.TO,new InternetAddress(_toAddress));
            // Set Subject: header field
            message.setSubject(_subject);
            // Send the actual HTML message, as big as you like
            message.setContent(message_loseEvent,"text/html" );

            // Send message
            Transport.send(message);
            //System.out.println("> Sent message successfully");
        }catch (MessagingException mex) 
        {
            mex.printStackTrace();
        }
    }

}

【问题讨论】:

标签: java eclipse noclassdeffounderror javax.mail.address


【解决方案1】:

确保您需要的所有 JAR(作为第三方库)都在您的类路径中(当您运行程序时)。调用 JVM 时查看-cp 选项。类似:java -cp ... 应该可以解决您的问题。

【讨论】:

    【解决方案2】:

    使用带有类路径的javac/java命令编译带有jar文件的java文件。

    javac -cp <path to jar file> package/javafile.java
    

    或者

    只需提取您的javax.mail.Address jar 文件并将所有文件夹放入classes 文件夹,例如javax 文件夹。并像往常一样编译你的java文件

    javac package/javafile.java 
    

    【讨论】:

      【解决方案3】:

      您需要在类路径中添加 lib 文件夹,以便 Java 知道 jar 的位置。尝试将以下部分添加到您的 java 命令中:

      java -cp "/path/to/lib/*:/other/paths/" ...
      

      上面的冒号:用于指定多个路径。如果它给出了找不到您的主类的错误,那么在上面的类路径中也添加到您的主类的路径。

      java -cp "/path/to/lib/*:/other/paths/:/path/to/main/class" ...
      

      假设:你不需要编译代码,只要你想运行它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多