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一樣,使用時請慎重
NoClassDefFoundError: com/ibatis/sqlmap/engine/transaction/external/ExternalTransactionConfig處理