Neovim中运行多类Java文件的问题及解决方案咨询
问题描述
日常开发Java项目,从VSCode切换到Neovim后,Java LSP已配置完成,但运行依赖同包其他类的Java文件时,使用java file.java或当前code_runner.nvim配置会报错找不到同包的Cache类,错误提示“找不到符号”。
示例代码(Main.java):
package com.khush.distributed.cache; public class Main { public static void main(String[] args) { Cache cache = new Cache(4); cache.put("1", "1"); cache.put("2", "2"); cache.put("3", "3"); cache.put("4", "4"); cache.printList(); System.out.println(); System.out.println(); cache.get("2"); cache.printList(); cache.put("5", "5"); System.out.println(); System.out.println(); cache.printList(); } }
错误信息:
Main.java:5: error: cannot find symbol Cache cache = new Cache(4); ^ symbol: class Cache location: class Main Main.java:5: error: cannot find symbol Cache cache = new Cache(4); ^ symbol: class Cache location: class Main 2 errors [Process exited 1]
当前code_runner.nvim配置:
return { "CRAG666/code_runner.nvim", config = function() require("code_runner").setup({ filetype = { java = { "cd $dir &&", "javac $fileName &&", "java $fileNameWithoutExt", }, python = "python3 -u", typescript = "deno run", rust = { "cd $dir &&", "rustc $fileName &&", "$dir/$fileNameWithoutExt", }, }, }) vim.keymap.set("n", "<leader>r", ":RunCode<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rf", ":RunFile<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rp", ":RunProject<CR>", { noremap = true, silent = false }) end, }
解决方法
问题根源是Java包机制要求编译、运行必须基于项目根目录(即包含com文件夹的上级目录),直接在文件所在目录执行命令会导致Java无法识别同包类的路径。
方案1:修改code_runner.nvim的Java配置
调整编译运行命令,切换到项目根目录后执行,同时处理同包类的编译和类路径:
方式A:直接编译指定类
适合只有少量同包类的场景,修改后的配置如下:
return { "CRAG666/code_runner.nvim", config = function() require("code_runner").setup({ filetype = { java = { -- 回退到项目根目录(根据你的包层级调整回退次数,这里是4级) "cd $dir/../../../../ &&", -- 编译Main和Cache类 "javac com/khush/distributed/cache/Main.java com/khush/distributed/cache/Cache.java &&", -- 通过全限定类名运行 "java com.khush.distributed.cache.Main", }, python = "python3 -u", typescript = "deno run", rust = { "cd $dir &&", "rustc $fileName &&", "$dir/$fileNameWithoutExt", }, }, }) vim.keymap.set("n", "<leader>r", ":RunCode<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rf", ":RunFile<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rp", ":RunProject<CR>", { noremap = true, silent = false }) end, }
方式B:编译到指定输出目录(更通用)
适合多包或类较多的项目,将编译后的类文件统一放到bin目录,运行时指定类路径:
return { "CRAG666/code_runner.nvim", config = function() require("code_runner").setup({ filetype = { java = { "cd $dir/../../../../ &&", -- 编译同包所有类到bin目录 "javac -d bin com/khush/distributed/cache/*.java &&", -- 从bin目录加载类运行 "java -cp bin com.khush.distributed.cache.Main", }, python = "python3 -u", typescript = "deno run", rust = { "cd $dir &&", "rustc $fileName &&", "$dir/$fileNameWithoutExt", }, }, }) vim.keymap.set("n", "<leader>r", ":RunCode<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rf", ":RunFile<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rp", ":RunProject<CR>", { noremap = true, silent = false }) end, }
方案2:利用Java 11+的单文件运行特性
如果你的Java版本是11或以上,可以直接用java命令运行源文件,自动处理同包依赖,只需确保在项目根目录执行:
return { "CRAG666/code_runner.nvim", config = function() require("code_runner").setup({ filetype = { java = { "cd $dir/../../../../ &&", "java com/khush/distributed/cache/$fileName", }, python = "python3 -u", typescript = "deno run", rust = { "cd $dir &&", "rustc $fileName &&", "$dir/$fileNameWithoutExt", }, }, }) vim.keymap.set("n", "<leader>r", ":RunCode<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rf", ":RunFile<CR>", { noremap = true, silent = false }) vim.keymap.set("n", "<leader>rp", ":RunProject<CR>", { noremap = true, silent = false }) end, }
注意事项
- 调整
cd $dir/../../../../中的回退层级,确保到达包含com文件夹的项目根目录。 - 如果项目用Maven/Gradle管理,也可以将code_runner的Java配置改成运行
mvn exec:java或gradle run,彻底避免手动处理类路径问题。
内容的提问来源于stack exchange,提问作者KhushPatibandha
相关产品推荐
相关产品推荐

