谁再把 IDEA 的 Project 比作 Eclipse 的 Workspace,我就跟谁急
你好,我是 A 哥(YourBatman)。
有一个观点:若一个 Java 开发者能把 IDEA 玩得 666,则技术一定不会差;但若玩不转 IDEA(如不会设置、定制、解决日常问题、快捷键等等),那大概率水平很一般。因为高手一般得有高手的样子,你同意这个观点吗?
通过上篇文章 你也了解到,现今的 Javaer 绝大部分都使用 IntelliJ IDEA 作为 IDE 进行开发,但同时发现(从身边同事调查)大部分同学都并不能很好的使用 IDEA,其中表现最为突出的是 IDEA 里的 Project 和 Module 两个概念,混淆不清或者概念完全扭曲。
A 哥是一个相对来讲很注重基础知识搭建的 Javaer,所以对于最常用的工具也是如此,愿意花些时间去搞明白,包括页布局、功能定制、插件、以及快捷键都会调为自己最顺手的状态,毕竟工欲善其事,必先利其器。
本文将着眼于帮你深入的介绍 IntelliJ IDEA 里最重要的两个概念:Project 和 Module,它是最最最基础也是最重要的,我认为本文不仅适合使用 IDEA 的萌新,同样适合使用 IDEA 的“老手”(曾经 eclipse 的重度用户尤甚)。
本文提纲
版本约定
IntelliJ IDEA:2020.3.1
正文
IntelliJ IDEA 相较于 Eclipse 可谓是后起之秀,2006 年开始崭露头角,2012 年整体性能上完败 Eclipse,2016 年市场份额完成全面超越,一步步的逐渐成为 JVM 平台的主流 IDE。
正是由于有这样的历史进程,有大批“老”程序员是从 Eclipse 过度到 IDEA 来的,因此就有了一个颇具代表性的概念对比表格,方便“迁移”:
诚然,IntelliJ IDEA 的使用成本比 eclipse 略高,在那样的历史背景下,这张表格确实降低了“老”程序员们的迁移过度成本,即使现在看来这张表格的描述并不准确,设置具有极大的误导作用(副作用开始展现......)。
IDEA 和 eclipse 的概念类比上,最“著名”的当属把 IDEA 的 Project 比作 Eclipse 的 Workspace,回忆下你当初是不是经常听到这样的声音?博客文章这样说、培训机构老师这样说、甚至大学的老师也是教你这么去理解的。更有甚者,对于很多“中毒”很深的、曾经的 eclipse 用户来说,他们是这样使用 IDEA 的:
实现了所谓的:IDEA 在同一窗口显示多个项目。若你发现你身边有这么样管理项目的同事,那么他是你的“前辈”没跑了,因为铁定是 eclipse 的资深用户,然后迁移到 IDEA 来。
这种做法是错误的,毫不相干的项目(远程调用不叫有关系)没有理由放在同一视窗内,除了干扰还是干扰。Eclipse 里有 workspace 工作空间的概念尚可理解,可 IDEA 里是绝对不要这么做。
在 IntelliJ IDEA 中,没有类似于 Eclipse 工作空间(Workspace)的概念,而是提出了 Project 和 Module 这两个概念。本文来告诉你,IntelliJ IDEA 是如何管理项目 Project、模块 Module 以及它俩关系,看完之后你会发现单这一点 IntelliJ IDEA 就比 Eclipse 优秀得多。
Project 和 Module 概念
什么是 Project
Eclipse 中一个 Workspace 可以包括多个 Project,而在 IDEA 里 Project 是顶级概念。
Project(翻译为:项目)IntelliJ IDEA 的顶级组织单元,它是个逻辑概念。一般来说一个 Project 代表一个完整的解决方案,如它可包含多个部分,如:
源代码
构建脚本
配置文件
文档
SDK
依赖库
...
也就是说 Project 是个完整体,是个资源的集合,扔到任何地方都是可以被解释的。
说明:建议把 Project 翻译为项目,而非工程,不在一个维度。因为一个 module 其实也可以理解为一个工程,避免混淆
什么是 Module
模块是是项目 Project 的一部分,必须隶属于 Project 而存在。它可以独立编译、测试、运行甚至部署。
模块是分而治之思想的体现,是降低大型项目复杂度的一种有效手段。模块是可重用的,若需要,一个模块可以被多个模块引用,甚至多个 Project 项目引用(比如 commons 模块)。
此处强烈不再建议你把 Eclipse 的 Workspace 引入进来做类比,那只会把你带跑偏了。细品这两个概念定义,总结一下:
在 IDEA 中,Project 项目是最顶级的结构单元,一个 IDEA 视窗有且只能代表一个 Project
1. 现在知道为何把 user、account、order 扔到一个视窗里有多么的不合适了吧
一个 Project 由一个 or 多个 Module 模块组成,对于大型项目来讲一般会有 N 多个 module 组成,如 dubbo 项目结构如下图所示:
一个 module 模块里,依旧可以有子模块,曾经可无限延伸(但不建议太多)
Project 是个逻辑概念,Module 才是最终的存在形式
错误使用
优点:
一个窗口,能看见全貌
弊端:
视窗功能不单一。account、order、user 属于不同项目,是为了解决不同问题而存在,没有理由放在一起
干扰性太强。比如他们三都有类叫
ProcessService
,那么在你查找的时候永远无法“精确定位”
额外性能开销。比如你只想开发 user,但还得把其它的加载进来,完全没有必要嘛。
1. 说明:idea 不能像 eclipse 一样 close project 的,毕竟人家那是 workspace 的概念,而 idea 同一视窗属于同一项目,总不能说关闭某个模块吧,模块一般相关性很强,完全没必要单独开/关
2. 想一想,若你一个人负责了 20+个项目,每次打开是不是得花上个几分钟呢?
概念上混乱。这么放在一起,其实就不是 user 项目、order 项目了,而是 user 模块、order 模块,很明显概念上就不准确了
正确使用
这种使用方式界面清爽,运行流畅,解决了上面错误方式的所有弊端。
新建项目 Project
万丈高楼平地起,使用 IDEA 的第一步一定是新建一个项目 Project:
或者你也可以在视窗内部新建,顶部菜单栏File -> New -> 三选一
:
三种创建方式:
创建一个全新项目
打开现有项目
从 VCS 版本控制系统里 clone 一个项目
本文就以 1 为例,因为 2 和 3 从本质上讲都叫打开项目,并不会经历创建流程。下面我们按步骤走一篇创建流程:
第一步:选择创建项目的方式,本文选择创建创建 Java 项目
第二步:选择根据模版创建项目。这个在 maven 还没出现之前挺有用,现在几乎不用了,因此一般都不勾选
第三步:填写项目名、项目位置(以及同步创建的模块名、位置等,可选)
①:项目存储位置,一般作为整个项目的根目录
②:内容根目录
③:模块文件存放的目录
④:项目格式文件(IDEA 负责识别,后面它还会出镜)
More Setttings
选项默认是收起状态,也就是说大多数情况下创建时你并不需要修改同步创建的模块的这些信息,而实际上也确实是这么干的。
点击 Finish,IDEA 100%就会在新窗口(或者覆盖本窗口)打开新创建的这个项目:
该项目在硬盘里的表现形式仅仅是一个文件目录而已:
.idea 文件夹的作用
每个 Project 项目都对应 1 个 .idea 文件夹(隐藏目录),该项目所有特定设置都存储在该.idea 文件夹下,比如项目模块信息、依赖信息等等。
一般来讲它里面会有这些文件/目录:
misc.xml
:描述该项目一些混杂信息,如 SDK、语言等级、项目输出的目录等等modules.xml
:描述该项目有哪些 Module 模块workspace.xml
:描述视窗的信息。如 Project 窗口在左边还是右边,窗体大小,颜色,是否隐藏,滚动情况等等(每个 Project 都允许你个性化配置,规则都被记录在这个文件里)vcs.xml
:使用的 VCS 工具信息,如 Git
除了这些,一些插件也经常会往这个目录增加文件,如:
saveactions_settings.xml
:saveaction 插件的专属配置文件jarRepositories.xml
:远程仓库配置文件encodings.xml
:描述模块文件夹编码信息的配置文件compiler.xml
:描述每个 module 模块使用的编译器信息的文件。如使用 1.8 编译,是否加了编译参数-parameters
等等都在这里体现
总的来讲,这个文件夹里面的东西不用关心,由 IDEA/插件自己自动维护,我们只需要界面化操作即可。当然喽,若了解一二对于定位一些常见问题(如不知-parameters
是否生效)是有帮助的。
新建模块 Module
创建好一个 Project 默认会有一个同名的的 module(Empty Project 除外),如果项目比较小复杂度较低,一个模块足矣。但是,稍微有点复杂性的项目一般都希望进行模块拆分,建立多个模块,分而治之。比如:
hello-service:实现核心业务功能处理
hello-persistence:复杂持久化工作
hello-client:作为客户端暴露出去
第一步:顶部菜单栏给该项目创建模块
当然还有一种方式是在Project Structure
里创建(这个咱们下篇文章再聊):
第二步:选择该模块类型,可以是 Java 项目、maven 项目、Kotlin 项目等等都行
第三步:给模块命名,并制定该 module 模块的存在位置。一般来讲只需要写名称即可,模块的路径默认会放在 project 目录的子目录下
关于目录选择再强调一遍:默认情况下模块路径会在 Project(或者父模块)的子目录下,但这并不是必须的,你也可以改为和 Project 的同级目录也是可以的,逻辑上依旧属于 Project 的模块,不会有问题。但一般建议保持这种层级关系而不要修改~
若是父子目录,层级关系更明显些,否则是一种 plat 平铺目录关系,看着会不太“舒服”
点击 Finish,在 Project 视窗就可以看见该模块啦(层级结构展示哦):
这个时候的 Project - Module 层级结构图是这样子的:
这时我就抛出一个问题,若要实现下图这种层次结构(plat 全部平级),新建模块时需要注意些什么呢?
模块创建好后,这时再看看.idea
这个文件夹里的modules.xml
,内容为:
xxx.iml 文件的作用
每个 Module 模块都对应一个同名的 .iml 文件,用于描述该模块的相关信息。如:SDK、语言等级、依赖、源代码所在位置、输出路径等等。
总结
本文主题是介绍 IDEA 的 Project 和 Module 两个重要概念,然后再通过具体示例的方式加深理解,讲的还是比较清楚的(可能是全网最清楚的?),希望可以帮助到你加深对 IDEA 的理解,再也不要把 IDEA 的 Project 比作 Eclipse 的 Workspace。
简单总结一下本文内容:
Project 是一个不具备任何编码设置、构建等开发功能的概念,主要作用就是起到一个项目定义、范围约束的效果(比如 user 项目,里面所有内容应该是为了解决 user 问题而存在的),你也可以理解它就是一个目录,然后这个目录的名字就代表项目名
Module 模块是代码的实际表现形式。在默认情况下,一个 Project 对应一个 Module,它俩“合二为一”,对于中大型项目来说,一般都会使用多模块编程
下篇预告:在 IDEA 中,对项目结构Project Structure
的设置尤为重要,下篇就为你剖析该页面每个 tab 选项,到底如何玩转它,具备一个高手的样子,这对你理解 Maven 项目也将非常非常有帮助,敬请关注
本文思考题
本文所属专栏:IDEA,后台回复专栏名即可获取全部内容,已被https://www.yourbatman.cn收录。
看完了不一定懂,看懂了不一定会。来,文末 3 个思考题帮你复盘:
IDEA 的 Project 和 eclipse 的 workspace 的本质区别在哪里?
如何给 Project/module 单独添加依赖库?
IDEA 模块的.iml 文件有什么作用?
推荐阅读
作者简介:A 哥(YourBatman),Spring Framework/Boot 开源贡献者,Java 架构师,领域专家,DDD 驱动设计。非常注重基本功修养,底层基础决定上层建筑,才能焕发程序员更强生命力。擅长结构化拆解专题,抽丝剥茧颇具深度。这些专题也许可能大概是全网最好或独一份哦,欢迎自取。
版权声明: 本文为 InfoQ 作者【YourBatman】的原创文章。
原文链接:【http://xie.infoq.cn/article/781d1adccc1120761040681d4】。文章转载请联系作者。
评论