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是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、首先,将数据库的驱动程序copy到tomcat6.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"
通过java的jndi就可以了
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