对于有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 资源构成,提供外部已实现的类,供业务代码调用。分为三级作用域:
- Global Libraries 全局库:Project 全局可用,多个项目可复用。
- Project Libraries 项目库:仅当前 Project 下全部模块可用。
- 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 包)
实操流程
- 创建 Project,内部创建单个 Module 模块。
- Module 自动附加 Java Facet。
- 将
burpsuite_pro.jar添加为模块库,消除接口类编译报错。 - 在 src 目录编写业务 Java 源码。
- 执行 Build Project(Ctrl+F9),源码编译为 class 输出到 out 目录。
- 配置 Artifact 工件,仅选择业务 class 作为打包输入。
- Build Artifacts,生成 jar。
常见踩点清单
- 修改源码后直接构建工件:不会自动编译源码,产物使用旧字节码,功能无更新。需要优先执行 Build Project。
- 依赖库添加到 Project 级别,但模块未引用:模块内代码依旧报类找不到。
- Artifact 为项目级配置,删除模块不会自动清理 Artifact,需要手动删除无效配置。
*.iml属于 IDE 本地配置,版本管理一般加入.gitignore,不提交至仓库。