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

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

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

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

个人分类: 工作 问题

编辑

版权声明:本文为博主原创文章,转载请注明文章链接。 https://blog.****.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.****.net/javaburning/article/details/7321247

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

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

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

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

但是,第一个jar里面找不到add方法。第二个里面有add方法。因为我是往开发环境部署,就去和生产环境对比一下。Jar包差别很大。生产环境的jar与本地不一致。就这两个jar而言,生产环境没有 spring-2.5.6.jar,只有maven(多个模块)项目 部署 开发环境 问题处理历程【异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE】,况且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 错误没有了。看来貌似是解决了冲突。但出现新的很多错误。

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

错误主要是:

①无法创建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.****.net/jingjingwin5/article/details/7837866  解决。  删除了   servlet-api.2.4.jar  ,可是生产环境里面是有这个jar的。= =!

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

之后

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

我这里有这几个jar,

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

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

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

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

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

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

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

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

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

其中  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.****.net/redarmy_chen/article/details/17756725

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

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

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