这两个概念是 IntelliJ IDEA 的必懂知识点之一,请务必要学会。
如果你是 Eclipse 用户,并且已经看了上面给的链接,那 IntelliJ IDEA 首先告诉你一个非常重要的事情:IntelliJ IDEA 没有类似 Eclipse 工作空间(workspace
)的概念的。很多从 Eclipse 转过来的人总是下意识地要再同一个窗口管理 n 个项目,这在 IntelliJ IDEA 是无法得到。IntelliJ IDEA 提供的体验是:一个 Project 打开一个 Window 窗口。
对于 Project,IntelliJ IDEA 是这样解释的:
Whatever you do in IntelliJ IDEA, you do that in the context of a project. A project is an organizational unit that represents a complete software solution. It serves as a basis for coding assistance, bulk refactoring, coding style consistency, etc. Your finished product may be decomposed into a series of discrete, isolated modules, but it's a project definition that brings them together and ties them into a greater whole. Projects don't themselves contain development artifacts such as source code, build scripts, or documentation. They are the highest level of organization in the IDE, and they define project-wide settings as well as collections of what IntelliJ IDEA refers to as modules and libraries. 20170630 更新新地址:https://www.jetbrains.com/help/idea/about-projects.html
对于 Module,IntelliJ IDEA 是这样解释的:
A module is a discrete unit of functionality which you can compile, run, test and debug independently. Modules contain everything that is required for their specific tasks: source code, build scripts, unit tests, deployment descriptors, and documentation. However, modules exist and are functional only in the context of a project. Configuration information for a module is stored in a .iml module file. By default, such a file is located in the module's content root folder.Development teams, normally, share the .iml module files through version control. 20170630 更新新地址:https://www.jetbrains.com/help/idea/about-modules.html?search=About
通过上面的介绍我们知道,在 IntelliJ IDEA 中 Project
是最顶级的级别,次级别是 Module
。一个 Project
可以有多个 Module
。目前主流的大型项目结构都是类似这种多 Module
结构,这类项目一般是这样划分的,比如:core Module
、web Module
、plugin Module
、solr Module
等等,模块之间彼此可以相互依赖。通过这些 Module
的命名也可以看出,他们之间应该都是处于同一个项目业务情况下的模块,彼此之间是有不可分割的业务关系的。
所以我们现在总结:一个 Project
是由一个或多个 Module
组成,模块之间尽量是处在同一个项目业务的的情况下,彼此之间互相依赖关联。这里用的是 尽量,因为 IntelliJ IDEA 的 Project
是一个没有具备任何编码设置、构建等开发功能的,主要起到一个项目定义、范围约束、规范等类型的效果,也许我们可以简单地理解为就是一个单纯的目录,只是这个目录命名上必须有其代表性的意义。
下面我们以著名的 spring-framework
项目为例介绍多 Module
的结构的:
项目主页:https://github.com/spring-projects/spring-framework
Project
命名是:spring-framework
。该目录主要作用为各个 Module
的顶层目录进行约束,告诉协同者,这个目录下都是 spring-framework
相关的,我绝不会放 Android 相关源码、文档、文件在上面的。该目录并不是以一个实际性的目录来体现的,所以你访问主页是看不到的,但是当你 checkout
的时候,你必须为这个项目命名,至于命名默认就是 spring-framework
。Project
下有二十来个 Module
,各个 Module
的命名也是有含义的,比如:spring-core
、spring-jdbc
、spring-jms
、spring-orm
、spring-web
、spring-webmvc
等等,我们通过这些命名也能清楚地知道他们要表达的含义,这些 Module
下也都各自有 src
编码目录,可以自行编码和构建。Project 和 Module 介绍
Module
项目,小项目就无需搞得这么复杂。只有一个 Module
的结构 IntelliJ IDEA 也是支持的,并且 IntelliJ IDEA 创建项目的时候,默认就是单 Module
的结构的。Project name
的时候,Module name
和 Module file Location
自动进行改变,同时 Project location
和 Module file Location
完全一样,这也就表示,Project
目录和 Module
目录是同一个,所以此时 Project
目录下就会有 src
目录,但是我们应该明白其本质还是 Module
的目录。关于 IntelliJ IDEA 的 Project
和 Module
终于解释清楚了,但是由于 IntelliJ IDEA 官网上又有一段话对此解释得不够好,特别是对 Eclipse 用户来讲:https://www.jetbrains.com/idea/help/eclipse-faq.html,其中有这样两句话:
你可以把 IntelliJ IDEA 的 Project
当做 workspace
使用,IntelliJ IDEA 也是支持的,但是就像我们前面解释的那么那么多,这样是非常不符合其初衷的,所以请别把这段话当做教义去学习。对此 zeroturnaround 的大牛也有针对此进行了说明:https://www.jrebel.com/blog/intellij-idea-tutorial