VSCode使用JUnit5时报错找不到或无法加载主类问题求解
junit-platform-console-standalone-1.7.0-M1.jar是预发布里程碑版本的可执行Fat Jar,内部打包了完整JUnit运行时及所有关联依赖,且Jar包内META-INF/MANIFEST.MF声明了自定义主类与类加载逻辑。VSCode Java插件默认会将项目依赖目录下的所有Jar包无差别加入所有运行场景(普通main方法启动、测试用例执行)的全局类路径,运行main方法时该Fat Jar的类加载逻辑优先级高于用户代码输出路径,会拦截主类查找流程,最终抛出Error: Could not find or load main class错误。
方案1:隔离测试依赖与主程序类路径(最优,无需换依赖版本也可解决)
- 在项目根目录新建独立的
test-lib文件夹,专门存放测试相关依赖,将当前lib目录下的junit-platform-console-standalone-1.7.0-M1.jar移动到该文件夹 - 打开项目下的
.vscode/settings.json配置文件,添加/修改如下配置,实现主程序和测试运行时的类路径隔离:
{ "java.project.sourcePaths": ["src"], "java.project.outputPath": "bin", // 主程序运行时仅加载lib目录下的普通依赖,排除测试依赖目录 "java.project.referencedLibraries": { "include": ["lib/**/*.jar"], "exclude": ["test-lib/**/*.jar"] }, // 测试运行时额外加载test-lib目录下的JUnit依赖 "java.test.config": { "classPaths": ["bin", "test-lib/**/*.jar"] } }- 打开VSCode命令面板(快捷键
Ctrl+Shift+P/Cmd+Shift+P),执行Java: Clean Java Language Server Workspace命令,等待Java语言服务重启完成即可。
- 在项目根目录新建独立的
方案2:替换预发布版本依赖为稳定正式版
该类冲突仅存在于1.7.0-M1这类里程碑预发布版本,替换为正式稳定版(1.8.0+正式版均可)的junit-platform-console-standaloneJar包后,即使放在lib目录下也不会干扰main方法正常启动,替换后同样需要清理Java语言服务器工作区生效。方案3:使用拆分的轻量JUnit依赖替代Fat Jar
如果不需要通过命令行 standalone 方式执行测试,无需使用打包了所有依赖的Fat Jar,直接下载拆分的三个核心Jar包放入lib目录即可,完全不会出现类路径冲突:- junit-jupiter-api
- junit-jupiter-engine
- junit-platform-launcher
三个包选择同版本的正式稳定版即可,不需要额外做类路径隔离。
注意:日常开发不建议使用Mx(里程碑)、RCx(候选发布)版本的依赖包,这类预发布版本普遍存在未修复的类加载、兼容性bug,优先选择官方正式发布的稳定版本。
内容的提问来源于stack exchange,提问作者Thomas

