【问题标题】:Java servlet will not compile - cannot find javax.servletJava servlet 无法编译 - 找不到 javax.servlet
【发布时间】:2011-11-12 21:18:37
【问题描述】:

我在编译 java servlet 时遇到了很大的问题。据我所知,我已经完成了我需要做的所有事情,我正确安装了 tomcat 7,并且 tomcat 正在工作。据我了解,我需要将 servlet.jar 包添加到我的类路径中。我的系统上似乎没有 servlet.jar,但根据我从 tomcat 文档中可以理解的内容,它现在是 servlet-api.jar。

我已经做到了,通过编辑/etc/environment 的类路径:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CLASSPATH="/usr/share/tomcat7/lib/servlet-api.jar"

不幸的是,仍然没有运气,我无法编译 java servlet,而且我仍然收到有关javax.servlets 缺少符号的警告。

我使用的是 ubuntu 11.10 x64。有什么想法吗?

【问题讨论】:

    标签: java servlets classpath


    【解决方案1】:

    我已经做到了,通过在 /etc/environment 编辑类路径:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CLASSPATH="/usr/share/tomcat7/lib/servlet-api.jar"

    看起来不错。 PATH 与特定问题无关。 Java没有以任何方式使用它。它仅由操作系统平台用于查找可执行文件。 CLASSPATH 类似,但仅由 Java 用于查找要在编译和/或运行时使用的类。

    您的问题很可能是因为您使用了javac 命令的-cp-classpath 参数。在这种情况下,CLASSPATH 环境变量将被忽略(顺便说一下,这也适用于java 命令,也适用于使用-jar 参数时)。

    您需要 任一 CLASSPATH 环境变量 -cp-classpath 参数指定类路径。一般建议是完全忘记CLASSPATH 环境变量,因为当您想要做的不仅仅是“Hello World”时,这被认为是一种糟糕的做法。您可以使用:-cp-classpath 参数中指定多个路径。

    $ cd /path/to/package/root/of/your/servlet/code
    $ javac -cp .:/path/to/servlet-api.jar com/example/YourServlet.java
    

    如果您厌倦了每次都重复输入,只需将其放入.sh 脚本中,或者使用允许通过 XML 文件配置的 Ant 等构建工具,或者只使用 Eclipse、Netbeans 或 IntelliJ 等 IDE当您保存源文件时,它将自动完成所有操作。

    【讨论】:

      【解决方案2】:

      您不应该有 CLASSPATH 环境变量。

      更好的方法是在编译时使用-classpath 参数到javac.exe,在运行时使用java.exe。以这种方式添加 Tomcat servlet-api.jar。

      另一个建议是学习 Ant。它是一个 XML 驱动的、基于 Java 的构建工具。它比 Maven 更容易学习和使用。我会从那开始。

      【讨论】:

        【解决方案3】:

        javax.servletsservlet-api.jar 中定义,所以你的问题一定出在你的配置上。你用什么编译?您是直接发出javac 命令还是使用诸如maven、ant 或event eclipse 之类的构建工具?我会推荐 maven,因为它使用单个配置文件为您处理依赖关系。也真的很容易上手。

        在 maven 中,您需要先安装/配置 maven,然后使用设置的文件结构开始您的项目(这很简单但足够了):

        /src/main/java - The root of your java files
        /src/main/webapp - The root of your webapp
        /pom.xml - Maven configuration file
        

        所以一个 servlet 的完整文件列表可能是:

        /src/main/java/com/mycompany/myapp/MyServlet.java
        /src/main/webapp/WEB-INF/web.xml
        /src/main/webapp/index.jsp
        /pom.xml
        

        前 3 行(根文件结构除外)与任何 Web 应用程序相同,最后一行是您的配置文件,如下所示:

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.mycompany</groupId>
          <artifactId>myapp</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <packaging>war</packaging>
        
          <dependencies>
            <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>servlet-api</artifactId>
              <version>2.5</version>
              <type>jar</type>
              <scope>provided</scope>
            </dependency>
          </dependencies>
        </project>
        

        这里的重要部分是对servlet-api的依赖是由maven处理的,所以不需要下载它,也不需要设置类路径或任何东西。一旦你设置了这个文件结构并编辑了你的 pom,你只需将控制台导航到根目录并输入mvn package。这将下载您的依赖项,编译您的代码,并打包您的战争。 maven 提供了更多功能,只需极少的修改。相比之下,ant 需要这样:

        待补充

        【讨论】:

        • “Maven”和“easy”不属于同一个句子。
        • @duffymo,我都广泛使用了它们。我发现maven要简单得多。约定优于配置。一旦您获得了非常简单的约定,您就可以免费获得很多东西。最重要的是,依赖管理在这种情况下特别方便(如果你包含了不太容易理解的 ivy,ant 可以做到这一点)。
        • 我还没有掌握惯例。也许还有希望,但我发现 Ant 容易得多。我是 Spring 用户,所以我的大部分依赖项都很容易获得。 Maven 给我带来的头痛比它治愈的多。
        • @duffymo 当它是简单的用例时很容易,比如普通应用程序、默认存储库、无报告等。过去,是的,有时它会变成一个真正的痛苦。
        • @duffymo 并不是所有东西都有自己的依赖关系,也不是很明显实际需要哪些特定依赖关系。在大多数情况下,IMO 最好让其他东西处理传递依赖管理。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-01
        • 2012-09-04
        • 2012-02-29
        相关资源
        最近更新 更多