2012-02-29 146 views
0

我正在使用Java在我的uni項目中工作。當我們達到了我們想要在專用基準網格(由uni提供)上運行一些基準測試的發展狀態時,我們遇到了一些問題。Java代碼在運行時生成和執行,java.lang.NoClassDefFoundError

該程序本身生成代碼並在運行時執行它(我們在初始化時預編譯一些代碼),因爲我們做了一些優化,所以這是需要的。現在

,如果我們提交代碼到工作隊列,並通過「蟻族主」運行出現以下錯誤:

[java] Exception in thread "main" java.lang.NoClassDefFoundError: javax.tools.ToolProvider 
[java] at propnet.PropNetComputations.compilePropnet(PropNetComputations.java:72) 
[java] at propnet.PropNetStateMachine.initialize(PropNetStateMachine.java:145) 
[java] at propnet.PropNetStateMachine.initialize(PropNetStateMachine.java:109) 
[java] at statemachine.StateMachineGamer.metaGame(StateMachineGamer.java:177) 
[java] at core.request.StartRequest.process(StartRequest.java:47) 
[java] at core.GamePlayer.run(GamePlayer.java:82) 
[java] at core.Main.main(Main.java:34) 

合輯似乎看透了,沒有任何問題,運行,但執行似乎由於NoClassDefFoundError失敗。起初,我們認爲這可能是一個版本問題,所以我們測試了各種Java版本(sun 1.6x,1.7x和openjdk 1.6x),但版本本身似乎不成問題。

你有什麼想法如何解決這個問題嗎?預先感謝您提供的任何幫助!

+0

什麼是您的Ant構建中的類路徑設置,以及基準網格的主機操作系統是什麼? – Perception 2012-02-29 14:51:03

回答

0

有兩條路徑我會嘗試按此順序解決此問題。

  1. 代碼生成的虛擬機是否與執行代碼相同的虛擬機?運行時正在說它試圖運行那個類,但是當它找到它時,它找不到。您可能會遺漏您編譯的依賴項,但依賴項不在代碼執行的類路徑中。

  2. 這是不太可能的,但我遇到了這個問題。有時在你的類路徑中可能有兩個相同的依賴關係。您也可能編譯了與您運行代碼不同的依賴項。他們可能被命名爲相同,但可能是不同的版本。如果依賴關係改變了它的內容,這可能導致類未找到錯誤。如果是這樣的話,那麼你幸運了,因爲通常很難追查錯誤。

希望這有助於!

2

您是否嘗試過使用JDK而不是JRE來運行您的應用程序。據我所知,JRE不包括javax.tools.*類,但是JDK的類。您也可以嘗試手動將tools.jar添加到類路徑中。

0

NoClassDefFound僅僅意味着程序或庫中有一些類依賴於不存在於類路徑中的類。如果您沒有直接從您的程序中引用此類,編譯將會正常。

就你而言,你的類路徑中可能缺少tools.jar。添加它,一切都會正常工作。