- IntelliJ IDEA 對其他 IDE 轉過來的用戶有特別優(yōu)待,對其專門整理了非常棒的資料,還請其他 IDE 過來的用戶抽時間查看,會有很大幫助:
- Eclipse 用戶可以看:https://www.jetbrains.com/idea/help/eclipse.html
- NetBeans 用戶可以看:https://www.jetbrains.com/idea/help/netbeans.html
這兩個概念是 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.
通過上面的介紹我們知道,在 IntelliJ IDEA 中 Project 是最頂級的級別,次級別是 Module。一個 Project 可以有多個 Module。目前主流的大型項目結構都是類似這種多 Module 結構,這類項目一般是這樣劃分的,比如:core Module、web Module、plugin Module、solr Module 等等,模塊之間彼此可以相互依賴。通過這些 Module 的命名也可以看出,他們之間應該都是處于同一個項目業(yè)務情況下的模塊,彼此之間是有不可分割的業(yè)務關系的。
所以我們現(xiàn)在總結:一個 Project
是由一個或多個 Module
組成,模塊之間盡量是處在同一個項目業(yè)務的的情況下,彼此之間互相依賴關聯(lián)。這里用的是 盡量
,因為 IntelliJ IDEA 的 Project 是一個沒有具備任何編碼設置、構建等開發(fā)功能的,主要起到一個項目定義、范圍約束、規(guī)范等類型的效果,也許我們可以簡單地理解為就是一個單純的目錄,只是這個目錄命名上必須有其代表性的意義。
下面我們以著名的 spring-framework
項目為例介紹多 Module 的結構的:
- 項目主頁:https://github.com/spring-projects/spring-framework:
- 該項目的
Project
命名是:spring-framework。該目錄主要作用為各個Module
的頂層目錄進行約束,告訴協(xié)同者,這個目錄下都是spring-framework
相關的,我絕不會放 Android 相關源碼、文檔、文件在上面的。該目錄并不是以一個實際性的目錄來體現(xiàn)的,所以你訪問主頁是看不到的,但是當你checkout
的時候,你必須為這個項目命名,至于命名默認就是spring-framework
。- 該
Project
下有二十來個Module
,各個Module
的命名也是有含義的,比如:spring-core
、spring-jdbc
、spring-jms
、spring-orm
、spring-web
、spring-webmvc
等等,我們通過這些命名也能清楚地知道他們要表達的含義,這些 Module 下也都各自有src
編碼目錄,可以自行編碼和構建。
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/images/xiv-a-project-and-module-introduce-1.gif" alt="Project 和 Module 介紹" />
- 相比較于多 Module 項目,小項目就無需搞得這么復雜。只有一個 Module 的結構 IntelliJ IDEA 也是支持的,并且 IntelliJ IDEA 創(chuàng)建項目的時候,默認就是單 Module 的結構的。
- 如上圖 Gif 圖演示,在輸入
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,其中有這樣兩句話:
- An Eclipse workspace is similar to a project in IntelliJ IDEA
- An Eclipse project maps to a module in IntelliJ IDEA
你可以把 IntelliJ IDEA 的 Project
當做 workspace
使用,IntelliJ IDEA 也是支持的,但是就像我們前面解釋的那么那么多,這樣是非常不符合其初衷的,所以請別把這段話當做教義去學習。對此 zeroturnaround 的大牛也有針對此進行了說明:http://zeroturnaround.com/rebellabs/getting-started-with-intellij-idea-as-an-eclipse-user/3/
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/images/xiv-b-sdk-introduce-1.jpg" alt="SDK 介紹" />
- 按
Ctrl + Shift + Alt + S
彈出項目結構設置區(qū),如上圖所示。- 如上圖標注 1 所示,IntelliJ IDEA 支持 6 種 SDK。最常用的就是
JDK
和Android SDK
,其中在創(chuàng)建Android SDK
的時候如果你沒有先配置一個JDK
的話,IntelliJ IDEA 則會提示你要先配置一個JDK
,然后才能配置Android SDK
。- 如上圖標注 2 所示,下拉會展示已經創(chuàng)建的所有 SDK,可以很方便地不同 SDK 中切換。在開發(fā) Java 項目過程中,由于 IntelliJ IDEA 支持管理多個
JDK
,所以你完全不用擔心你系統(tǒng)上不同項目需要不同JDK
。
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/images/xiv-b-sdk-introduce-2.jpg" alt="SDK 介紹" />
- 如上圖標注 1 所示,
SDKs
為 SDK 的統(tǒng)一管理處。- 如上圖標注 2 所示,加號可以添加新 SDK,支持的類型如標注 3 所示;減號可以刪除光標所選的 SDK。
- 官網介紹:https://www.jetbrains.com/idea/help/sdk.html
其他 IDE 沒有看到類似 language level
的設置,所以這個功能應該算是 IntelliJ IDEA 特有的,可是 IntelliJ IDEA 官網也沒有專門介紹 language level
的地方,也許 IntelliJ IDEA 認為這個知識點屬于 JDK 范疇所以沒加以介紹吧。所以這里主要我對此的一些理解。我們應該知道 Java JDK 在每個新版本都會有其新特性,而新版本一般也會向下兼容舊版本的特性,IntelliJ IDEA 是對這些 JDK 的新特性是這樣介紹的:
- JDK 6 的新特性:@Override in interfaces
- JDK 7 的新特性:Diamonds,ARM,multi-catch etc.
- JDK 8 的新特性:Lambdas,type annotation etc.
- JDK 9 的新特性:Jigsaw project etc.
etc. == et cetera == and so on == 等等
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/images/xiv-c-language-level-introduce-1.jpg" alt="language level 介紹" />
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/images/xiv-c-language-level-introduce-2.jpg" alt="language level 介紹" />
- 如上第一張圖標注 1,使用的是 JDK 7,顯示的
SDK default
為7 - Diamonds,ARM,multi-catch etc.
- 如上第二張圖標注 1,使用的是 JDK 8,顯示的
SDK default
為8 - Lambdas,type annotation etc.
當我們使用 JDK 8 的時候,我們只能向下兼容 JDK 8 及其以下的特性,所以只能選擇 8 及其以下的 language level
。所以當我們項目使用的是 JDK 8,但是代碼卻沒有使用 JDK 8 的新特性,最多使用了 JDK 7 的特性的時候我們可以選擇 7 - Diamonds,ARM,multi-catch etc.
。
對此我們總結 language level
:限定項目編譯檢查時最低要求的 JDK 特性。
現(xiàn)在假設我們有一個項目代碼使用的 JDK 8 新特性:lambda
語法,但是 JDK 選擇的卻是 JDK 7,即使 language level
選擇了 8 - Lambdas,type annotation etc.
,也是沒有多大意義的,一樣會編譯報錯。
對于大型項目,各個 Module 用到的 SDK
和 language level
很有可能是各不一樣的,IntelliJ IDEA 對此也進行了支持。
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/images/xiv-d-module-setting-1.jpg" alt="Module 下的 SDK 和 language level" />
- 如上圖標注 1 所示,可以針對 Module 選擇其他 SDK,默認選擇的是
Project SDK
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/images/xiv-d-module-setting-2.jpg" alt="Module 下的 SDK 和 language level" />
- 如上圖標注 1 所示,可以針對 Module 選擇其他
language level
,默認選擇的是Project language level