這個錯第一次看別看出了啊,不是ClassNotFoundException
一般出現都是編譯期正常,但是執行時候找不到對應類。
好了首先cause by:發現是ClassNotFoundException。找不到對應的類
趕緊檢查我的對應的類。對應的jar,對應的class文件,發現,沒啥問題。繼續。
百度嘍:
別人經驗的原因:
1 JAR重復引入,版本不一致導至
2 打程序版本時,沒有把關聯類打出去(這種情況一般是) java.lang.nosuchmethoderror 3 還有一種情況是A引用B時,B初始化失敗時也會導致以上的錯誤出現。
首先我檢查我是否jar包沖突導致的,仔細檢查。我使用的方式是使用idea的圖,觀看是否存在沖突jar包,然后進行刪除。當真被我發現了一個jar包沖突,於是我將沖突解決了。重啟項目,還是老樣子。
繼續百度:
1、對應的Class在java的classpath中不可用
2、你可能用jar命令運行你的程序,但類並沒有在jar文件的manifest文件中的classpath屬性中定義
3、可能程序的啟動腳本覆蓋了原來的classpath環境變量
4、因為NoClassDefFoundError是java.lang.LinkageError的一個子類,所以可能由於程序依賴的原生的類庫不可用而導致
5、檢查日志文件中是否有java.lang.ExceptionInInitializerError這樣的錯誤,NoClassDefFoundError有可能是由於靜態初始化失敗導致的
6、如果你工作在J2EE的環境,有多個不同的類加載器,也可能導致NoClassDefFoundError
我報錯確實是靜態變量初始化失敗,但是我還是找不到原因所在。
后面我很懷疑,我不知道問題出在哪里。於是我寫測試方法,使用Junit的@Test方法執行,沒有問題。
我好疑惑。
我使用public static void main(String[] args)進行測試,繼續出現了哪個NoClassDefEror。我擦,不知道怎么找問題了。
實在沒辦法,我懷疑我沒有導入jar包。雖然我項目的libralies里面是全部有這些jar包的。
一下不小心進入了ArtifactId這里:
好像我的依賴沒有引入war包。我的天,tomcat配置跑的是這個啊。
引入,搞定,沒問題了。
一臉懵逼,哇哇哇哇!
吸取教訓。跑項目一定要知道你跑的是什么代碼。注意,跑包與代碼是不一樣的。可以觀察下你的容器的配置。並且要相信日志,相信報錯文件。它們不會騙你的。
參考鏈接:
http://wolfdream.iteye.com/blog/1131558
http://blog.csdn.net/jamesjxin/article/details/46606307
一個造成NoClassDef的例子:
public class TestNoClassDefError { public static void main(String[] args){ List<User> users = new ArrayList<User>(2); for(int i = 0; i < 2; i++){ try{ users.add(new User(String.valueOf(i))); }catch(Throwable t){ t.printStackTrace(); } } } } class User{ private static String userId = getUserId(); public User(String id){ this.userId = id; } public static String getUserId(){ throw new RuntimeException("UserId not found"); } }