类路径问题

问题描述:

我想要编译Tomcat的webappps /电子邮件/ src目录/邮件文件夹中的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(); 
     } 

    } 

} 

我t的编译正确,当我试图通过使用命令编译它:

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

邮件文件夹中的MessageReading和邮件类。

任何人都可以告诉我为什么第二个命令不工作的第一个?

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

当您的不是使用-cp指定命令行上的类路径时,将使用环境CLASSPATH变量。因此,假设你的CLARSPATH变量(servlet.jar,mail.jar等等)中缺少的jar文件,因为你没有在命令行中指定它们,所以当你的(不完全指定的)手动指定的类路径出现错误时你输入-cp。

如果没有别的办法,将所需的jar添加到命令行以帮助理解程序需要运行的内容是一种很好的练习。添加servlet.jar和mail.jar后,我相信你会为mail.jar所需的东西获得一些额外的错误。这对理解依赖关系很有帮助。

+0

啊是的 - 史蒂夫乙是对的;未指定-cp时使用环境CLASSPATH变量。然而,我建议您将机器的CLASSPATH留空,因为它可能会导致难以在同事机器上调试或复制的问题(在多个项目上工作)。 – 2010-01-05 18:44:40

+1

我实际上想要类路径头来搜索邮件文件夹中的所有类,如MessageReading,而不必在编译邮件类时指定它的名称。如果以上不行,我该怎么办? – Dusk 2010-01-05 19:08:39

我的回答之前有一点需要注意:大多数人不会直接调用javac来编译Java代码。考虑在你的项目中使用Ant或Maven2。

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

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

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