项目(project)
项目(project)
管理项目
IntelliJ Platform 的项目配置信息存储在XML文件里。项目格式(project format ) 确定存储文件的格式。
$project_name$.ipr 存储项目的核心信息。
$module_name$.iml 存储模块的配置信息,每个模块都有自己的配置文件。
$project_home_directory$/.idea 文件夹下面的XML文件存储项目和工作空间的配置信息。每一个XML 文件的名字都代表了它所存储的配置项,例如 projectCodeStyle.xml 存储代码格式配置, encodings.xml 存储编码配置, vcs.xml 存储版本控制系统的配置等。 .iml 文件描述的是模块的信息
注意:加载和保存配置文件时,不需要直接访问相关文件,可以访问IntelliJ Platform 封装的相关对象,相关内容可以参考文档:持久化组件数据
管理项目和项目文件,需要用到下面的类或接口:
在projectModel-api.openapi 包中有其它的跟项目模型有关的类。
core-api.openapi 包中有和项目(project) , 模块(Module) 和 应用(Application) 有关的基础类或接口
如何得到一个项目(project)实例
获取Project有多种途径:
获取 VirtualFile 所在的 Project
ProjectLocator.guessProjectForFile(VirtualFile) :获取包含指定文件的任意一个 Project (如果有多个项目(Project)包含该文件,只会返回一个)
ProjectLocator.getProjectsForFile(VirtualFile) : 获取包含指定文件的所有 项目(Project)
ProjectManager.getOpenProjects() :获取当前打开的所有 项目(Project)。
获取项目中所有模块的根目录
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.openapi 包下的类可以修改项目结构,在它的 roots 子包里面包含可以操作Project和Module源码的类,例如:ModuleRootModificationUtil 和 ProjectRootUtil 。 为了线程安全,改变项目结构都会在 write action 中执行。
修改项目结构,可以参考示例插件 project_model 中的 ModificationAction 类。
接收修改项目结构的通知
如果需要接收修改项目结构的通知(像增加或删除Module和libraries,修改Module的依赖等),可以使用 message bus 订阅 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>
该事件只会通知修改了哪些东西,如果需要知道因为本次修改引起的其它变化,需要在修改之前复制一份项目结构的状态,和修改完成以后项目结构的状态做比较。