0

私は十分な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

以下の例外があります。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;

    }

}
4

2 に答える 2

3

問題は、コンパイルされた Java クラスを実行する方法にあります。

クラスのパス名を指定しています。

指定する必要があるのは、完全修飾クラス名です。そして、クラスはデフォルトのパッケージで宣言されているため (「あなたのソース コードにはpackageステートメントがありません)、それは単純にSendEmail.

そう ...

java -cp ... SendEmail

ただし、次の点に注意してください。

  • 現在の「-cp」オプション(質問による)は無効に見えます。クラスパスのコンポーネントは、Linux/Unix/Mac および Windows の場合、それぞれコロン (":") またはセミコロン (";") で区切る必要があります。(コンマを使用しましたが、それらのスペースと中括弧もそこにあるべきではありません!)
  • SendEmail.classクラスパスに含むディレクトリを含める必要があります。

コマンド ライン構文とクラスパスの設定方法を説明する内容に細心の注意を払いながら、javaおよびコマンドのマニュアル エントリを読むことをお勧めします。javac

まだ読んでいない場合は、Java チュートリアルの「はじめに」セクションを読んでください

于 2013-06-28T07:39:34.813 に答える
1

ファイルはどこでjavac作成されましたSendEmail.classか? SendEmail.javaソースファイルと同じフォルダに? または、現在のフォルダー内ですか?

後者の場合は、実行時/Users/...に前のパスを省略しSendEmailます。

.class( が他の場所で生成されることを期待していた場合は、 to-dオプションjavacpackageメカニズムを確認してください。)

于 2013-06-28T07:30:43.040 に答える