修复Java类路径错误 | AI生成和翻译
您遇到的错误(Could not find or load main class scripts.benchmark.MultiMark)是因为您尝试从项目根目录(~/projects/lzwjava.github.io)使用完全限定类名(scripts.benchmark.MultiMark)运行Java程序,但Java运行时期望从包结构开始的目录运行该类,或者您需要正确指定类路径。当您切换到scripts/benchmark目录并运行java MultiMark时,它成功了,因为该类相对于命令位于正确的目录中。
要从项目根目录(~/projects/lzwjava.github.io)运行MultiMark.java或MultiMark.class而不切换目录,您可以使用-cp(类路径)选项与java命令告诉Java在哪里找到编译后的类文件。以下是两种实现方法,让您保持在根目录:
选项1:使用类路径运行编译后的类
如果MultiMark.class已存在于scripts/benchmark/中(如您的ls输出所示),您可以通过指定类路径从根目录运行它。
-
保持在根目录 确保您在
~/projects/lzwjava.github.io中。 - 运行程序
使用
-cp选项指向包含类文件的目录:java -cp scripts/benchmark MultiMark-cp scripts/benchmark告诉Java在scripts/benchmark目录中查找类。MultiMark是类名(没有.class或包前缀,因为MultiMark.java没有package语句)。
这应该产生如下输出:
CPU cores: 32 ... - 注意:如果
MultiMark.class已过时或缺失,首先从根目录编译源文件:javac scripts/benchmark/MultiMark.java然后运行上述命令。
选项2:使用类路径直接运行源文件(Java 11+)
如果您更喜欢直接运行源文件(如python script.py),您可以使用java命令与源文件路径,并指定类路径。
-
保持在根目录 确保您在
~/projects/lzwjava.github.io中。 -
运行源文件 使用:
java -cp scripts/benchmark scripts/benchmark/MultiMark.java-cp scripts/benchmark将类路径设置为包含源的目录。scripts/benchmark/MultiMark.java指定要编译和运行的源文件。
这在一个步骤中编译并运行
MultiMark.java,产生与之前相同的输出。
选项3:在根目录中创建Shell脚本
为了更方便(如从根目录运行./multimark),您可以在根目录(~/projects/lzwjava.github.io)中创建一个Shell脚本。
- 创建Shell脚本
在根目录中创建一个名为
multimark的文件:nano multimark添加:
#!/bin/bash java -cp scripts/benchmark MultiMark保存并退出。
- 使其可执行
chmod +x multimark - 运行脚本
从根目录:
./multimark这运行Java程序而不需要切换目录。
- 可选:在脚本中编译
如果您希望脚本处理编译(例如,如果源文件更改),修改脚本:
#!/bin/bash javac scripts/benchmark/MultiMark.java java -cp scripts/benchmark MultiMark
关键注意事项
- 类路径(
-cp):-cp选项告诉Java在哪里查找类或源文件。由于MultiMark.java没有package语句,类名只是MultiMark,而不是scripts.benchmark.MultiMark。如果它有package scripts.benchmark;行,您需要从根目录使用java -cp . scripts.benchmark.MultiMark。 - Java版本:源文件执行(
java scripts/benchmark/MultiMark.java)需要Java 11或更高版本。您的系统似乎已安装Java,因为从scripts/benchmark目录运行成功。 - 目录:这些解决方案让您保持在根目录(
~/projects/lzwjava.github.io),符合您的偏好。 - 自动化:Shell脚本(选项3)最接近Python式的体验,因为您可以像运行Python脚本一样运行
./multimark。您还可以将其添加到PATH中以全局访问,但这是可选的。 - 错误处理:如果您遇到如
NoClassDefFoundError的错误,请确保MultiMark.class存在于scripts/benchmark/中或重新编译。如果找不到Java,请验证安装(java --version)。
如果您希望将此与Python脚本集成或需要特定的工作流程(例如,一起运行multimark.py和MultiMark.java),请告诉我!