如何配置Eclipse语言服务器及Neovim的jdtls以识别target/generated-sources生成代码目录
如何配置Eclipse语言服务器及Neovim的jdtls以识别target/generated-sources生成代码目录
我太懂你这种糟心的情况了——Spring-GraphQL项目里用插件生成的实体类扔在target/generated-sources,IntelliJ能自动认出来,结果Neovim靠jdtls(底层用Eclipse语言服务器)和原生Eclipse却死活不识别,代码全飘红,连基本的语法提示都没了。咱们一步步捋清楚问题,把它解决掉。
第一步:修正你的build-helper-maven-plugin配置
先看看你当前的插件配置,有几个可以优化的点:
- 执行ID用了
test,虽然不影响功能,但换成更贴合用途的名字(比如add-generated-sources)会更清晰,方便后续维护 - 要确认生成的代码是不是直接放在
target/generated-sources根目录——有些GraphQL生成插件会把代码放到子目录(比如target/generated-sources/graphql-java),如果只加根目录,jdtls可能还是识别不到子目录里的类
给你调整后的配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.4.0</version> <executions> <execution> <id>add-generated-sources</id> <!-- 更清晰的执行ID --> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <!-- 如果生成代码在子目录,替换成具体路径,比如target/generated-sources/graphql-java --> <source>${basedir}/target/generated-sources</source> <!-- 多个子目录的话,添加额外的<source>项即可 --> <!-- <source>${basedir}/target/generated-sources/another-subdir</source> --> </sources> </configuration> </execution> </executions> </plugin>
第二步:解决Eclipse语言服务器生成.classpath的optional属性问题
你提供的.classpath文件里,target/generated-sources目录被标记了<attribute name="optional" value="true"/>——这个属性会让jdtls把这个目录当成“可选”源码,直接跳过语法解析,这就是代码飘红的核心原因之一。
咱们可以在pom.xml里添加m2e生命周期映射配置,强制让这个源码目录的optional属性为false:
<plugin> <groupId>org.eclipse.m2e</groupId> <artifactId>lifecycle-mapping</artifactId> <version>1.0.0</version> <configuration> <lifecycleMappingMetadata> <pluginExecutions> <pluginExecution> <pluginExecutionFilter> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <versionRange>[3.4.0,)</versionRange> <goals> <goal>add-source</goal> </goals> </pluginExecutionFilter> <action> <execute> <runOnConfiguration>true</runOnConfiguration> <runOnIncremental>true</runOnIncremental> </execute> </action> </pluginExecution> </pluginExecutions> </lifecycleMappingMetadata> </configuration> </plugin>
这段配置会告诉Eclipse的Maven插件(m2e)正确处理build-helper的add-source操作,避免生成optional=true的属性。
第三步:给Neovim的jdtls加兜底配置
如果上面的Maven配置调整后还是没生效,咱们可以直接在jdtls的配置里手动指定源码目录,确保它能识别到:
方式1:在jdtls的settings里添加
找到你的Neovim jdtls配置文件(一般是lua脚本),在settings里添加sourcePaths:
local config = { -- 其他jdtls配置(比如cmd、root_dir等)... settings = { java = { project = { sourcePaths = { "target/generated-sources", -- 有子目录的话记得加上 -- "target/generated-sources/graphql-java" } } } } }
方式2:用jdtls API动态添加
也可以通过自动命令,在打开Java文件时动态添加源码目录:
vim.api.nvim_create_autocmd("FileType", { pattern = "java", callback = function() local jdtls = require('jdtls') -- 添加生成的源码目录 jdtls.add_source_paths({"./target/generated-sources"}) end, })
最后验证步骤
- 先执行
mvn clean generate-sources,确保生成的代码目录和文件都存在 - 删除项目根目录的
.classpath文件,然后重启Neovim(或者让Eclipse重新加载项目) - 检查新生成的
.classpath,看看target/generated-sources的optional属性是不是已经变成false或者被移除了
这样操作后,jdtls和Eclipse应该就能正常识别生成的代码目录,飘红的问题也就解决了。
备注:内容来源于stack exchange,提问作者AndrasCsanyi




