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,不提交至仓库。
相关推荐
步行cgn7 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ8 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog8 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老8 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang8 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库
鱼宵9 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21
学长毕设9 小时前
基于SpringBoot的餐厅管理系统-附源码
java·spring boot·后端
刚入门的大一新生9 小时前
Linux-线程互斥
java·开发语言
赵小哥要冲啦10 小时前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai10 小时前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉