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 

把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

发布了104 篇原创文章 · 获赞 1 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xiaoanzi123/article/details/104390688