无法导入javax.servlet

Dr.*_*son 2 import tomcat servlets javac

我知道这是一个常见的错误,但请耐心等待.我一直在追求CLASSPATH问题,我认为这不是问题所在.我收到这样的错误.

./src/process.java:2: package javax.servlet does not exist
import javax.servlet.*;
Run Code Online (Sandbox Code Playgroud)

我安装了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的符号链接

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");

}
}
Run Code Online (Sandbox Code Playgroud)

当我使用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.*;
^
Run Code Online (Sandbox Code Playgroud)

我尝试使用-cp选项在命令行上指定类路径,但我最终得到了相同的结果.

Chs*_*y76 5

您需要将类路径设置为专门指向JAR:

CLASSPATH=/usr/share/java/tomcat/tomcat6-servlet-2.5-api-6.0.18.jar
Run Code Online (Sandbox Code Playgroud)

在类路径中指定文件夹时,它仅用于查找该文件夹中的所有.JAR本身就是类的库(打包文件夹,如果你愿意),因此必须单独列出.所以,例如,你可以这样做:

CLASSPATH=/some/location/myjar1.jar:/other/location/myjar2.jar:/some/classes/folder
Run Code Online (Sandbox Code Playgroud)

在这种情况下myjar1.jar,您myjar2,jar/some/classes/folder目录中的所有类都可用.如果你有myjar3.jar/some/classes/folder,上面的声明将将它添加到类路径中.

更新正如McDowell所指出的,Java 6允许类路径中的通配符可以获取指定文件夹中的所有jar.通配符仅适用于JAR,除非再次指定没有通配符的文件夹,否则不会选择类.通配符也不是递归的.所以:

CLASSPATH=/loc1/*:/loc1:/loc2/*
Run Code Online (Sandbox Code Playgroud)

将使/loc1文件夹中的所有jar和所有类以及文件夹中的所有jar(但不是类)/loc2可用./loc1/nested/some.jar不会拾取更深的嵌套jar().