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