IntelliJ Gradle插件开发读取工作目录异常,获取缓存路径而非项目路径
解决方案
你之前使用的Java原生文件路径API读取的是IDE进程的启动工作目录,IDEA启动时默认工作目录为自身的bin目录,所以测试时会拿到Gradle缓存的测试用IDE的bin路径,正式部署后也会返回本地安装IDE的bin路径,和当前打开的项目路径无关,自然不符合预期。
你需要使用IntelliJ平台提供的项目专属API获取路径:
常规场景(IDE插件运行时)
该方案适用于插件正式部署、本地runIDE测试的所有运行时场景:
- 先获取当前操作对应的
Project实例
IntelliJ插件的Action、ToolWindow等绝大多数扩展点都会直接传入Project对象,你可以直接使用。如果需要主动获取当前激活的项目,可以用以下代码:
// 方式1:获取所有已打开的项目,按需选择 Project[] openProjects = ProjectManager.getInstance().getOpenProjects(); Project currentProject = openProjects[0]; // 方式2:获取当前焦点所在的项目 Project currentProject = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContextFromFocusAsync().blockingGet());
- 直接调用API获取项目根路径
// 直接拿到项目根目录的绝对路径字符串 String projectRootPath = currentProject.getBasePath(); // 转为Path对象按需使用 Path projectRoot = Paths.get(Objects.requireNonNull(projectRootPath));
调用后返回的就是你预期的/Users/USERNAME/Documents/PROJECT路径。
特殊场景(需要在Gradle任务上下文传递路径)
如果你的逻辑需要在Gradle任务执行阶段拿到项目路径,可以通过JVM参数传递:
- 修改
build.gradle/build.gradle.kts的runIDE配置
tasks.runIde { jvmArgs("-Dcustom.project.root=${project.rootDir.absolutePath}") }
- 插件代码中读取系统属性
String projectRootPath = System.getProperty("custom.project.root");
注意该方法仅适用于本地测试场景,正式部署到用户IDE时不要使用该方式,必须走上述Project API方案。
内容的提问来源于stack exchange,提问作者Vari3ty
相关产品推荐
相关产品推荐

