Servlets Java编译错误。servlet-api.jar

Servlets Java编译错误。servlet-api.jar,servlets,java,Servlets,Java,我创建了简单的Javaservlet:WelcomeServlet.Java 然后,我尝试通过以下方式编译此文件: javac WelcomeServlet.java 结果我看到编译错误: 包javax.servlet未退出 我尝试用谷歌来解决这个错误。我发现答案的第一部分:java编译器没有看到servlet-api.jar文件 我知道,it库文件夹中的ApacheTomcat包含servlet-api.jar文件 所以,我有这个文件,但我必须在哪里复制这个文件 我尝试了不同的文件夹: ec

我创建了简单的Javaservlet:WelcomeServlet.Java

然后,我尝试通过以下方式编译此文件:

javac WelcomeServlet.java
结果我看到编译错误:

包javax.servlet未退出

我尝试用谷歌来解决这个错误。我发现答案的第一部分:java编译器没有看到servlet-api.jar文件

我知道,it库文件夹中的ApacheTomcat包含servlet-api.jar文件

所以,我有这个文件,但我必须在哪里复制这个文件

我尝试了不同的文件夹:

echo %JAVA_HOME%
C:\Program Files\Java\jdk1.6.0_26
%PATH%
包含以下行:C:\Program Files\Java\jdk1.6.0\U 26\bin

所以,我抄进来:
%JAVA\u HOME%\bin
%JAVA\u HOME%\lib
%JAVA\u HOME%\jre\lib

结果是同样的错误。 只有在我复制目录中的servlet-api.jar之后: %JAVA\u HOME%\jre\lib\ext

编译成功

我的问题:为什么?为什么我必须复制到文件夹%JAVA\u HOME%\jre\lib\ext

文档中描述了这一时刻的位置


还有一个问题,我们有一些官方文档或规范描述jdk文件夹的文件夹结构

在运行javac时,需要使用-classpath命令行选项指定编译器要搜索的一个或多个目录。编译器在%JAVA\u HOME%\jre\lib\ext中找到您的.jar的原因是默认情况下它搜索扩展目录

这是针对Java 1.5的,但我相信它或多或少还是正确的:


运行javac时,您需要使用-classpath命令行选项指定编译器要搜索的一个或多个目录。编译器在%JAVA\u HOME%\jre\lib\ext中找到您的.jar的原因是默认情况下它搜索扩展目录

这是针对Java 1.5的,但我相信它或多或少还是正确的:


肖恩提供的链接是一个更完整的答案。但简而言之,使用类路径是引入第三方或外部(JDK/JRE)库的最佳方式。类路径是一个非常类似于
%PATH%
$PATH
变量的概念,但它指定了java用于查找的位置,而不是用于查找可执行文件的shell

类路径为java编译器或java虚拟机提供了搜索资源时要使用的项目列表。此“路径”可能包括目录或文件。它通常包括jar文件,有时还包括配置文件的位置。许多基于Java的文件配置或其他查找方案使用[
Class#getResourceAsStream()
][1]使用遍历类路径实现的某种变体

我很少看到将jar文件放在lib/ext位置而不是使用类路径的情况

类路径通常是一个环境变量(
%classpath%
$classpath
),或在运行java或javac时在命令行上指定(例如
-cp
-classpath
请参阅正在运行的可执行文件的帮助)


Ant和Maven等构建工具还将提供抽象来定义应用程序要使用的JAR列表,强烈建议用于任何长度的重复更改代码、构建、测试和运行周期。

Shaun提供的链接是一个更完整的答案。但简而言之,使用类路径是引入第三方或外部(JDK/JRE)库的最佳方式。类路径是一个非常类似于
%PATH%
$PATH
变量的概念,但它指定了java用于查找的位置,而不是用于查找可执行文件的shell

类路径为java编译器或java虚拟机提供了搜索资源时要使用的项目列表。此“路径”可能包括目录或文件。它通常包括jar文件,有时还包括配置文件的位置。许多基于Java的文件配置或其他查找方案使用[
Class#getResourceAsStream()
][1]使用遍历类路径实现的某种变体

我很少看到将jar文件放在lib/ext位置而不是使用类路径的情况

类路径通常是一个环境变量(
%classpath%
$classpath
),或在运行java或javac时在命令行上指定(例如
-cp
-classpath
请参阅正在运行的可执行文件的帮助)


Ant和Maven等构建工具还将提供抽象来定义应用程序要使用的JAR列表,强烈建议用于任何长度的重复更改代码、构建、测试和运行周期。

必须将servlet JAR放入类路径中。决不能复制/移动现有库。这只会导致运行时类加载灾难。您必须通过指定表示类路径的
-cp
-classpath
参数来告诉Java编译器它们在哪里(它只是指向依赖类和JAR的磁盘文件系统路径的集合)。请撤消所有复制/移动操作,并保持JRE和Tomcat的
/lib
文件夹未被触动。必须将servlet JAR放入类路径中。永远不要复制/移动现有库。这只会导致运行时类加载灾难。您必须通过指定表示类路径的
-cp
-classpath
参数来告诉Java编译器它们在哪里(它只是指向依赖类和JAR的磁盘文件系统路径的集合)。请撤消所有复制/移动操作,并保持JRE和Tomcat的
/lib
文件夹不变。