Java servlet将不编译-找不到javax.servlet

Java servlet将不编译-找不到javax.servlet,java,servlets,classpath,Java,Servlets,Classpath,我在编译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:/s

我在编译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
缺少符号的警告


我使用的是Ubuntu11.10x64。有什么想法吗?

您不应该有CLASSPATH环境变量

更好的方法是编译时使用
-classpath
参数
javac.exe
,运行时使用
java.exe
。这样添加tomcatservlet-api.jar


另一个建议是学习蚂蚁。它是一个XML驱动、基于Java的构建工具。它比Maven更容易学习和使用。首先,我想说明一下。

javax.servlets
是在
ServletAPI.jar
中定义的,所以您的问题一定与配置有关。你用什么来编译?您是直接发出
javac
命令,还是使用maven、ant或eventeclipse等构建工具?我建议使用maven,因为它通过一个配置文件为您处理依赖关系。也很容易学会

在maven中,您需要首先安装/配置maven,然后使用一个设置的文件结构启动项目(这虽然简单但足够):

因此,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>

4.0.0
com.mycompany
myapp
0.0.1-快照
战争
javax.servlet
servlet api
2.5
罐子
假如
这里重要的一点是,对ServletAPI的依赖是由maven处理的,因此不需要下载它,也不需要设置类路径或其他任何东西。一旦设置了此文件结构并编辑了pom,您只需将控制台导航到根目录并键入
mvn package
。这将下载您的依赖项,编译您的代码,并打包您的war。maven提供了更多的功能,只需很少的修改。相比之下,ant需要:

待补充

我通过编辑
/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没有以任何方式使用它。它仅由操作系统平台用于查找可执行项。类路径类似,但仅由Java用于查找在编译和/或运行时使用的类

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

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

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

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

“Maven”和“easy”不属于同一个句子。@duffymo,这两个词我都用得很广泛。我发现maven要简单得多。约定优先于配置。一旦你得到了一个非常简单的惯例,你就可以免费得到很多。最重要的是,依赖关系管理在这种情况下特别方便(如果你包括常春藤,ant可以做到这一点,这不太容易理解)。我还没有掌握这个惯例。也许还有希望,但我发现蚂蚁要容易得多。我是一个Spring用户,所以我的大多数依赖项对我来说都很容易获得。Maven给我带来的麻烦比它能治愈的还多。@duffymo当它是简单的用例时很容易,比如香草应用程序、默认回购、无报告等等。过去,是的,有时它会变成一种真正的痛苦。@duffymo不是每件事都有它自己的依赖关系,也不是总是很明显的,实际上需要哪些特定的依赖关系。在大多数情况下,最好让其他东西来处理可传递的依赖关系管理。
<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>