Java代码生成和运行时执行,Java。lang.NoClassDefFoundError
我在大学里用Java做一个项目。当我们达到一个开发状态,希望在一个专用的基准网格(由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),但版本本身似乎没有问题
你知道怎么解决这个问题吗?提前感谢您提供的任何帮助
# 1 楼答案
有两种方法我会尝试解决这个问题,按照这个顺序
生成代码的VM是否与执行代码的VM相同?运行库说它试图运行该类,但当它查找该类时,却找不到该类。您可能缺少编译时使用的依赖项,但该依赖项不在执行代码的类路径中
这不太可能,但我遇到了这个问题。有时,类路径中可能有两个相同的依赖项。您可能还编译了与正在运行的代码具有不同依赖关系的代码。它们的名称可能相同,但可能是不同的版本。如果依赖项更改了类的内容,则这可能会导致类未找到错误。如果是这样的话,那么您就幸运了,因为通常很难跟踪由此产生的错误
希望这有帮助
# 2 楼答案
NoClassDefFound仅仅意味着程序或库中存在依赖于类路径中不存在的类的类。如果您不直接从程序中引用这个类,编译就可以了
在您的情况下,您可能缺少工具。jar在类路径中。加上它,一切都会好起来的
# 3 楼答案
您是否尝试过使用JDK而不是JRE来运行应用程序。据我所知,JRE不包含
javax.tools.*
类,但JDK包含。您还可以尝试手动将tools.jar
添加到类路径