类路径问题
我想要编译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所需的东西获得一些额外的错误。这对理解依赖关系很有帮助。
我的回答之前有一点需要注意:大多数人不会直接调用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。
啊是的 - 史蒂夫乙是对的;未指定-cp时使用环境CLASSPATH变量。然而,我建议您将机器的CLASSPATH留空,因为它可能会导致难以在同事机器上调试或复制的问题(在多个项目上工作)。 – 2010-01-05 18:44:40
我实际上想要类路径头来搜索邮件文件夹中的所有类,如MessageReading,而不必在编译邮件类时指定它的名称。如果以上不行,我该怎么办? – Dusk 2010-01-05 19:08:39