Tomcat域名绑定目录,省略项目名直接访问导致NoClassDefFoundError的解决方法

Tomcat省略项目名导致NoClassDefFoundError的解决方法

NoClassDefFoundError字面意思是找不到类,是运行期间的一个错误。这个错误大多数解决方法都是找不到类,找不到jar,没有把引用的jar放到lib中,或者classpath没有包含到。

如果按照上面的方法无法解决,请继续看。

省略项目名

tomcat可以通过修改conf/server.xml文件,在

`<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">`

下面添加一行

<Context docBase="项目的目录" path="" reloadable="false" crossContext="true">

从而直接使用
http://localhost
而不是
http://localhost/项目名
来访问项目。

问题

一个已经测试成功,并且发布到服务器上的项目,通过域名/项目名访问正常。
使用上面的方法绑定域名至项目的目录中,jsp正常显示,servlet也能正常使用。

一旦访问到数据源相关的服务,马上出现出错,如下

java.lang.NoClassDefFoundError: Could not initialize class utils.JdbcUtils_JNDI

分析

第一反应是 class丢失?文件存在。
classpath设置不正确?未绑定域名前使用正常。

由于使用的是JNDI数据源连接池,所以有可能是配置不正确,和绑定目录的设置有冲突。

为了方便配置和发布项目,使用的是局部配置数据源。
JNDI连接信息是写在
项目的目录/META-INF/context.xml中。

内容为

<Context>
   <Resource
       auth=
       省略

这里是没有任何问题的。

但是和绑定目录的<Context 声明冲突了,导致项目无法从tomcat获得JNDI数据源,直接报了一个找不到类的错误。(只看报错信息查了一天,有点误导人)

解决

将JND数据源合并到目录绑定的<Context 中即可。

<Context docBase="项目的目录" path="" reloadable="true" crossContext="true">
   <Resource
       auth="Container"
       name="jdbc/datasource"
       type="javax.sql.DataSource"
       driverClassName="com.mysql.cj.jdbc.Driver"
       url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&amp;characterSetResults=UTF-8"
       username="root"
       password="root"
       maxTotal="9"
       maxIdle="4"
       maxWaitMillis="10000"
    />
</Context>

原来写在META-INF/context.xml中的JNDI数据源信息可以不用管它,有没有都不影响程序运行,留作备份。
不删除不舒服斯基可以选择删除。

后话

这里因为已经测试完成,并且在服务器上正常运行,更改服务器配置而出现的错误 ,反推得知问题所在。所以项目尽量在默认的生产/服务环境中测试后,再更改为需要的配置,绑定目录等。

如果一开始已经绑定了域名/目录,那第一反应是”卧槽,代码有BUG“,改到天荒地老,也不知道哪里有问题,因为根本不是代码的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值