当前位置:  开发笔记 > 编程语言 > 正文

Tomcat的CLASSPATH与Java不同,它不包含".".我该如何改变它?

如何解决《Tomcat的CLASSPATH与Java不同,它不包含".".我该如何改变它?》经验,为你挑选了2个好方法。

我花了好几个小时试图弄清楚为什么我得到了这个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,并使用import packagename.*in 导入它someServlet.java.


编辑2:我已经解决了我的问题.我的主要问题是,如下所示,不使用正确的包名称.此外,我试图从classes/controllers/目录内部编译,而不是从编译classes/.感谢大家的帮助!



1> jarnbjo..:

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


位于WEB-INF/classes/controllers/packagename/ClassName.class中的类文件的正确包将是"controllers.packagename"而不是"packagename",因为您的问题似乎意味着.您不能在WEB-INF/classes下面具有其他子目录作为类路径根,并且系统属性或环境变量位于未由类装入器评估的Web应用程序中,因为它们位于独立应用程序中.

2> Pascal Thive..:

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

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

.
|-- 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将被视为包名称的一部分(可能不是您想要的).所以你有两个选择:

    删除该controllers目录

    或将其添加到包名称.

但它们是相互排斥的,你不能兼得.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有