Module
_module_是一个独立的功能单元,可以独立运行,测试和调试. 模块包括源代码,构建脚本,单元测试,部署描述符等.
模块的关键组件是:
- 内容根 - 属于该模块的文件的目录(源代码,资源等) 存储. 每个目录可以属于一个且只有一个模块; 共享内容根目录是不可能的 多个模块之间.
- 源根 - 内容根可以在其下面有多个源根. 源根可以有不同的类型: 常规源根,测试源根,资源根等.在IntelliJ IDEA中,源根用作包层次结构的根 结构(源根目录下的Java类将位于根包中). 源根也可以用来 实现更细粒度的依赖性检查(常规源根目录下的代码不能依赖于测试下的代码 源根). 并非所有其他基于IntelliJ平台的IDE都使用源根.
- 订单输入 - 模块的依赖关系,存储在有序列表中. 依赖可以作为参考 到SDK,library或其他模块.
- ** Facets** - 特定于框架的配置条目列表.
除此之外,模块还可以存储其他设置,例如特定于模块的SDK,编译输出路径
设置,等等. 插件可以通过创建构面或模块级组件来存储与模块关联的其他数据.
IntelliJ Platform 提供了许多可用于处理模块的Java类和接口:
ModuleManager
abstract class.Module
interface.ModuleRootManager
abstract class.ModuleRootModel
interface.ModuleUtil
class.ModifiableModuleModel
interface.ModifiableRootModel
interface.
本节讨论如何完成与模块管理相关的一些常见任务.
如何获得项目包含的模块列表?
使用ModuleManager.getModules()
方法.
如何获取模块的依赖关系和类路径?
_Order entries_包括模块使用的SDK,库和其他模块. 使用* IntelliJ IDEA * UI,您可以在* Project Structure *对话框的Dependencies选项卡上查看模块的订单条目 框.
要探索模块依赖关系,请使用OrderEnumerator类.
以下代码片段说明了如何获取模块的类路径(所有依赖项的类根):
VirtualFile[] roots = ModuleRootManager.getInstance(module).orderEntries().classes().getRoots();
如何获取模块使用的SDK?
使用ModuleRootManager.getSdk()
方法.
此方法返回Sdk类型的值.
以下代码段说明了如何获取指定模块使用的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();
如何获得该模块直接依赖的模块列表?
使用ModuleRootManager.getDependencies()
方法获取Module
类型值的数组或ModuleRootManager.getDependencyModuleNames()
以获取模块名称数组.
为了澄清,请考虑以下代码段:
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
Module[] dependentModules = moduleRootManager.getDependencies();
String[] dependentModulesNames = moduleRootManager.getDependencyModuleNames();
如何获取依赖于该模块的模块列表?
使用ModuleManager.getModuleDependentModules(module)
方法.
请注意,您还可以通过以下方式使用ModuleManager.isModuleDependent
方法检查模块(* module1 )是否依赖于另一个指定的模块( module2 *):
boolean isDependent = ModuleManager.getInstance(project).isModuleDependent(module1,module2);
如何获取指定文件或PSI元素所属的模块?
*要获取指定文件所属的项目模块,请使用ModuleUtil.findModuleForFile()
静态方法.
为了澄清,请考虑以下代码段:
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();
*要获取指定的PSI元素所属的项目模块,请使用ModuleUtil.findModuleForPsiElement(psiElement)
方法.
访问模块根目录
可以通过类ModuleRootManager.java访问有关模块根的信息.
例如,以下代码段显示了如何访问模块的内容根:
VirtualFile[] contentRoots = ModuleRootManager.getInstance(module).getContentRoots();
检查属于模块源根目录
要检查虚拟文件或目录是否属于模块源根目录,请使用ProjectFileIndex.getSourceRootForFile
方法.
如果文件或目录不属于项目中任何模块的源根,则此方法返回null.
VirtualFile moduleSourceRoot = ProjectRootManager.getInstance(project).getFileIndex().getSourceRootForFile(virtualFileOrDirectory);
接收有关模块更改的通知
要接收有关模块更改的通知(要添加,删除或重命名的模块),
使用message bus和ProjectTopics.MODULES
主题:
project.getMessageBus().connect().subscribe(ProjectTopics.MODULES, new ModuleListener() {
@Override
public void moduleAdded(@NotNull Project project, @NotNull Module module) {
}
});