部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi

eclipse 下部署maven项目但是报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

问题背景

工程为maven工程,ContextLoaderListener类位于spring-web-3.1.0.RELEASE.jar包中。检查了maven的pom.xml,依赖引入正常。在工程Maven Dependencies视图中也能看到spring-web-3.1.0.RELEASE.jar包被正常引入进来了。

 

错误原因:

在部署到tomcat的时候没有把maven构建的项目中的jar包给构建进去...所以导致找不到这个类.

进入到tomcat的部署路径.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\下检查了一下,发现工程部署后在WEB-INF文件夹下没有生成lib目录,正常情况下,会生成lib目录并把工程的所有依赖jar包都部署到该目录下。

注意:下面会讲解项目具体部署的位置(补充说明)

解决方案:

1.右键点击项目--选择Properties

 选择Deployment Assembly,在右边点击Add按钮,在弹出的窗口中选择Java Build Path Entries

2.点击Next,选择Maven Dependencies

3.点击Finish,然后可以看到已经把Maven Dependencies添加到Web应用结构中了

End

操作完后,重新部署工程,不再报错了。然后我们再到.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\目录下,发现工程WEB-INF目录下自动生成了lib目录,并且所有的依赖jar包也都已经部署进来。问题因此解决。

下面是自己补充的:

eclipse并不像MyEclipse默认将项目部署到tomcat安装目录下的webapps中,而默认部署到工作目录(workspace)下的.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps中。(tmp0、tmp1的不同是目前这个server容器的顺序)

附上我的项目的截图:

E:migueclipse是我的eclipse工作空间    

.metadata是eclipse生成的目录,是eclipse的插件目录,tomcat是以插件的形式加入到eclipse里的,因此eclipse的tomcat目录不是真实tomcat安装根目录,而是eclipse工作空间里的 .metadata\.plugins\org.eclipse.wst.server.core。

tmp1 是在eclipse new 一个tomcat server时,就会在core下创建一个tmp1,2个server就tmp1 和tmp2 ... 以此类推,我建了5个tomcat server,就会有tmp5, 而我的aireportPro项目就在这个tmp1下部署。这里的tmp1 表示一个临时的tomcat

wtpwebapps  通常,我们用tomcat手动部署项目时,工程的发布位置有2种:1是指conf里的配置文件中指定webapp的路径,也就是web工程路径,这种从开发到部署都是用同一个目录下的文件,没有复制或打包;第2种是把web工程打包成war包复制到{tomcat_home}/webapps目录下,tomcat自动识别这个war包,解压war包得到一个web工程,并生成相关jsp文件放到D:\javaeclipse\workspace\apache-tomcat-6.0.37\work\Catalina\localhost下 (注意,在localhost下的只是web文件,不是全部工程文件,全部文件应该去webapps下找),这种方式的发布有个麻烦的地方,就是修改工程后要重新打包并把新war包放到webapps下,就算你只 是修改了一个jsp文件上的一个文字或标识符,也要重新生成war包来发布 ,而这里的wtpwebapps ,应该是相当于实际tomcat的webapps目录,wtpwebapps 里的A相当于 webapps下 的A.war生成的A工程,应该是省下来生成war包拷贝到webapps目录的操作。

 temp1/wtpwebapps下找到了我的项目aireportPro

在我的项目WEB-INF/lib目录下 可以看见maven依赖的jar包都已经部署进来

 

如何修改

为了使项目默认部署到tomcat安装目录下的webapps中,show view->servers->找到需要修改的tomcat->右击

  1. 停止eclipse内的tomcat服务器(stop)
  2. 删除该容器中部署的项目(add and remove)
  3. 清除该容器相关数据(clean)
  4. 打开tomcat的修改界面(open)
  5. 找到servers location, 选择第二个(User tomcat Installation)
  6. 修改deploy path为webapps
  7. 保存关闭

如下图:

上图中的tomcat信息配置页详解

核心:Configuration Path配置了本页面获取配置信息内容的地址,在tomcat run的时候,配置文件会同步到Server path/conf 目录下,部署的文件会部署到Deploy path目录下。

General Information

包含一些基本信息

注意Configuration path,默认配置的是work
space中的配置文件,而不是tomcat目录下的配置文件。
每个tomcat一个配置文件,会在tomcat run的时候,将配置文件信息与Server Path/conf中相关文件保持同步。

文件目录示例如下:

+- Server
    +- Tomcat v7.0 Server at localhost-config
        --catalina.policy
        --catalina.properties
        --context.xml
        --server.xml
        --tomcat-users.xml
        --web.xml

Server Locations

Server Locations包含server path和Deploy path,

  1. Server Path
  • Use workspace metadata 默认位置(.metadata/.plugins/org.eclipse.wst.server.core/tmp0)

  • Use Tomcat installation(配置的本地tomcat目录)
    如:/Users/shenpengyan/Documents/apache-tomcat-7.0.70/webapps

  • Use custom location(使用任意其他目录)

  1. Deploy path:

和Server Path关联,设置serverpath的一个子目录,默认为(wtpwebapps)

Server Options

Publishing

Timeouts (启动和关闭超时)

在启动和关闭时,如果超过这里设定的时间就会报错。启动时如果项目启动比较耗时,可以调高start timeout。

Ports(端口)

这里列出了启动时候需要占用的端口号,如果启动时候显示端口号被占用。可以到这里去看,把相关端口占用清理掉,或者到对应的Configuration Path中的server.xml文件中修改对应的端口。

   附上 : 标准tomcat需要占用三个端口

端口描述
Tomcat admin porttomcat启动关闭时用的端口
HTTP/1.1http请求占用的端口
APJ/1.3apj请求占用的端口

 

MIME Mapping(MIME类型对照关系,更改会显示在web.xml中)

 

附上 : tomcat内两种添加Web Modules的方式

  1. 添加web project
  • view->servers->找到需要修改的tomcat->右击-> add and remove

  • tomcat配置信息页,切换Modules tab。

image

如图,按钮`Add Web Module`用来添加内部project。
  1. 添加外部web project

    如上图,按钮Add External Web Module用来添加外部project。使用这种方式,可以直接把maven web项目中的target目录下的产出放进去启动。

总结:

  这样就可以解释,为什么我们在eclipse修改了web工程里的一个jsp/js或java文件后,eclipse会先编译(building,
  有没有发布工程eclipse都会重新编译这个工程,跟tomcat无关,这是eclipse的自检查功能),然后publish 到eclipse
  配置的tomcat上,也就是publish到wtpwebapps上。
  (如果eclipse没有配置tomcat,而是手动发布A,那么,eclise执行完building后,我们要重新生成war包去覆盖
  tomcat_home\webapps下的原理旧的war包,tomcat会监控war包发生变化而重新发布这个web工程,浏览器才
  能请求到新的jsp或servlet。
  当然,如果采用的是 tomcat_home\conf\server.xml配置的方式发布,就省事多了,eclise上修改完了,building完
  成后,tomcat默认会自动重新发布这个工程A。一般的web应用服务器,如tomcat jboss  resin 应该都有自动重新发布工程的功能。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值