1. 程式人生 > >NoClassDefFoundError: com/ibatis/sqlmap/engine/transaction/external/ExternalTransactionConfig處理

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

重新 lec frame -a mod tail 技術 發布 ext

根據老系統拷貝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處理