Tomcat的CLASSPATH与Java不同,它不包含“。”。我该如何改变它?

时间:2009-10-23 11:41:05

标签: java tomcat classpath noclassdeffounderror

我花了好几个小时试图弄清楚为什么我得到了java.lang.NoClassDefFoundError,并且我把原因缩小到了Tomcat的类路径。

我使用下面的代码来查看路径变量的含义:

out.println("Classpath: '" + System.getProperty( "java.class.path" ) + "'" );
out.println("Ext dirs: '" + System.getProperty( "java.ext.dirs" ) + "'" );
out.println("Library path: '" + System.getProperty( "java.library.path" ) + "'" );
out.println("Path separator: '" + System.getProperty( "path.separator" ) + "'" );

输出是:

Classpath: ':/usr/local/tomcat/bin/bootstrap.jar'
Ext dirs: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ext:/usr/java/packages/lib/ext'
Library path: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386/server:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib'
Path separator: ':'

如您所见,Classpath不以“。”开头。因为它应该,并且我相信这就是为什么我的程序找不到我从webapp中的子目录导入的类。

要查看类路径的设置位置,我做了grep -R bootstrap.jar /usr/local/tomcat/,并且遇到了这个问题:CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar(在文件/usr/local/tomcat/bin/catalina.sh中)

这让我相信由于某种原因,$ CLASSPATH在这里是空的。但是,echo $CLASSPATH成功返回.:/usr/lib/jvm/java-6-sun/bin:/usr/local/tomcat/lib/servlet-api.jar

有人可以帮忙解决这个问题吗?


编辑:我的所有servlet文件都在WEB-INF/classes/controllers/,我正在尝试加载的库是子目录中的类文件。 例如,如果ClassName.class位于WEB-INF / classes / controllers / packagename /目录中,我将package packagename添加到ClassName.java的开头,然后使用{{1}导入它在import packagename.*中。


EDIT2:我已经解决了我的问题。我的主要问题是,如下所示,不使用正确的包名。另外,我试图从someServlet.java目录中编译,而不是从classes/controllers/编译。谢谢大家的帮助!

3 个答案:

答案 0 :(得分:7)

Web应用程序中所需的类应位于WEB-INF / classes文件夹中的Web应用程序中,或者包含在WEB-INF / lib中的JAR文件中。您通常不应该使用servlet容器通用类路径设置,因为您似乎在尝试。

答案 1 :(得分:7)

Tomcat的类路径不应该以{{1​​}}开头。实际上,将.添加到类路径只是告诉java在当前目录中查找类而不必在命令行上使用它时使用.的简便方法。

实际上,在大多数情况下,您不必调整Tomcat的类路径。为了使Tomcat能够找到您的类,您需要做的是将您的应用程序部署为具有特定布局的标准化WAR(Web存档)。这样的事情:

-cp

. |-- WEB-INF | |-- classes | | `-- com | | `-- mycompany | | `-- MyServlet.class | |-- lib | | |-- bar.jar | | `-- foo.jar | `-- web.xml |-- application.jsp |-- image.gif `-- index.html 目录是编译类所在的位置,这是Tomcat寻找它们的地方。如果您将课程放在WEB-INF/classes中,WEB-INF/classes/controllers将被视为包名称的一部分(可能不是您想要的)。所以你有两个选择:

  1. 删除controllers目录
  2. 或将其添加到包名称。
  3. 但它们是相互排斥的,你不能同时拥有它们。

答案 2 :(得分:2)

CLASSPATH “假设”以"."开头。由于它的目的是配置运行时,因此您可以自由选择任何值。另请注意,自Java 1.1(1997年初发布)至少12年以来,不鼓励使用CLASSPATH环境变量。

另一方面,Web应用程序的类路径是明确指定的。将controllers目录(以及任何其他无效子目录)的内容移动到WEB-INF/classes/,以使包目录成为classes的直接子项。