IntelliJ IDEA使用模块依赖关系
IntelliJ IDEA 模块依赖关系
IntelliJ IDEA 模块依赖是模块使用的东西。
模块依赖关系可能包括:
- 一个 SDK,如果在模块依赖关系中存在,则被称为模块 SDK。
- 库:存档(JAR)的集合以及具有类文件,源和文档的目录。
- 属于同一项目的其他模块。
编译或运行代码时,使用模块依赖关系来形成编译器或 JVM 的类路径。(如果有,本机库位置将被添加到 java.library.path 而不是类路径中。)
IntelliJ IDEA 管理模块依赖关系
与使用模块依赖关系相关的大部分任务都在“项目结构”对话框(文件| 项目结构(File | Project Structure))中执行:选择模块,选择感兴趣的模块,然后选择依赖关系。
使用以下图标和上下文菜单命令:
- (Alt+Insert)和 (Alt+Delete)来添加和删除依赖关系。请参阅添加依赖关系。
- (Alt+Up)和 (Alt+Down)来重新排序项目。(当列表排序时,不能对项目重新排序)
- 编辑库。
- 导航(Navigate)(F4)切换到所选依赖关系的配置,以查看其设置和内容。
- 查找使用实例(Find Usages)(Alt+F7)以找出所选项目所用的模块。
- 移动到项目库,移动到全局库,将选定的模块库移动到项目或全局级别。
- 复制到模块库,以便在模块级别创建所选项目或全局库的副本。
添加依赖关系
在依赖关系列表的旁边,点击并选择:
- JAR 或目录。 在打开的对话框中,选择要添加到依赖关系的文件和文件夹。(对于每个选定的文件和文件夹,创建一个未命名的模块库。)
- 库。 在打开的对话框中,选择一个或多个库并单击添加所选项。(您也可以创建一个新的库:新建库,然后将其添加到依赖关系:添加所选项)。
- 模块依赖关系。 在打开的对话框中,选择要添加到依赖关系的模块。
另请参阅,将全局或项目库添加到模块依赖关系。
依赖关系列表进行排序
通过单击标题行中的单元格, 可以按它们的名称 (中心列) 和作用域对依赖项进行排序。
- 首次点击。该列表按升序顺序按相应列排序。排序标记出现在单元格中:。
- 第二次点击。列表更改为降序;排序标记更改为:。
- 第三次点击。恢复初始未排序状态。
在对列表进行排序时,不能更改依赖关系的顺序。
依赖关系的顺序
模块依赖关系按照它们在相应列表中的显示顺序进行处理。
在编译时,列表中的项目顺序定义了编译器(javac)查找类来解析相应引用的顺序。在运行时,此列表定义 JVM 搜索要加载的类的顺序。
使用库修补程序。如果要对某些库使用修补程序,则应将这些修补程序放在主库之前的列表中。否则,新版本的类(包含在修补程序中)将被忽略。
类路径,bootclasspath 和 JDK 位置。 对于编译,列表中与模块 JDK 相关的项的位置可能很重要:
- 在 JDK 之后出现的项目将转换为模块类路径项。你通常处理的大多数库都应该去那里。
- 在 JDK 之前出现的项目对应于模块 bootclasspath 条目。为了使编译成功,必须在模块 bootclasspath 中包含某些库 (例如, 与 JDK 本身及其扩展有关的程序)。所以,这样的库必须出现在 JDK 之前的列表中。但是,在非常有限的特殊情况下,可能需要使用这些库。因此,对于大多数模块,JDK 将(并且应该)成为依赖关系列表中的第一个项目。
控制源和测试的编译和运行时类路径
您可以在运行测试时指定是否应该包含依赖项 classpath 1)编译模块来源 2)编译模块测试源 3)运行编译源4)。您可以通过为依赖关系范围("依赖关系" 选项卡上的 "范围" 列)选择以下选项之一来执行此操作:
- 编译。依赖关系包含在编译和运行阶段的源和测试源的类路径中。
- 测试。依赖关系仅在编译和运行测试源时才包含在类路径中。
- 运行。只有运行源代码和测试源时,依赖关系才包含在类路径中。
- 提供。对于您的源,依赖关系仅在编译阶段包含在类路径中。当有容器时(例如 Web 容器),它在运行时提供相应的依赖关系。对于您的测试源,依赖关系在构建和运行阶段都包含在类路径中。正常情况下,应用程序服务器库包含在提供范围的依赖关系列表中。
下表总结了可能的依赖关系范围的类路径信息。
范围 | 来源, 编译时 | 来源, 运行时 | 测试, 编译时 | 测试, 运行时 |
编译 | + | + | + | + |
测试 | - | - | + | + |
运行 | - | + | - | + |
提供 | + | - | + | + |
处理测试源的依赖关系。 请注意,IntelliJ IDEA 与其他构建工具(例如 Gradle 和 Maven)的不同之处在于处理测试源的依赖关系。
如果您的模块(例如,模块 A)取决于另一个模块(模块 B),IntelliJ IDEA 假设 A 中的测试源不仅取决于 B 中的源,还取决于其测试源。因此,B 的测试源也包含在相应的类路径中。
将依赖关系导出到其他模块的编译类路径
您有一个模块(模块 A)取决于另一个模块(模块 B)。
在运行时,B 的所有依赖项都包含在 A 的类路径中。
对于 A 的编译类路径,对于 B 的每个依赖项有两个选择。(为了说明,我们假设 B 在依赖关系中有一个库 L)
- L 包含在 A 的类路径中,如果在 B 的依赖项中,它具有“导出”选项。
- 如果“导出”选项关闭,L不会包含在 A 的类路径中。
若要打开和关闭导出选项,请使用 "依赖关系" 选项卡上 "导出" 列中的复选框。
请注意,导出时依赖关系范围可能会更改。我们假设:
- A 对 B 的依赖的范围是编译。
- B 对 L 的依赖的范围是测试。
如果 L 具有导出选项,则 A 对 L 的依赖关系的范围将有效地被测试。
下表列出了这一情况以及其他一些有趣的实际案例。
A 对 B 依赖, 指定范围 | B 对 L 依赖, 指定范围 | A 对 L 依赖, 产生范围 |
编译 | 编译 | 编译 |
编译 | 测试 | 测试 |
测试 | 编译 | 测试 |
测试 | 测试 | 测试 |