我创建了简单的Java Servlet:WelcomeServlet.java。
然后,我尝试通过以下方式编译此文件:
javac WelcomeServlet.java
结果我看到编译错误:
包javax.servlet不退出
我尝试使用Google找到此错误的解决方案。我找到答案的第一部分:java编译器没有看到servlet-api.jar文件。
我知道,它的lib文件夹中的Apache Tomcat包含servlet-api.jar文件。
所以,我有这个文件,但我必须复制这个文件?
我尝试不同的文件夹:
echo %JAVA_HOME%
C:\Program Files\Java\jdk1.6.0_26
%PATH%
包含以下行:C:\ Program Files \ Java \ jdk1.6.0_26 \ bin
所以,我复制:
%JAVA_HOME%\ bin中
%JAVA_HOME%\ lib中
%JAVA_HOME%\ jre \ lib
结果同样的错误。 只有在我复制目录中的servlet-api.jar之后: %JAVA_HOME%\ JRE \ lib中\分机
编译complite sucessful。
我的问题:为什么?为什么我必须复制文件夹%JAVA_HOME%\ jre \ lib \ ext ??
这一刻在文档中描述了什么?
和其他问题我们有一些官方文档或规范描述jdk文件夹的文件夹结构?
答案 0 :(得分:2)
在运行javac时,您需要使用-classpath命令行选项指定希望编译器搜索的目录。编译器在%JAVA_HOME%\ jre \ lib \ ext中找到你的.jar的原因是它默认搜索扩展目录。
这适用于Java 1.5,但我认为它或多或少仍然正确:
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/findingclasses.html
答案 1 :(得分:2)
Shaun提供的链接是一个更完整的答案。但简而言之,使用类路径是引入第三方或外部(到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列表的抽象,强烈建议用于任何长度的重复更改代码,构建,测试和运行周期。