2012-02-29 79 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。添加它,一切都会正常工作。