运行java的问题(编译工作但不运行)

时间:2013-06-28 07:19:24

标签: java classpath

我已经完成了大量的Google搜索并阅读了很多关于这些问题的内容,但仍然无法弄明白。

我试图通过指定类路径从命令行运行SendEmail.java,以便它可以从任何地方运行。我目前在/ Users / {username}文件夹

当我这样做时

javac -cp ":/Users/.../src/*:/Users/.../src/lib/jar/*:/Users/.../src/org/*:/Users/.../src/‌​data/*" /Users/.../SendEmail.java

它编译并创建类文件。

我跑的时候

java -cp ":/Users/.../src/*:/Users/.../src/lib/jar/*:/Users/.../src/org/*:/Users/.../src/‌​data/*" SendEmail

它给出了下面提到的例外。请注意,当我从同一目录运行它时:与同一目录中的do java SendEmail一样,它运行良好。

Exception in thread "main" java.lang.NoClassDefFoundError: /Users/.../SendEmail
Caused by: java.lang.ClassNotFoundException: .Users.XXX.XXX.XXX.XXX.XXX.XXX.SendEmail

    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

任何帮助都将不胜感激。

计划:

import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.lang.Readable;

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

      String to     = "xxxxxxx";                // Recipient's email ID needs to be mentioned.
      String host   = "localhost";
      String from   = "root";
      String pwd    = "root";
      int port      = 25;


      Properties properties = System.getProperties();
              properties.put("mail.transport.protocol","smtp");
              properties.put("mail.smtp.host", host);
              properties.put("mail.smtp.user", from);
              properties.put("mail.smtp.password", pwd);
              properties.put("mail.smtp.port", "25"); // 587 is the port number of yahoo mail

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

      try{


            MimeMessage message = new MimeMessage(session);// Create a default MimeMessage object.

             message.setFrom(new InternetAddress(from)); // Set From: header field of the header.
             message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Set To: header field of the header.
             message.setSubject("Cohort revenue");// Set Subject: header field

           //  MixpanelDate endingDate = new MixpanelDate();
            // String filename = "data/cohort_" + endingDate + ".txt";
             message.setText(readfile("data/cohort_2013-06-27.txt"));   // Now set the actual message
             Transport.send(message);  // Send message

      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }


   public static String readfile (String filename) {
       File file = new File(filename);
       String theString = "";//the final string


       try {

           Scanner scanner = new Scanner(file);

                       while (scanner.hasNextLine()) {
                           String line = scanner.nextLine();
                           theString = theString + line + "\n";
                       }
                        scanner.close();

                  } catch (FileNotFoundException e) {
           e.printStackTrace();
       }

       return theString;

    }

}

2 个答案:

答案 0 :(得分:3)

问题在于您正在运行已编译的Java类。

您正在为班级提供路径名。

您需要提供的是完全限定的班级名称。由于该类是在默认包中声明的('cos源代码没有package语句),因此只需SendEmail

所以......

java -cp ... SendEmail

但请注意:

  • 您当前的“-cp”选项(根据问题)对我来说无效。对于Linux / Unix / Mac和Windows,类路径的组件应分别用冒号(“:”)或分号(“;”)分隔。 (你使用过逗号,那些空格和大括号也不应该在那里!)
  • 您必须在类路径中包含包含SendEmail.class的目录。

我建议您阅读javajavac命令的手动条目,密切关注命令行语法以及描述如何设置类路径的内容。

如果您还没有这样做,请阅读Java教程的“入门”部分,其中说明了这些东西是如何工作的。

答案 1 :(得分:1)

javac在哪里创建SendEmail.class文件?与SendEmail.java源文件位于同一文件夹中?或者在当前文件夹中?

如果是后者,请在运行时忽略/Users/...前面的SendEmail路径。

(如果您希望在其他地方生成.class,请查看-d javacpackage机制的{{1}}选项。)