项目(project)

走着路睡觉大约 5 分钟

项目(project)

管理项目

IntelliJ Platform 的项目配置信息存储在XML文件里。项目格式(project formatopen in new window ) 确定存储文件的格式。

$project_name$.ipr 存储项目的核心信息。

$module_name$.iml 存储模块的配置信息,每个模块都有自己的配置文件。

$project_home_directory$/.idea 文件夹下面的XML文件存储项目和工作空间的配置信息。每一个XML 文件的名字都代表了它所存储的配置项,例如 projectCodeStyle.xml 存储代码格式配置, encodings.xml 存储编码配置, vcs.xml 存储版本控制系统的配置等。 .iml 文件描述的是模块的信息

注意:加载和保存配置文件时,不需要直接访问相关文件,可以访问IntelliJ Platform 封装的相关对象,相关内容可以参考文档:持久化组件数据

管理项目和项目文件,需要用到下面的类或接口:

Projectopen in new window

ProjectRootManageropen in new window

ProjectManageropen in new window

ProjectFileIndexopen in new window

projectModel-api.openapiopen in new window 包中有其它的跟项目模型有关的类。

core-api.openapiopen in new window 包中有和项目(project)open in new window模块(Module)open in new window应用(Application)open in new window 有关的基础类或接口

如何得到一个项目(project)实例

获取Project有多种途径:

ContextAPI
ActionAnActionEvent.getProject()open in new window
DataContext.getData(CommonDataKeys.PROJECT)open in new window
EditorEditor.getProject()open in new window
ModuleModule.getProject()open in new window
PSIPsiElement.getProject()open in new window
TestsIdeaProjectTestFixture.getProject()open in new window

获取项目中所有模块的根目录

String projectName = project.getName();
VirtualFile[] vFiles = ProjectRootManager.getInstance(project)
    .getContentSourceRoots();
String sourceRootsList = Arrays.stream(vFiles)
    .map(VirtualFile::getUrl)
    .collect(Collectors.joining("\n"));
Messages.showInfoMessage("Source roots for the " + projectName +
    " plugin:\n" + sourceRootsList, "Project Properties");

判断文件是否属于某个项目

ProjectFileIndex projectFileIndex =
    ProjectRootManager.getInstance(project).getFileIndex();
    projectFileIndex.isInSource(VirtualFile)

获取指定文件或文件夹的Root或Content

VirtualFile moduleContentRoot = ProjectRootManager.getInstance(project)
    .getFileIndex().getContentRootForFile(virtualFileOrDirectory);
VirtualFile moduleSourceRoot = ProjectRootManager.getInstance(project)
    .getFileIndex().getSourceRootForFile(virtualFileOrDirectory);

注意:如果文件不属于任何一个项目中的 Module,则返回 null

判断指定文件或文件夹是否跟 Project Libraries有关

提示

ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();

  • ProjectFileIndex.isLibraryClassFile(): 如果 virtualFile 属于编译后的类,返回true.

  • ProjectFileIndex.isInLibraryClasses(): 如果 virtualFileOrDirectory 属于library 的编译后的类,返回true

  • ProjectFileIndex.isInLibrarySource(): 如果 virtualFileOrDirectory 属于 library 中未编译的类,返回true.

获取Project的SDK

默认情况下,项目中的模块(Module)使用的是项目的SDK,也可以为每一个模块(Module)指定不同的SDK,了解更多详情,请查看文档:SDK

Sdk projectSdk = ProjectRootManager.getInstance(project).getProjectSdk();

修改项目结构

projectModel-impl.openapiopen in new window 包下的类可以修改项目结构,在它的 rootsopen in new window 子包里面包含可以操作Project和Module源码的类,例如:ModuleRootModificationUtilopen in new windowProjectRootUtilopen in new window 。 为了线程安全,改变项目结构都会在 write action 中执行。

修改项目结构,可以参考示例插件 project_modelopen in new window 中的 ModificationActionopen in new window 类。

接收修改项目结构的通知

如果需要接收修改项目结构的通知(像增加或删除Module和libraries,修改Module的依赖等),可以使用 message busopen in new window 订阅 ProjectTopics.PROJECT_ROOTS 主题,如下:

project.getMessageBus().connect().subscribe(ProjectTopics.PROJECT_ROOTS,
    new ModuleRootListener() {
      @Override
      public void rootsChanged(ModuleRootEvent event) {
      }
    });

在2019.3版本以后,也可以在plugin.xml 注册监听器

  <projectListeners>
        <listener class="ModuleRootListener实现类" topic="com.intellij.openapi.roots.ModuleRootListener"></listener>
    </projectListeners>

该事件只会通知修改了哪些东西,如果需要知道因为本次修改引起的其它变化,需要在修改之前复制一份项目结构的状态,和修改完成以后项目结构的状态做比较。

接收关闭/打开 Project事件

ProjectManagerListeneropen in new window 监听器

上次编辑于:
贡献者: zhaojingbo
Loading...