模块(Module)

走着路睡觉大约 3 分钟

模块(Module)

模块(Module) 里包含源码,构建脚本,单元测试,开发内容描述等。

模块(Module) 关键组件如下:

  • Content roots模块(Module) 的根目录。每个根目录只归属于一个模块;多模块之间不能共享根目录

  • Source rootsContent roots下面会有多个source roots ,例如,java源码的source roots$Content roots$/src/main/javaresourcessource roots$Content roots$/src/main/resourcessource 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 的依赖列表,可以使用 OrderEnumeratoropen in new window

// 获取 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>
上次编辑于:
贡献者: zhaojingbo
Loading...