我已经花了几个小时试图找出原因,我已经得到了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应用程序所需的
我所有的servlet都在WEB-INF/classes/controllers中,而我试图加载的类是子目录中的* .class文件。 我的问题是,因为“。”似乎没有在我的Web应用程序的类路径中,从子目录加载库不起作用。 –
位于WEB-INF/classes/controllers/packagename/ClassName.class中的类文件的正确包将是“controllers.packagename”,而不是“包名”,因为您的问题似乎暗示了这一点。您不能在WEB-INF/classes下将其他子目录作为类路径根,并且系统属性或环境变量位于未由类加载器评估的Web应用程序中,因为它们位于独立应用程序中。 – jarnbjo
。可能会引用tomcat的启动脚本,而不是webapp。 – nos