我创建了简单的Java Servlet: WelcomeServlet.java.
然后,我试着编译这个文件:
javac WelcomeServlet.java
在结果中我看到编译错误:
包javax。Servlet不退出
我试着用谷歌找到这个错误的解决方案。我发现答案的第一部分:java编译器看不到servlet-api.jar文件。
我知道,Apache Tomcat在它的lib文件夹中包含servlet-api.jar文件。
所以,我有这个文件,但我必须复制这个文件??
我尝试不同的文件夹:
echo %JAVA_HOME%
C:Program FilesJavajdk1.6.0_26
%PATH%
包含以下行:C:Program FilesJava jdk1.6.0_26bin
那么,我复制进来:
% JAVA_HOME % bin
% JAVA_HOME % lib
% JAVA_HOME % jre lib
,结果相同的错误。只有在我复制了servlet-api.jar目录后:% JAVA_HOME % jre lib ext
编译成功。
我的问题:为什么?为什么我必须复制到文件夹%JAVA_HOME%jrelibext ??
Where This moment在文档中描述?
还有其他问题,我们有一些官方文档或规范来描述jdk文件夹的文件夹结构??
您需要在运行javac时使用-classpath命令行选项指定希望编译器搜索的一个或多个目录。编译器在%JAVA_HOME%jrelibext中找到.jar的原因是因为它默认搜索扩展目录。
这是针对Java 1.5的,但我相信它或多或少仍然是正确的:
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/findingclasses.htmlShaun提供的链接是一个更完整的答案。但简而言之,使用类路径是引入第三方或外部(JDK/JRE)库的最佳方式。类路径是一个非常类似于%PATH%
或$PATH
变量的概念,但它指定了java用于查找的位置,而不是用于查找可执行文件的shell。
类路径为java编译器或java虚拟机提供了一个项目列表,以便在搜索资源时使用。这个"路径"可能包括目录或文件。它通常包括jar文件,有时还包括配置文件的位置。许多基于Java的文件配置查找方案或其他方式使用了[Class#getResourceAsStream()
][1]使用遍历类路径所完成的一些变体。
我很少看到将jar文件放在lib/ext位置而不是使用Classpath的情况。
类路径通常是一个环境变量(%CLASSPATH%
或$CLASSPATH
),或者在运行java或javac时在命令行上指定(例如-cp
或-classpath
,请参阅您正在运行的可执行文件的帮助)。
Ant和Maven等构建工具也将提供抽象来定义应用程序要使用的jar列表,强烈建议用于任何长度的重复更改代码、构建、测试和运行周期。