我知道这是一个常见错误,但请耐心等待。我一直在研究 CLASSPATH 问题,但我不认为这就是问题所在。我收到这样的错误。
./src/process.java:2: package javax.servlet does not exist
import javax.servlet.*;
我安装了 Tomcat 和 Java SDK,并且我知道 Tomcat 应该提供 servlet API。但它到底在寻找什么文件呢?
我有以下设置: JAVA_HOME=/usr/java/jdk1.6.0_16 CLASSPATH=/usr/share/java;/usr/share/java/tomcat6
tomcat的基本目录:/usr/share/tomcat6 在此目录中,/usr/share/tomcat6/lib 只是/usr/share/java/tomcat6 的符号链接(symbolic link)
tomcat6-servlet-2.5-api-6.0.18.jar 位于/usr/share/java/tomcat6 中,还有什么我需要告诉 javac 以便它使用这个库吗?我还需要其他库吗?
作为背景,我正在尝试运行一个 hello world servlet。代码如下:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class process extends HttpServlet {
public void doGet( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Hello World");
}
}
当我用 javac 编译它时,出现以下错误(其中这是根本原因):
./src/process.java:2: package javax.servlet does not exist
import javax.servlet.*;
^
./src/process.java:3: package javax.servlet.http does not exist
import javax.servlet.http.*;
^
我尝试在命令行上使用 -cp 选项指定类路径,但最终得到了相同的结果。
最佳答案
您需要将类路径设置为专门指向您的 JAR:
CLASSPATH=/usr/share/java/tomcat/tomcat6-servlet-2.5-api-6.0.18.jar
当您在类路径中指定文件夹时,它仅用于查找该文件夹中的所有类。 JAR 本身就是类的库(如果您愿意的话,可以是打包的文件夹),因此必须单独列出。因此,例如,您可以执行以下操作:
CLASSPATH=/some/location/myjar1.jar:/other/location/myjar2.jar:/some/classes/folder
在这种情况下,myjar1.jar
、myjar2,jar
和 /some/classes/folder
目录中的所有类都可供您使用。如果 /some/classes/folder
中有 myjar3.jar
,则上述声明不会将其添加到类路径中。
更新为 McDowell指出,Java 6 允许wildcards在类路径中,它将拾取指定文件夹中的所有 jar。通配符仅适用于JAR,类不会被拾取,除非在没有通配符的情况下再次指定文件夹。通配符也不递归。所以:
CLASSPATH=/loc1/*:/loc1:/loc2/*
将使 /loc1
文件夹中的所有 jar 和所有类以及 /loc2
文件夹中的所有 jar(但不是类)可用。更深的嵌套 jar (/loc1/nested/some.jar
) 将不会被拾取。
关于tomcat - 导入 javax.servlet 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1645275/