2011-11-12 113 views
1

我在编译java servlet时遇到了很大的问题。据我所知,我做了我需要做的一切,我正确安装了tomcat 7,并且tomcat正在工作。据我所知,我需要将servlet.jar包添加到我的类路径中。在我的系统上似乎没有servlet.jar,但从我可以从tomcat docs中了解到它的servlet-api.jar。Java servlet无法编译 - 无法找到javax.servlet

香港专业教育学院做到了这一点,通过在/etc/environment编辑类路径:

PATH =“在/ usr/local/sbin中:在/ usr/local/bin目录:/ usr/sbin目录:在/ usr/bin中:/ sbin目录:/斌:在/ usr /游戏” CLASSPATH = “在/ usr /共享/ tomcat7/lib目录/ servlet的api.jar文件”

不幸的是,仍然没有运气,我不能编译Java servlet和IM仍然得到关于失踪符号的警告为javax.servlets

我使用的是Ubuntu 11.10 x64。有任何想法吗?

回答

2

你不应该有一个CLASSPATH环境变量。

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

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

2

javax.servletsservlet-api.jar中定义,所以你的问题必须以某种方式与你的配置。你用什么来编译?您是直接发布javac命令还是使用maven,ant或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提供的很多很少修改。在/etc/environment

添加

+9

“Maven”和“easy”不属于同一句话。 – duffymo

+1

@duffymo,我已经广泛地使用了em。我发现maven更简单。约定超过配置。一旦你得到了非常简单的约定,你可以免费获得一大堆。最重要的是,依赖管理在这种情况下特别方便(如果包含不容易理解的ivy,ant可以这样做)。 – Lucas

+0

我还没有掌握惯例。也许还有希望,但我觉得Ant要容易得多。我是Spring用户,所以我的大多数依赖项都很容易获得。 Maven让我头痛得多,而不是治愈。 – duffymo

3

香港专业教育学院做到了这一点,通过编辑类路径:相比之下,蚂蚁就需要这个

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用于查找在编译和/或运行时期间使用的类。

你的问题很可能导致因为你使用-cpjavac命令-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文件,或者只是使用像Eclipse,Netbeans的一个IDE或者IntelliJ,它会在你保存源文件时自动完成。