2009-10-23 28 views
3

我已经花了几个小时试图找出原因,我已经得到了java.lang.NoClassDefFoundError,我已经缩小的原因到Tomcat的classpath。Tomcat的CLASSPATH与Java不同,它不包含“。”我该如何改变它?

我用下面的代码,看看有什么路径变量持有:

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: ':'

正如你可以看到,类路径不启动因为它应该是这样的,我相信这就是为什么我的程序无法找到从Web应用程序中的子目录导入的类。

要查看类路径设置,我也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的开头,然后使用someServlet.java中的import packagename.*将其导入。


EDIT2:我已经解决了我的问题。我的主要问题是,如下所述,不使用正确的软件包名称。另外,我试图从classes/controllers/目录内编译,而不是从classes/编译。感谢大家的帮助!在Web应用程序所需的

回答

7

类应该位于WEB-INF/classes文件夹中的Web应用程序中或装在位于WEB-INF/lib中的JAR文件。您通常不应该像这样尝试使用servlet容器的通用类路径设置。

+0

我所有的servlet都在WEB-INF/classes/controllers中,而我试图加载的类是子目录中的* .class文件。 我的问题是,因为“。”似乎没有在我的Web应用程序的类路径中,从子目录加载库不起作用。 –

+2

位于WEB-INF/classes/controllers/packagename/ClassName.class中的类文件的正确包将是“controllers.packagename”,而不是“包名”,因为您的问题似乎暗示了这一点。您不能在WEB-INF/classes下将其他子目录作为类路径根,并且系统属性或环境变量位于未由类加载器评估的Web应用程序中,因为它们位于独立应用程序中。 – jarnbjo

+1

。可能会引用tomcat的启动脚本,而不是webapp。 – nos

7

Tomcat的类路径是不应该与.首发。实际上,在类路径中添加.只是一种方便的方法,可以让java在当前目录中查找类,而不必在命令行上使用-cp

实际上,在大多数情况下,您不必调整Tomcat的类路径。为了让Tomcat能够找到你的类,你需要做的是将你的应用程序部署为一个具有特定布局的标准WAR(网络存档)。类似的东西:

. 
|-- WEB-INF 
| |-- classes 
| | `-- com 
| |  `-- mycompany 
| |   `-- MyServlet.class 
| |-- lib 
| | |-- bar.jar 
| | `-- foo.jar 
| `-- web.xml 
|-- application.jsp 
|-- image.gif 
`-- index.html 

WEB-INF/classes目录是编译后的类必须,这就是Tomcat将寻找他们。如果您将课程放在WEB-INF/classes/controllers中,controllers将被视为包名称的一部分(这可能不是您想要的)。所以,你有两个选择:

  1. 删除controllers目录
  2. 或添加到包名。

但它们是相互排斥的,你不能同时拥有。

2

CLASSPATH不是“应该”以"."开头。由于其目的是配置运行时,所以可以自由选择任何值。还要注意,自从Java 1.1(1997年初发布)—至少12年以来,使用CLASSPATH环境变量已被阻止。

另一方面,Web应用程序的类路径是很好的规定。将controllers目录(和任何其他无效的子目录)的内容移动到WEB-INF/classes/,以便软件包目录是classes的直接子目录。

相关问题