maven(多个模块)项目 部署 开发环境 问题处理历程【异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE】

2018年01月18日 18:14:38 守望dfdfdf 阅读数:439更多

个人分类: 工作 问题

编辑

版权声明:本文为博主原创文章,转载请注明文章链接。 https://blog.csdn.net/xiaoanzi123/article/details/79099343

把maven项目三个模块项目【本地运行启动是没有问题的】,maven package ,生成war包部署到开发环境【tomcat和jdk都是新安装的】tomcat,启动报错。

Unexpected exception parsing XML document from file

[/MaYi/city/paoject/apache-tomcat-6.0.29/webapps/paoject-service/WEB-INF/classes/spring_core/applicationContext.xml]; nested exception is

java.lang.NoSuchMethodError: org.springframework.beans.MutablePropertyValues.add(Ljava/lang/String;Ljava/lang/Object;)Lorg/springframework/beans/MutablePropertyValues;at org.springframework.beans.factory.xml.XmlBeanDefinitio

java.lang.NoSuchMethodError  这个错误,网上一般都说是spring版本冲突 ,需删除重复的低版本jar包。

比如:

http://blog.csdn.net/javaburning/article/details/7321247

http://blog.csdn.net/zongzhankui/article/details/6844317

由于担心是模块之间的jar冲突,就先部署一个模块,可还是报同样的错误。

经过查找,MutablePropertyValues 这个类出现在如下两个jar中。

但是,第一个jar里面找不到add方法。第二个里面有add方法。因为我是往开发环境部署,就去和生产环境对比一下。Jar包差别很大。生产环境的jar与本地不一致。就这两个jar而言,生产环境没有 spring-2.5.6.jar,只有,况且spring-2.5.6.jar中也没有add方法,所以我就删除了spring-2.5.6.jar

https://www.cnblogs.com/BensonHe/p/3903050.html这篇文章介绍了spring各个jar的作用,这所以我猜测这个spring-2.5.6.jar是老版本的spring的单一整合jar包,现在用的3.1.2的拆分spring  模块jar包。再次启动,java.lang.NoSuchMethodError 错误没有了。看来貌似是解决了冲突。但出现新的很多错误。

错误主要是:

①无法创建bean对象     systemCacheFactoryBean            paojectZdCacheLoadImpl         sessionFactory         dataSource

,其中  systemCacheFactoryBean   和  paojectZdCacheLoadImpl   存在于依赖的另一个模块打成的jar包,这个jar是存在的。而  sessionFactory  和   dataSource 是出现在application.xml  里面的。

②  javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

参考

http://blog.sina.com.cn/s/blog_598764b10100a9e2.html

③  servlet-api-2.4.jar  not locad

/WEB-INF/lib/servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

【这个问题是删除jar包之前就有的,貌似在启动阶段对于程序没什么影响】

参考文章  http://blog.csdn.net/jingjingwin5/article/details/7837866  解决。  删除了   servlet-api.2.4.jar  ,可是生产环境里面是有这个jar的。= =!

再次尝试:把生产环境的所有jar复制出来,替换自己的所有的jar【生产环境的jar比自己的jar多,此外还有一些不一致】,启动测试,还是不行,问题同上。

之后

查询   Error creating bean with name 'sessionFactory' ,  http://bbs.csdn.net/topics/391921636   有说 jar包冲突了,spring和hibernate都asm-2.2.3.jar和asm.jar,删掉其中一个就好了。

我这里有这几个jar,

,尝试删掉前三个,还是同样的错误。暂时搁置问题①。

再次查询问题②,结合https://stackoverflow.com/questions/12928030/javax-naming-namenotfoundexception-name-jdbc-eswastha-is-not-bound-in-this-co 和  ②中记录的那个博客,恍然大悟,决定对比一下生产环境tomcat的conf目录下那几个配置文件有无改动。果然有所发现。在context.xml中,生产环境配置了依赖的两个数据库的连接信息:如图

在service.xml中,生产环境有以下三处改动,但是 应该不影响程序的启动,是一些参数的配置 优化 什么的。

其中  jvmRoute="tomcat8080"  这个配置第一次见,便查了一下。参考文章:

nginx 解决session共享问题(jvm-route)方式  。

Tomcat 配置详解/优化方案  。

在此提及一下,我的tomcat是6.0.29版本。生产环境是6.0.41.

经过对比,web.xml中差别很大,多出很多 <mime-mapping> 标签配置的内容,我就直接替换了自己的web.xml。

tomcat-users.xml,也多出一些内容,多配置了一些用户,也进行替换更改。

启动,所有问题得到解决。

目前小结: java.lang.NoSuchMethodError: 问题 肯定是jar冲突导致的,我也进行了验证。目前一共就删除一个jar包。就那个 spring-2.5.6.jar  。 别的问题原因是 tomcat/conf  下的contex.xml  没有配置数据源信息导致的。

ps: 没有部署文档好无语啊。。。耗时多,但是解决了问题还是很高兴的。但是有一个疑问,为什么会把数据源(库)信息配置到tomcat的context.xml里面?【项目中也有数据库配置,这里context.xml中配置的数据库连接信息是什么意思?】

参考文章:在tomcat下context.xml中配置各种数据库连接池-----------全文如下----------------

Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下。我们可以在这里找到 server.xml  context.xml。当然,还有其他一些资源文件。但是在在本文中我们只用得上这两个,其他的就不介绍了。

1.   首先,需要为数据源配置一个JNDI资源。我们的数据源JNDI资源应该定义在context元素中。在tomcat6版本中,context元素已经从server.xml文件中独立出来了,放在一个context.xml文件中。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。我们当然推荐把应用需要的JNDI资源配置在context.xml文件中,而不是server.xml文件中。

1、首先,将数据库的驱动程序copytomcat6.0\lib下,这一部是关键,如果没有copy 当运行程序的时候后报-找不到驱动-的异常。

2、将下面的代码放到Tomcat 6.0\conf\context.xml中间,如:

<Context reloadable="true">

<Resource

name="jdbc/数据库名"

type="javax.sql.DataSource"

maxActive="100"

maxIdle="30"

maxWait="5000"

username="用户名"

password="密码"

driverClassName="数据库的驱动"

url="数据库的连接地址" />

</Context>

解释:(100 30 5000 为上面的数据)

maxActive="最大可以有100名用户连接数据源"

maxIdle="如果没有用户连接,空出30个连接等待用户连接"

maxWait="如果已连接用户5000秒内没有再次连接数据源,则放弃此连接"

完成这两部,数据源就可以用了。

 

另外,也可以在项目root下的WEB-INF下新建context.xml进行配置

<?xml version="1.0" encoding="UTF-8"?>

<Context>/////直连

<Resource

name="jdbc/book"

type="javax.sql.DataSource"

password=""

driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"

maxIdle="5"

maxWait="5000"

username="sa"

url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=book"////直连数据源

maxActive="10"/> 

</Context>

<!-->

<Context>////桥连

<Resource

name="jdbc/book"

type="javax.sql.DataSource"

password=""

driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"

maxIdle="2"

maxWait="5000"

username="sa"

url="jdbc:odbc:bb"///桥连的数据源

maxActive="4"/>

<WatchedResource>C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\context.xml</WatchedResource>

</Context>

<!-->

 

直接在Context文件中加入入:

<Resource

name="jdb/dbsource"

type="javax.sql.DataSource"

driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"

maxIdle="2"

maxWait="5000"

url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=jspdev"

maxActive="4"/>

username="he"

password="he"

 

通过javajndi就可以了

InitialContext initCtx = new InitialContext();

       DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/数据库名");

       Connection conn = ds.getConnection();

以下是各种数据库的配置

1.sql2000

<Resource 

 name="jdbc/数据库名"

type="javax.sql.DataSource"

maxActive="100"

maxIdle="30"

maxWait="5000"

username="用户名"

password="密码"

driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"

url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=数据库名

/>

2.oracle

<Resource  

name="jdbc/数据库名

type="javax.sql.DataSource" 

maxActive="100" 

maxIdle="30"  

maxWait="5000" 

username="用户名"  

password="密码"  

driverClassName="oracle.jdbc.driver.OracleDriver"  

url="jdbc:oracle:thin:@127.0.0.1:1521:ora9" 

/>

3.mysql

<Resource name="jdbc/mysql" 

auth="Container" 

type="javax.sql.DataSource" //资源类型 

driverClassName="org.gjt.mm.mysql.Driver" 

url="jdbc:mysql://localhost/数据库名"  

username="用户名

password="密码

maxActive="100" //最大连结数 

maxIdle="30" //最大空闲时间,0为无限制 

maxWait="10000"/> //建立连接的的最大等待时间

-------------------------over-------------------------

目前只把一个模块的项目部署启动没问题了。同样的思路,部署另外两个项目,三者部署在同一tomcat下。

启动后出现了两个主要的异常:

①  IOException while loading persisted sessions: java.io.EOFException

这个问题解决的很顺利:原因是【引用原文作者的话:错误的原因是:EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。这是由于tomcat上次非正常关闭时有一些活动session被持久化(表现为一些临时文件),在重启时,tomcat尝试去恢复这些session的持久化数据但又读取失败造成的。此异常不影响系统的使用。】参考http://blog.csdn.net/redarmy_chen/article/details/17756725

②    另一个异常出现在日志的最后,java.lang.OutOfMemoryError: PermGen space   内存溢出。

原因是  加载了 过多的class文件。 需要在tomcat的catalina.sh 里面配置参数增大内存参数。

参见:http://blog.csdn.net/wi_232995/article/details/78222595

maven(多个模块)项目 部署 开发环境 问题处理历程【异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE】的更多相关文章

  1. 开源项目renren-fast开发环境部署(后端部分)

    开源项目renren-fast开发环境部署(后端部分) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 开发文档需要付费,官方的开发环境部署介绍相 ...

  2. 开源项目renren-fast-vue开发环境部署(前端部分)

    开源项目renren-fast-vue开发环境部署(前端部分) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 开发文档需要付费,官方的开发环境部 ...

  3. maven 配置多模块项目 pom modules

    所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...

  4. 使用Maven构建多模块项目

    [转] 使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层).dao(数据库访问层).service(业务 ...

  5. Maven管理多模块项目

    首先,我们要明确的多模块项目的含义,它是指一个应用中包含多个module.一般来说,一个应用单独部署成服务,只是打包的时候,maven会把各个module组合在一起.各模块一般单独打成jar放到lib ...

  6. 使用docker-compose来部署开发环境

    docker-compose的作用 docker-comopse可以帮助我们快速搭建起开发环境,比如你可以去把redis,mongodb,rabbitmq,mysql,eureka,configser ...

  7. (转)Maven学习总结(八)——使用Maven构建多模块项目

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(八)——使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为doma ...

  8. 【转载】Maven+druid+MyBatis+Spring+Oracle+Dubbo开发环境搭建

    原地址:http://blog.csdn.net/wp1603710463/article/details/48247817#t16 Maven+druid+MyBatis+spring+Oracle ...

  9. Maven构建多模块项目

    使用Maven构建多模块项目 转自:http://www.cnblogs.com/xdp-gacl/p/4242221.html 在平时的Javaweb项目 开发中为了便于后期的维护,我们一般会进行分 ...

随机推荐

  1. 报错apachectl -t

    httpd: apr_sockaddr_info_get() failed for wwwhttpd: Could not reliably determine the server's fully ...

  2. web安全之同源策略

    为什么使用同源策略?一个重要原因就是对cookie的保护,cookie 中存着sessionID .如果已经登录网站,同时又去了任意其他网站,该网站有恶意JS代码.如果没有同源策略,那么这个网站就能通 ...

  3. netstat查看网络信息

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Membershi ...

  4. C语言32关键字

    关键字 说明 auto 声明自动变量 short 声明短整型变量或函数 int 声明整型变量或函数 long 声明长整型变量或函数 float 声明浮点型变量或函数 double 声明双精度变量或函数 ...

  5. Spring集成shiro+nginx 实现访问记录

    最近公司的网站需要添加用户访问记录功能,由于使用了nginx请求转发直接通过HttpServletRequest无法获取用户真实Ip 关于nginx获取真实IP的资料  https://blog.cs ...

  6. UE mac版16.10.0.22破解

    http://bbs.feng.com/read-htm-tid-10828753.html 去官网下载原载,先运行一次,再在终端里执行下面代码就可以破解完成! printf '\x31\xC0\xF ...

  7. unreal3对象管理模块分析二

    上一篇主要记了UClass的创建,现在总结一下UObject的创建,可以从几个不同角度来理解. 从途径上看,可以根据UObject的构造函数来分个类: // Constructors. UObject ...

  8. Idea调整目录结构

  9. fatal: Authentication failed (二)

    一.前言 前面一段时间写了一篇解决 git 上传代码出现的权限验证问题,还是没有很好的解决.现在还了方式,具体步骤如下: 二.操作流程 我们在上传代码到服务器,我们都需要安装 Git 版本控制.在安装 ...

  10. hdu 4388 Stone Game II

    Stone Game II HDU - 4388 题目大意: 给出n堆物品,每堆物品都有若干件,现在A和B进行游戏,每人每轮操作一次,按照如下规则: 1. 任意选择一个堆,假设该堆有x个物品,从中选择 ...