Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类路径问题_Java_Servlets_Classpath - Fatal编程技术网

Java 类路径问题

Java 类路径问题,java,servlets,classpath,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.*; ./

我试图在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
邮件文件夹中的MessageReading和mail类


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

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

如果您没有在命令行上用-cp指定类路径,则将使用环境类路径变量。因此,假设缺少的jar在类路径变量(servlet.jar、mail.jar等)中,假设您没有在命令行中指定它们,那么当您键入-cp时,您的(未完全指定的)手动指定的类路径会出错


如果没有其他问题,那么向命令行添加所需的jar将是一个很好的练习,以帮助理解程序需要运行什么。在添加servlet.jar和mail.jar之后,我相信对于mail.jar所需的内容,您会得到一些额外的错误。这有助于理解依赖关系

在我回答之前,请注意:大多数人不会直接调用javac来编译Java代码。考虑使用Ant或Mave2与您的项目。< /P> 我不明白第二个命令是如何工作的,也不明白为什么,如果它真的工作,我会感到惊讶。“mail”类的Java代码引用外部非JDK包中的API;您必须向javac提供类路径信息(使用-cp选项),以便编译器与这些库“链接”

在Your's 1st命令中,我怀疑-cp参数似乎指向源文件这一事实;此选项应指向包含已编译类文件和/或包含类文件的.jar文件的目录


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

啊,是的——Steve B.是对的;当未指定-cp时,将使用环境CLASSPATH变量。但是,我建议将计算机的类路径留空,因为这可能会导致后续问题(处理多个项目),难以在同事的计算机上调试或复制。实际上,我希望类路径头搜索邮件文件夹中的所有类,如MessageReading,在编译邮件类时不指定其名称。如果上面不起作用我怎么办?