You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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,
})

最后验证步骤

  1. 先执行mvn clean generate-sources,确保生成的代码目录和文件都存在
  2. 删除项目根目录的.classpath文件,然后重启Neovim(或者让Eclipse重新加载项目)
  3. 检查新生成的.classpath,看看target/generated-sourcesoptional属性是不是已经变成false或者被移除了

这样操作后,jdtls和Eclipse应该就能正常识别生成的代码目录,飘红的问题也就解决了。

备注:内容来源于stack exchange,提问作者AndrasCsanyi

火山引擎 最新活动