IDEA工程结构解析:项目、模块、库、Facet、Artifact (工件) 概念说明

对于有Java编码经验,刚刚使用IDEA的小伙伴们来说,我们必须了解:项目、模块、库、Facet、Artifact (工件) 这几个概念,我们可以在项目结构中看见关于他们的设置情况,如下图:

进入文件>项目结构

1 Project(项目)

Project 是 IDEA 的最高层级工作容器。

  • 一个 Project 内部可以包含一个或多个 Module(模块)。
  • 存储全局配置:JDK、全局依赖库、文件编码、文件模板、编译排除规则。
  • 磁盘对应一个文件夹,内部隐藏目录 .idea 保存全部项目级 IDE 配置。

约束:IDEA 同一窗口仅可打开一个 Project;如需处理多套独立代码,需在新窗口打开不同 Project。

业务示例:Burp 插件开发场景下,整个工作目录即为一个 Project,可仅维护单个业务模块。

2 Module(模块)

Module 是实际承载代码的执行单元,隶属于 Project。

  • 每个模块具备独立的源码目录、测试源码目录、编译输出目录 out;模块配置保存在 *.iml 文件。
  • 单个 Project 可容纳多个模块,模块可以存放在项目子目录或磁盘其他路径。
  • *.iml:模块专属配置文件,记录源码根路径、测试目录、依赖库列表、编译输出路径。

业务示例:将 burpsuite_pro.jar 设置为模块依赖,该配置写入模块 iml,仅对当前模块生效。

Project 与 Module 关系类比

  • Project:外层容器(仓库)
  • Module:容器内独立代码单元(仓库内存储箱)

绝大多数小型工程(Burp 插件)采用**:**1 个 Project,1 个 Module 的结构。

3 Libraries(库 / 依赖)

库由若干 jar 资源构成,提供外部已实现的类,供业务代码调用。分为三级作用域:

  1. Global Libraries 全局库:Project 全局可用,多个项目可复用。
  2. Project Libraries 项目库:仅当前 Project 下全部模块可用。
  3. Module Libraries 模块库:仅当前模块可见。

重要特性:库仅用于编译期引用;Artifact 打包默认不会将依赖库打入输出产物。 业务示例:Burp 插件开发,burpsuite_pro.jar 设置为模块库,解决接口类找不到编译报错;最终插件 jar 不需要打包该依赖,Burp 运行环境已内置对应 API。

4 Facet(面)

Facet 是附加在 Module 上的技术标记,用于告知 IDEA 当前模块使用的技术栈,开启对应 IDE 辅助能力。

  • Facet 依附于模块,单个模块可配置多个 Facet。
  • 常见 Facet:
    • Java:普通 Java 模块,启用 Java 编译能力。
    • Web:Web 工程,识别 web.xml,支持容器部署配置。
    • Spring / Hibernate:框架专属识别、配置文件提示。

业务示例:普通 Burp 插件模块自动配置 Java Facet,无需手动修改。

概念总结:Facet 是模块的功能开关,控制 IDEA 启用对应技术栈的解析与提示。

5 Artifact(工件)

Artifact 属于项目级配置,定义产物打包组装规则,存储路径:.idea/artifacts。

  • 输入来源:已经编译完成的 class 字节码、静态资源文件;Artifact 本身不执行 Java 源码编译。
  • 可自定义打包内容:选择包含 / 排除指定 class、配置 MANIFEST.MF 清单文件。
  • 输出产物支持:jar、war、解压目录。

业务示例:Burp 插件 Artifact 配置,仅选取业务 class,排除无关类,输出 jar 包供 Burp Extender 加载。

关键约束:源码修改后,必须先编译生成新的 class 文件,再执行构建工件;否则打包产物为旧字节码。在IDEA中可以像下图一样构建工件:

这里需要注意一下:

Build Project(构建项目):编译整个 Java 源码,生成.class字节码文件

Build Artifacts(构建工件):把编译好的 class、资源,打包成最终产物(jar/war/zip**)**

层级结构总览

复制代码
Project(项目,.idea文件夹)
├─ JDK、全局库、全局工程设置
└─ Module(模块,*.iml)
    ├─ Facet:标记模块技术栈类型
    ├─ Module Libraries:模块私有依赖库
    └─ src源码目录 → 编译输出 out/production/模块名/*.class

Project独立配置:Artifact工件
    └─ 读取out目录已编译字节码,组装输出jar/war最终产物

通俗类比

  • Project 项目:整套房屋
  • Module 模块:房屋内独立房间,存放业务代码,iml 为房间配置说明
  • Library 库:房间内外部工具包,编译可以引用,默认不跟随打包输出
  • Facet:房间用途标签,告诉 IDE 使用何种编译器、解析规则
  • Artifact 工件:打包方案,定义选取哪些物品组装成最终行李箱(jar 包)

实操流程

  1. 创建 Project,内部创建单个 Module 模块。
  2. Module 自动附加 Java Facet。
  3. 将 burpsuite_pro.jar 添加为模块库,消除接口类编译报错。
  4. 在 src 目录编写业务 Java 源码。
  5. 执行 Build Project(Ctrl+F9),源码编译为 class 输出到 out 目录。
  6. 配置 Artifact 工件,仅选择业务 class 作为打包输入。
  7. Build Artifacts,生成 jar。

常见踩点清单

  1. 修改源码后直接构建工件:不会自动编译源码,产物使用旧字节码,功能无更新。需要优先执行 Build Project。
  2. 依赖库添加到 Project 级别,但模块未引用:模块内代码依旧报类找不到。
  3. Artifact 为项目级配置,删除模块不会自动清理 Artifact,需要手动删除无效配置。
  4. *.iml 属于 IDE 本地配置,版本管理一般加入 .gitignore,不提交至仓库。
相关推荐
大侠归来1 小时前
Spring Boot 2.1 → 3.5 迁移推演:从实战出发的完整路线图
java·spring boot·后端
Wang's Blog1 小时前
Java 中间件之 RabbitMQ 快速入门: SpringAMQP 的 DirectExchange 路由模式
java·中间件·java-rabbitmq
Sweet锦1 小时前
jDCS 开源项目:面向工业现场的 Modbus RTU 数据采集基础框架
java·spring boot·物联网·开源
海马2 小时前
Spring Boot 开发知识整理
java·spring boot·后端
xiaolinudao1232 小时前
将多个 Excel 表格中的数据合并到单个表中|6 种实现方案全解析
java·前端·excel
谢亮_vipxieliang2 小时前
Spring Boot 3.x 从零开始——环境搭建与第一个 REST 项目
java·spring boot·后端
Wang's Blog2 小时前
Java 项目部署之 Docker工具快速入门: Docker 架构拆解:镜像、容器、守护进程与 Registry
java·docker·架构
栗子~~2 小时前
SpringCloud Gateway 基于 Nacos 实现动态路由
java·spring cloud·gateway
FYKJ_20102 小时前
django个性化新闻推荐35173-计算机课程设计、毕业设计
java·spring boot·后端·python·架构·django·课程设计