类路径问题

时间:2010-01-05 18:24:40

标签: java servlets classpath

我正在尝试在Tomcat的 webappps / Email / src / Mail 文件夹中编译Servlet类,但是我收到了编译时错误:

./Email/src/Mail/Mail.java:7: package javax.mail does not exist 

import javax.servlet.http.*;

./Email/src/Mail/Mail.java:9:package javax.servlet does not exist
import javax.servlet.*;


./Email/src/Mail/Mail.java:12:cannot find symbol
symbol: class HttpServlet
public class mail extends HttpServlet{
                          ^
./Email/src/Mail/Mail.java:14: cannot find symbol
symbol: class HttpServletRequest
location: class Mail.mail
public void doPost(HttpServletRequest request,HttpServletResponse response)
                   ^

./Email/src/Mail/Mail.java:14: cannot find symbol
symbol: class HttpServletRequest
location: class Mail.mail
public void doPost(HttpServletRequest request,HttpServletResponse response)
                                              ^

./Email/src/Mail/Mail.java:20: cannot find symbol
symbol: class MessageReading
location: class Mail.mail
          MessageReading mr=new MessageReading();

7 errors

我用来编译类的命令是:

C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps>javac -d ./Email/WEB-INF/classes -cp ./Email/src/Mail/. ./Email/src/Mail/mail.java

这是servlet类:

package Mail;


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

import javax.servlet.http.*;
import javax.servlet.*; 
import Mail.*;

public class mail extends HttpServlet{

public void doPost(HttpServletRequest request,HttpServletResponse response)
{

    try{


        MessageReading mr=new MessageReading();

        }
    catch (Throwable e) {
        System.out.println("Connection Failed! Check output console");
        e.printStackTrace();
        }

    }

}

正在编译时,我正在尝试使用以下命令编译它:

C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps>javac -d ./Email/WEB-INF/classes ./Email/src/Mail/*.java

Mail文件夹中的MessageReading和mail类。

有谁能告诉我为什么第二个命令不起作用?

3 个答案:

答案 0 :(得分:1)

第一个版本将忽略CLASSPATH环境变量,因为您正在使用-cp显式设置类路径。第二个没有。我想你的CLASSPATH包含JavaMail,servlet API等。在命令行输入set classpath来验证这一点。

答案 1 :(得分:1)

在命令行上使用-cp指定类路径时,将使用环境CLASSPATH变量。因此,假设您丢失的jar文件位于您的CLASSPATH变量(servlet.jar,mail.jar等等)中,假设您未在命令行中指定它们,则在您(未完全指定)手动指定的类路径时会出现错误你键入-cp。

如果不出意外,将所需的jar添加到命令行是一个很好的练习,以帮助理解您的程序需要运行的内容。添加servlet.jar和mail.jar后,我相信你会收到mail.jar所需的一些额外错误。这有助于理解依赖关系。

答案 2 :(得分:0)

在我回答之前的一点说明:大多数人都没有通过直接调用javac来编译Java代码。考虑在项目中使用Ant或Maven2。

我不明白第二个命令如何或为什么起作用,如果确实如此,我会感到惊讶。 'mail'类的Java代码引用外部非JDK包中的API;您必须向javac提供类路径信息(使用-cp选项),以便编译器与这些库“链接”。

在你的第一个命令中,我怀疑-cp参数似乎指向源文件;此选项应指向包含已编译类文件和/或包含类文件的.jar文件的目录。

JavaMail API类和javax.servlet类通常包含在.jar文件中。我确信Tomcat至少有servlet jar,你可以从java.sun.com下载JavaMail。