阅读(2210) (12)

IntelliJ IDEA使用模块依赖关系

2017-10-11 14:11:24 更新

IntelliJ IDEA 模块依赖关系

IntelliJ IDEA 模块依赖是模块使用的东西。

模块依赖关系可能包括:

  • 一个 SDK,如果在模块依赖关系中存在,则被称为模块 SDK。
  • 库:存档(JAR)的集合以及具有类文件,源和文档的目录。
  • 属于同一项目的其他模块。

编译或运行代码时,使用模块依赖关系来形成编译器或 JVM 的类路径。(如果有,本机库位置将被添加到 java.library.path 而不是类路径中。)

IntelliJ IDEA 管理模块依赖关系

与使用模块依赖关系相关的大部分任务都在“项目结构”对话框(文件| 项目结构(File | Project Structure))中执行:选择模块,选择感兴趣的模块,然后选择依赖关系。

IntelliJ IDEA 管理模块依赖关系


使用以下图标和上下文菜单命令:

  • (Alt+Insert)和 (Alt+Delete)来添加和删除依赖关系。请参阅添加依赖关系。
  • (Alt+Up)和 (Alt+Down)来重新排序项目。(当列表排序时,不能对项目重新排序)
  •  编辑库。
  • 导航(Navigate)(F4)切换到所选依赖关系的配置,以查看其设置和内容。
  • 查找使用实例(Find Usages)(Alt+F7)以找出所选项目所用的模块。
  • 移动到项目库,移动到全局库,将选定的模块库移动到项目或全局级别。
  • 复制到模块库,以便在模块级别创建所选项目或全局库的副本。
IntelliJ IDEA 管理模块依赖关系

添加依赖关系

在依赖关系列表的旁边,点击并选择:

  • 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 依赖,
产生范围
编译编译编译
编译测试测试
测试编译测试
测试测试测试