idea 同时打开多个maven project(父子结构 multi-module 项目)

1. 打开多个 Maven Project

🧩 一、同一个 Window 中打开多个 Maven Project(推荐做法)

适合 父子依赖多模块协同开发 场景。

✅ 使用方式

  1. 打开父工程(包含 pom.xml 的根项目)。

  2. IDEA 会自动识别并导入所有子模块(<modules> 定义的)。

  3. 如果你想再添加一个外部的 Maven 项目

    • 打开 View → Tool Windows → Maven
    • 点击 “+” 号 → 选择另一个 pom.xml
    • 选择 “Import as module”(导入为模块)而不是新建窗口。

这样,IDEA 会把它挂载到同一个 Project 下的模块树中,
所有依赖都能联动(IDEA 会识别本地模块依赖,不走远程仓库)。

⚙️ 优点

  • 统一代码索引、跳转、搜索、重构;
  • 本地模块依赖可直接使用(IDEA 会自动替换 jar 为模块);
  • Maven 生命周期统一执行(父项目一键 build 全部模块)。

🚪二、在不同 Window 中打开多个 Maven Project

适合完全独立的项目(没有父子关系)。

✅ 使用方式

  1. 打开第一个项目;

  2. 再打开第二个 pom.xml 时选择:

    New Window

  3. IDEA 会创建新的 IDE 窗口,各项目相互独立。

⚙️ 优点

  • 各项目互不影响(环境变量、JDK、Maven 配置独立);
  • 对大型项目或版本冲突隔离更好。

⚠️ 缺点

  • 不能直接使用 module dependency(需要通过仓库安装或手动依赖);
  • 无法跨项目跳转源码。

💡实战建议

场景 推荐方式 备注
父子模块项目(例如:commonwebservice 同窗口打开(Import as module) IDEA 会识别多模块依赖
多个独立系统(不同 repo) 分窗口打开 各自独立运行、调试
临时调试另一个项目库(只引用 jar) 分窗口打开 不污染主项目依赖
共用底层库但不同项目 同窗口 + “Import Maven Project” 本地调试方便

2. Q

Q:

同窗口打开父子模块项目(例如:common → web → service),这个时候修改web工程源码,common会读取新修改的值吗?还是说common读取的是依赖jar中的数据?

简短结论先说在前面:

如果 commonwebservice 都在同一个 IntelliJ IDEA 项目窗口中(以 Module 方式导入),
那么它们之间的依赖是“源码级联动”,而不是依赖 jar 包。

也就是说:修改 common 源码后,webservice 立即感知到更新,无需重新打包 jar。


🔍 一、IDEA 多模块依赖的工作机制

1️⃣ Maven 层面

webpom.xml 中,你通常写的是:

<dependency>
    <groupId>cn.fancylab</groupId>
    <artifactId>common</artifactId>
    <version>1.0.0</version>
</dependency>

在纯命令行 Maven 下(独立项目时),Maven 会:

  • 到本地仓库(~/.m2/repository)找 common-1.0.0.jar
  • 没有就去远程仓库下载。

但在 IDEA 多模块项目中,情况不同👇


2️⃣ IDEA 层面

IDEA 在导入父项目时会识别到:

<modules>
  <module>common</module>
  <module>web</module>
  <module>service</module>
</modules>

它会自动在项目结构中建立 Module → Module 依赖:

web depends on common (module dependency, not jar dependency)”

于是:

  • web 编译时直接引用 common源码输出目录(target/classes)
  • 无需 install
  • common 改动后重新编译即可立即生效。

⚙️ 二、IDEA 内部处理逻辑

当你保存或编译项目时(Build → Make Project 或自动编译):

  1. IDEA 先编译依赖模块(common);
  2. 将最新 .class 放入其 target/classes
  3. web 编译时直接从 target/classes 读取;
  4. 运行 web 时加载的就是最新 common 字节码。

🔁 三、对比不同场景

场景 是否源码联动 是否需要 install
同窗口打开(Import as Module) ✅ 是 ❌ 否
不同窗口独立项目 ❌ 否(依赖 jar) ✅ 需要 install
命令行 Maven 编译 ❌ 否 ✅ 需要 install
单独调试 common ✅(同窗口) ❌ 否

💡 四、实战建议

  1. 父子项目务必放在同一个 IDEA window 下(尤其是开发阶段)。
    IDEA 会自动创建源码依赖,体验最顺畅。

  2. 仅在发布前执行一次 mvn install,将 common 安装到仓库中供 CI/CD 或其他独立项目使用。

  3. 若发现修改 common 不生效:

    • 检查是否在同一个 window;
    • 检查 IDEA Project Structure → Modules → Dependencies,确保 commonModule 而非 Jar
    • 执行一次 “Rebuild Project”。

🧭 举例说明

假设结构如下:

parent/
├── pom.xml
├── common/
│   └── pom.xml
├── service/
│   └── pom.xml
└── web/
    └── pom.xml

当你修改:

// common/src/main/java/cn/fancylab/util/StringUtil.java
public static String hello() {
    return "Hello FancyLab!";
}

然后在 web 里调用:

System.out.println(StringUtil.hello());

直接运行 web 工程,IDEA 会自动重新编译 common,输出最新字符串。
无需打包、无需 install。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容