模块(Module)
大约 3 分钟
模块(Module)
模块(Module) 里包含源码,构建脚本,单元测试,开发内容描述等。
模块(Module) 关键组件如下:
Content roots: 模块(Module) 的根目录。每个根目录只归属于一个模块;多模块之间不能共享根目录
Source roots:Content roots下面会有多个source roots ,例如,java源码的source roots 是 $Content roots$/src/main/java ,resources 的source roots 是 $Content roots$/src/main/resources 。source roots 也会用来进行依赖检查,例如,main包里不能依赖test 包里的类。
Order entries : module 的依赖会存储在一个有序列表里,依赖可能来源于sdk,第三方jar包,或另一个module等。
Facets : 使用的技术框架的列表
Module 还存储了其它配置,例如指定的sdk,编译输出目录(compile output path)等,插件可以创建 module-level 的组件或 facets 来存储这些配置信息。
为了方便操纵Module , IntelliJ Platform 提供了一些接口和类,如下:
如何获取项目里包含哪些Module?
ModuleManager.getModules()
如何获取Module的依赖和classpath?
Order entries 包含了Module使用的来源于SDK,libraries 和其它Module的依赖。可以直接在File->Project Structure 对话框里看到,如下图:
要显示Module 的依赖列表,可以使用 OrderEnumerator 类
// 获取 Order entries
OrderEnumerator orderEnumerator = ModuleRootManager.getInstance(module).orderEntries();
//获取所有依赖的classpath
VirtualFile[] roots = orderEnumerator.classes().getRoots();
如何获取Module使用的SDK?
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
Sdk SDK = moduleRootManager.getSdk();
String jdkInfo = "Module: " + module.getName() + " SDK: " + SDK.getName() + " SDK version: "
+ SDK.getVersionString() + " SDK home directory: " + SDK.getHomePath();
如何获取当前Module直接依赖的其它Module列表?
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
Module[] dependentModules = moduleRootManager.getDependencies();
String[] dependentModulesNames = moduleRootManager.getDependencyModuleNames();
如何获取依赖了当前Module的Module列表?
// module1是否直接依赖了module2
boolean isDependent = ModuleManager.getInstance(project).isModuleDependent(module1,module2);
如何获取指定文件或 PSI element 属于哪个Module
- 获取指定的文件属于哪个Module
String pathToFile = "C:\\users\\firstName.LastName\\plugins\\myPlugin\\src\\MyAction.java";
VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByPath(pathToFile);
Module module = ModuleUtil.findModuleForFile(virtualFile,myProject);
String moduleName = module == null ? "Module not found" : module.getName();
- ModuleUtil.findModuleForPsiElement() 可以获取 PSI element 属于哪个module
访问Module根目录
VirtualFile[] contentRoots = ModuleRootManager.getInstance(module).getContentRoots();
判断某个文件或文件夹是否是Module的source root
//文件和文件夹都会被封装成virtual file
VirtualFile moduleSourceRoot = ProjectRootManager.getInstance(project).getFileIndex().getSourceRootForFile(virtualFileOrDirectory);
JAVA:编译输出目录配置
VirtualFile compilerOutputPath = CompilerModuleExtension.getInstance(module).getCompilerOutputPath();
监控Module修改事件
监控Module的新增,删除和重命名事件
- 代码监控
project.getMessageBus().connect().subscribe(ProjectTopics.MODULES, new ModuleListener() {
@Override
public void moduleAdded(@NotNull Project project, @NotNull Module module) {
}
});
- 在2019.3+版本后,在plugin.xml注册监控
<projectListeners>
<listener class="ModuleRootListener实现类" topic="com.intellij.openapi.roots.ModuleRootListener"></listener>
</projectListeners>
Loading...