【问题标题】:Java compile error. servlet-api.jarJava 编译错误。 servlet-api.jar
【发布时间】:2012-01-10 22:35:09
【问题描述】:

我创建了简单的 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\ext

编译成功。

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

这个时刻在文档中的什么地方描述?

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

【问题讨论】:

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

标签: servlets java


【解决方案1】:

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

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

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/findingclasses.html

【讨论】:

    【解决方案2】:

    Shaun 提供的链接是一个更完整的答案。但简而言之,使用类路径是引入第 3 方或外部(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 列表,强烈建议将其用于任何长度的重复更改代码、构建、测试、运行周期。

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2011-02-20
      • 2013-10-01
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多