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. Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder

    1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...

  2. DBVisualizer Pro for mac

    公司使用的是DB2数据库,支持DB2的数据库客户端常用的有DBeaver和DBVisualizer.DBeaver是免费的,但本人电脑安装后,启动一直报错,问题一直没解决就放弃了.改用DBVisual ...

  3. Centos6.8下yum安装python2.7

    下载 ius-release.rpm包 wget https://centos6.iuscommunity.org/ius-release.rpm 安装ius-release.rpm包 rpm -Uv ...

  4. JSK 糟糕的bug

    传送门 题目居然复制不了(QAQ) 分析 TrieJSK已经2比较详细了,就不再单独写博客了,此题相较于Trie模板有一点不同,此题要求比较前缀却没有规定前面是后面的前缀还是后面是前面的前缀,所以我们 ...

  5. Python开发【第二篇】: 基本数据类型(一)

    1. 整型   整型即整数,用 int 表示,在 Python3 中整型没有长度限制. 1.1 内置函数   1. int(num, base=None)   int( ) 函数用于将字符串转换为整型 ...

  6. 该项目中不存在目标“GatherAllFilesToPublish”

    在项目发布的时候报了一个 该项目中不存在目标“GatherAllFilesToPublish”  的奇怪错误,查了之后,在报错的.csproj里面添加 <Target Name="Ga ...

  7. 在Android中使用FlatBuffers(上篇)

    本文来自网易云社区. 总览 先来看一下 FlatBuffers 项目已经为我们提供了什么,而我们在将 FlatBuffers 用到我们的项目中时又需要做什么的整体流程.如下图: 在使用 FlatBuf ...

  8. Linux命令使用

    命令行创建设置用户密码 $ sudo useradd -m -r username $ cat "username:password" | sudo chpasswd -m 查询u ...

  9. VBA学习笔记

    这是一个学习VBA编程的学习笔记. 一. 介绍 二. 使用手册 2.1. 如何在Excel2010中开始使用VBA? 2.2. 如何使用VBA编辑器进行编程? 三. 语法说明 3.1 数据类型 3.2 ...

  10. AddDemo教学演示