鍍金池/ 教程/ C++/ IntelliJ IDEA 項目相關的幾個重要概念介紹
介紹
IntelliJ IDEA 界面介紹
最特殊的快捷鍵 Alt + Enter 介紹
IntelliJ IDEA 配合 Maven 的一些技巧
文件代碼模板的使用
常見文件類型的圖標介紹
IntelliJ IDEA 推薦設置講解
Maven 項目介紹
IntelliJ IDEA 相關核心文件和目錄介紹
Debug 介紹
IntelliJ IDEA 常用設置講解 - 2
IntelliJ IDEA 插件開發(fā)視頻教程
IntelliJ IDEA 緩存和索引介紹和清理方法
IntelliJ IDEA 主題、字體、編輯區(qū)主題、文件編碼修改、亂碼問題
Maven 的單模塊 Spring Boot 項目
IntelliJ IDEA 遠程調試 Tomcat
插件的使用
IntelliJ IDEA 編譯方式介紹
IntelliJ IDEA For Mac 快捷鍵
IntelliJ IDEA 常用設置講解 - 1
首次運行
Ubuntu 系統(tǒng)下安裝 IntelliJ IDEA
數(shù)據(jù)庫管理工具介紹
重構講解
從 Windows 過度到 Mac 必備快捷鍵對照表
Windows 系統(tǒng)下安裝 IntelliJ IDEA
Maven 的單模塊 / 多模塊之 Spring MVC + Spring + Spring Data JPA 項目
版本控制的使用
IntelliJ IDEA 的 Java 熱部署插件 JRebel 安裝及使用
IntelliJ IDEA 常用設置講解 - 3
Emmet 的使用
Postfix Completion 的使用
Mac 系統(tǒng)下安裝 IntelliJ IDEA
本系列教程結束
實時代碼模板的使用
快捷鍵
IntelliJ IDEA 項目相關的幾個重要概念介紹
安裝總結
Maven 的單模塊 / 多模塊之 Spring MVC + Spring + Mybatis 項目講解
關于
Eclipse 的 Java Web 項目環(huán)境搭建
IntelliJ IDEA 常用設置講解 - 4
Hello World 項目創(chuàng)建與項目配置文件介紹

IntelliJ IDEA 項目相關的幾個重要概念介紹

必備材料介紹

  • IntelliJ IDEA 對其他 IDE 轉過來的用戶有特別優(yōu)待,對其專門整理了非常棒的資料,還請其他 IDE 過來的用戶抽時間查看,會有很大幫助:

Project 和 Module 介紹

這兩個概念是 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.

對于 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-ormspring-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 nameModule file Location 自動進行改變,同時 Project locationModule 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/

SDK(Software Development Kit) 介紹

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。最常用的就是 JDKAndroid 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

language level 介紹

其他 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 default7 - Diamonds,ARM,multi-catch etc.
  • 如上第二張圖標注 1,使用的是 JDK 8,顯示的 SDK default8 - 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

對于大型項目,各個 Module 用到的 SDKlanguage 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