NoClassDefFoundError: com/ibatis/sqlmap/engine/transaction/external/ExternalTransactionConfig处理

根据老系统拷贝maven依赖新搭建了一个项目,启动抛异常如下:

Caused by: java.lang.NoClassDefFoundError: com/ibatis/sqlmap/engine/transaction/external/ExternalTransactionConfig
    at org.springframework.orm.ibatis.SqlMapClientFactoryBean.<init>(SqlMapClientFactoryBean.java:103)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 56 more
    

ExternalTransactionConfig是ibatis-sqlmap的类,难道包没有引入?

查看项目依赖:

没有问题

查看当前model的依赖

也没有问题

分析:

NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。

我当前查看的依赖,在编译期间是没有问题的。可是已发布到tomcat就出错。

maven执行clean install,然后查看生成的war包

竟然木有ibatis-sqlmap包

查看pom文件,发现了问题之所在

知识拓展:

在maven的依赖管理中,有两种方式可以对依赖关系进行撤销,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions)。

我们这里的optional标签就是可选依赖!

Project-A --> Project-B。Project-A中依赖B时设置 <optional>true</optional>

在编译项目A时,是可以正常通过的。如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。

如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。

因此,去掉<optional>true</optional>进行强依赖!

重新编译运行,搞定!

结论:

1、NoClassDefFoundError是运行时在Java的classpath路径中,对应的类不可用导致的错误

参考:http://blog.csdn.net/jamesjxin/article/details/46606307

2、maven可选依赖<optional>true</optional>和依赖范围scope一样,使用时请慎重

时间: 2024-07-28 12:46:55

NoClassDefFoundError: com/ibatis/sqlmap/engine/transaction/external/ExternalTransactionConfig处理的相关文章

com.ibatis.sqlmap.client.SqlMapException: There is already a statement named search in this SqlMap.

Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'.  Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeExceptio

解决com.ibatis.sqlmap.client.SqlMapException: There is no statement named in this SqlMap

com.ibatis.sqlmap.client.SqlMapException: There is no statement named in this SqlMap. 可能存在3种情况: 1.在xxx.xml文件中有两个标签的id命名相同: 2.DAO实现类方法中没有写对应xxx.xml的id名称: 3.实体映射文件xxx.xml未加入到sqlMap-Config.xml文件中. 解决com.ibatis.sqlmap.client.SqlMapException: There is no

spring整合hibernate时报错:org.hibernte.engine.transaction.spi.transactioncontext

错误提示:Caused by:java.lang.ClassNotFoundException: org.hibernte.engine.transaction.spi.transactioncontext 本人用的hibernate版本为5.2.5,spring为4.6.1. 在applicationContext.xml中错误配置: <!--3. 配置hibernate的sessionfactory实例 ,通过spring提供的LocalSessionFactoryBean类进行配置-->

ibatis sqlmap配置问题 “Check the IBatisNet.DataAccess.DaoSessionHandlers.SqlMapDaoSessionHandler.”

- The error occurred while configure DaoSessionHandler.- The error occurred in <property name="resource" value="App_Data\sqlMap.config" xmlns="http://ibatis.apache.org/dataAccess" />. - Check the IBatisNet.DataAccess.Da

Ibatis学习总结2--SQL Map XML 配置文件

SQL Map 使用 XML 配置文件统一配置不同的属性,包括 DataSource 的详细配置信息, SQL Map 和其他可选属性,如线程管理等.以下是 SQL Map 配置文件的一个例子: SqlMapConfig.xml. 1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <!DOCTYPE sqlMapConfig 4 5 PUBLIC "-//iBATIS.com//DTD SQL M

spring2.5整合ibatis

SqlMapClient对象 这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作.这个类是我们使用iBATIS的最主要的类. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/s

xml配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/u

性能调优案例分享:jvm crash的原因 2

3.core dump分析 有了core dump文件,接下来要做的就是通过命令去解析此文件,定位具体问题了,主要有以下三个命令: (1)先执行gdb $JAVA_HOME$/bin/java core-java-16427-1325846515,再执行bt,输出结果如下: Loaded symbols for /opt/.../oracle/lib/libnnz10.soReading symbols from /opt/.../install/oracle/10.2.0.3/lib/libo

数据库连接池应用中数据库服务器断开超时连接的问题

数据库应用开发过程中,我们可能会遇到一个问题:应用使用了数据库连接池,每经过指定时间后,发出到数据库服务器的任何请求都会失败,而且有且仅有一次失败,之后的正常访问都没有问题.尤其是在Web应用中,如果晚上时段没有访问,而第二天第一个访客的经历就是碰到一个数据库访问错误,如果开发系统的程序员没有注意这个问题的话,可能终端用户访问会看到抛出的一堆数据库异常信息. 其实,这个问题的主要原因是,应用中数据库连接池中会保存指定数量的数据库连接实例,而这些连接实例并没有定时地检测其到数据库服务器连接是否正常