我正在使用Java在我的uni上开展一个项目。当我们达到开发状态时,我们想要在专用基准网格(由uni提供)上运行一些基准测试,我们遇到了一些问题。
程序自己生成代码并在运行时执行它(我们在初始化时预编译了一些代码),这是必要的,因为我们做了一些优化。
现在,如果我们将代码提交到作业队列并通过“ant Main”运行它,则会发生以下错误:
[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 :(得分:2)
您是否尝试过使用JDK而不是JRE来运行您的应用程序。据我所知,JRE不包括javax.tools.*
类,但JDK不包括tools.jar
类。您也可以尝试手动将{{1}}添加到类路径中。
答案 1 :(得分:0)
我会尝试按此顺序尝试解决此问题。
代码生成的VM是否与执行代码的VM相同?运行时说它试图运行该类,但是当它找到它时,它无法找到。您可能缺少编译的依赖项,但依赖项不在代码执行位置的类路径中。
这种可能性较小,但我遇到了这个问题。有时在类路径中可能存在两个相同的依赖项。您可能还使用与运行它不同的依赖项编译代码。它们的名称可能相同,但可能是不同的版本。如果依赖项已更改其内容,则可能导致类未找到错误。如果是这种情况,那么你很幸运,因为通常很难追查错误。
希望这有帮助!
答案 2 :(得分:0)
NoClassDefFound只是意味着程序或库中有一些类依赖于类路径中不存在的类。如果您不直接从程序中引用此类,则编译将正常。
在您的情况下,您可能在类路径中缺少tools.jar。添加它,一切都会正常工作。