原文鏈接:
http://www.jetbrains.org/intellij/sdk/docs/basics/project_structure.html
本節(jié)主要講述IntelliJ平臺 中項目及其相關的概念鸳吸,如模塊族檬、facet败徊、庫 和SDK。你可以使用項目結構和Java類來管理項目和模塊。
項目和它的組件
本節(jié)簡要討論了IDEA項目結構埠居、項目組件和相關術語。 有關項目及其組件的更多信息,請到IntelliJ IDEA Web幫助參閱Project靶病、Module、Library和Facet口予。
項目
在IntelliJ平臺 中娄周,一個項目 將所有的源代碼,庫和構建指令封裝到單個組織單元中沪停。你使用IntelliJ平臺 SDK所做的一切都是在項目的上下文中完成的煤辨。項目可以定義為相關模塊 和庫 的集合。根據項目的邏輯和功能要求木张,你可以創(chuàng)建單模塊 或多模塊 項目众辨。
模塊
模塊 是一個功能可以獨立運行,測試和調試的離散單元舷礼。 模塊包括如源代碼鹃彻,構建腳本,單元測試妻献,部署描述符等內容蛛株。在項目中,每個模塊可以使用指定SDK或繼承項目指定的SDK(查看本文SDK部分)育拨。一個模塊可以依賴項目中的其它模塊谨履。
庫
庫是指你的模塊所依賴的已編譯的文件(例如JAR文件)。 IntelliJ 平臺 支持三種類型的庫:
-
模塊庫:庫中的類僅在當前模塊可見熬丧,庫的信息記錄在模塊
.iml
文件中笋粟; -
項目庫:庫中的類僅在整個項目可見,庫的信息記錄在項目
.ipr
文件或.idea/libraries
文件夾中析蝴; -
全局庫:庫的信息記錄在
~/.IntelliJIdea/config/options
文件夾的applicationLibraries.xml
文件矗钟。全局庫與項目庫類似,但其在不同的項目中可見嫌变。
更多關于庫的信息吨艇,參考庫。
SDK
每個項目都要使用軟件開發(fā)工具包(SDK)腾啥。 對于Java項目东涡,SDK稱為JDK(Java開發(fā)工具包)冯吓。
SDK決定構建項目使用的API庫。如果你的項目是多模塊項目疮跑,項目中的所有模塊都默認使用項目SDK组贺。
當然,你也可以為每個模塊單獨配置SDK祖娘。
更多關于SDK的信息失尖,請到IntelliJ IDEA Web幫助參考配置全局、項目和模塊的SDK 渐苏。
Facet
Facet表示與模塊相關聯的特定框架/技術的配置掀潮。一個模塊可以有多個facet,例如Spring的特定配置存儲在Spring facet中琼富。
更多關于facet的信息仪吧,請到IntelliJ IDEA Web幫助查看Facet和Facet依賴。
項目結構
從插件開發(fā)者的角度來看鞠眉,一個項目可以看成下圖所示:
項目由一個或多個模塊組成薯鼠。每個模塊包括插件源代碼和order entries,即模塊使用的SDK 和庫械蹋。默認情況下出皇,所有模塊都使用項目SDK。 除此之外哗戈,一個模塊也可以設置多個facet恶迈。
本文檔解釋了如何使用API瀏覽和更改項目結構。
使用項目
本節(jié)介紹如何完成與項目管理相關的一些常見任務谱醇,討論那些可用于瀏覽和更改項目內容的Java類和接口暇仲。
如何使用項目文件?
IntelliJ平臺 將項目配置數據保存到XML文件中副渴。 這些文件取決于插件的項目格式奈附。
對于文件格式的項目,項目本身的核心信息(如組件模塊的位置煮剧、編譯設置等)保存在%project_name%.ipr
文件中斥滤。
項目所包含的模塊信息保存在%module_name%.iml
文件中。每個模塊都會創(chuàng)建此文件勉盅。
對于目錄格式的項目佑颇,項目和工作空間設置保存在%project_home_directory%/.idea
目錄下的一系列XML文件中。每個XML文件負責自己的一組設置草娜,并且可以通過文件名識別:projectCodeStyle.xml
, encodings.xml
, vcs.xml
等挑胸。
與文件格式的項目一樣,.iml
文件描述模塊信息宰闰。
要使用項目和項目文件茬贵,你可以使用以下類和接口:
-
Project
接口簿透; -
ProjectRootManager
抽象類; -
ProjectManager
抽象類解藻; -
ProjectFileIndex
接口老充。
注意:你不必直接訪問項目文件來加載或保存設置。 更多詳情請參閱持久化組件狀態(tài)螟左。在此之后啡浊,變量
project
均為Project
類型。例如在打開的項目中胶背,你可以從操作獲取它:Project project = e.getProject();
如何獲取項目中所有模塊的源代碼根目錄巷嚣?
使用ProjectRootManager.getContentSourceRoots()
方法。示例代碼如下:
String projectName = project.getName();
StringBuilder sourceRootsList = new StringBuilder();
VirtualFile[] vFiles = ProjectRootManager.getInstance(project).getContentSourceRoots();
for (VirtualFile file : vFiles) {
sourceRootsList.append(file.getUrl()).append("\n");
}
Messages.showInfoMessage("Source roots for the " + projectName + " plugin:\n" + sourceRootsList, "Project Properties");
如何檢查一個文件是否與項目有關奄妨?
IntelliJ平臺 提供了ProjectFileIndex
接口涂籽,你可以使用它驗證文件或文件夾是否與指定IDEA項目有關苹祟。本節(jié)解釋了如何使用此接口砸抛。
如何獲取ProjectFileIndex接口的實例?
使用ProjectRootManager.getFileIndex()
方法树枫。例如:
ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex()
直焙。
如何獲取文件所屬的模塊?
要確定指定虛擬文件屬于項目中的那個模塊砂轻,使用ProjectFileIndex.getModuleForFile(virtualFile)
方法:
Module module = ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(virtualFile);
注意:如果文件不屬于任何模塊奔誓,這個方法將返回
null
。
你也可以使用ProjectFileIndex.getContentRootForFile
方法獲取指定文件或文件夾所屬模塊內容的根目錄:
VirtualFile moduleContentRoot = ProjectRootManager.getInstance(project).getFileIndex().getContentRootForFile(virtualFileorDirectory);
如何獲取指定文件或文件夾所屬模塊源代碼根目錄或庫源代碼根目錄搔涝?
使用ProjectFileIndex.getSourceRootForFile
方法厨喂。例如:
VirtualFile moduleSourceRoot = ProjectRootManager.getInstance(project).getFileIndex().getSourceRootForFile(virtualFileorDirectory);
注意:如果文件或文件夾不屬于項目模塊中的源代碼目錄,這個方法將返回
null
庄呈。
我如何檢查一個文件或文件夾是否與項目的庫有關蜕煌?
ProjectFileIndex
接口有一系列的方法,你可以使用它們檢查指定文件是否屬于項目的庫诬留。
你可以使用以下方法:
-
ProjectFileIndex.isLibraryClassFile(virtualFile)
:如果指定virtualFile
是一個已編譯的類文件斜纪,此方法返回true
; -
ProjectFileIndex.isInLibraryClasses(virtualFileorDirectory)
:如果指定virtualFileorDirectory
屬于庫文兑,此方法返回true
盒刚; -
ProjectFileIndex.isInLibrarySource(virtualFileorDirectory)
:如果指定virtualFileorDirectory
屬于庫的源代碼,此方法返回true
绿贞。
如何獲取項目的SDK因块?
- 獲取項目級SDK:
Sdk projectSDK = ProjectRootManager.getInstance(project).getProjectSdk()
; - 獲取項目級SDK名稱:
String projectSDKName = ProjectRootManager.getInstance(project).getProjectSdkName()
籍铁。
如何設置項目的SDK贮聂?
- 設置項目級SDK:
ProjectRootManager.getInstance(project).setProjectSdk(Sdk jdk);
- 設置項目級SDK名稱:
ProjectRootManager.getInstance(project).setProjectSdkName(String name);
注意:默認情況下靠柑,項目模塊使用項目SDK,當然你也可以為每個模塊設置單獨的SDK吓懈。
使用模塊
IntelliJ平臺提供了一系列使用模塊的Java類和接口:
-
ModuleManager
抽象類歼冰; -
Module
接口; -
ModuleRootManager
抽象類耻警; -
ModuleRootModel
接口隔嫡; -
ModuleUtil
類; -
ModifiableModuleModel
接口甘穿; -
ModifiableRootModel
接口腮恩。
本節(jié)介紹如何完成與模塊管理相關的一些常見任務。
如何獲取項目包含的模塊列表温兼?
使用ModuleManager.getModules()
方法秸滴。
如何獲取模塊的依賴和classpath?
Order entries包括SDK募判、庫和模塊使用的其它模塊荡含。 你可以在項目結構 對話框的依賴選項卡查看模塊的order entries。
要瀏覽模塊依賴可以使用OrderEnumerator類届垫。
以下代碼片段展示了如何獲取模塊的classpath(所有依賴的類的跟目錄):
VirtualFile[] roots = ModuleRootManager.getInstance(module).orderEntries().classes().getRoots();
如何獲取模塊使用的SDK释液?
使用ModuleRootManager.getSdk()
方法。此方法返回的是Sdk類型装处。
以下代碼段展示了如何獲取指定模塊使用的SDK的詳細信息:
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
Sdk SDK = moduleRootManager.getSdk();
String jdkInfo = "Module: " + module.getName() + " SDK: " + SDK.getName() + " SDK version: "
+ SDK.getVersionString() + " SDK home directory: " + SDK.getHomePath();
如何獲取此模塊直接依賴的模塊列表误债?
使用ModuleRootManager.getDependencies()
方法獲取一個Module
類型的數組或使用ModuleRootManager.getDependencyModuleNames()
方法獲取一個模塊名數組,示例代碼如下:
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
Module[] dependentModules = moduleRootManager.getDependencies();
String[] dependentModulesNames = moduleRootManager.getDependencyModuleNames();
如何獲取依賴此模塊的模塊列表妄迁?
使用ModuleManager.getModuleDependentModules(module)
方法寝蹈。
你也可以使用ModuleManager.isModuleDependent
方法檢查一個模塊(module1)是否依賴于另一個指定模塊(module2) :
boolean isDependent = ModuleManager.getInstance(project).isModuleDependent(module1,module2);
如何獲取指定文件或PSI元素所屬的模塊?
-
獲取指定文件所屬的項目模塊登淘,請使用
ModuleUtil.findModuleForFile()
靜態(tài)方法箫老;
示例代碼如下:String pathToFile = "C:\\users\\firstName.LastName\\plugins\\myPlugin\src\MyAction.java"; VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByPath(pathToFile); Module module = ModuleUtil.findModuleForFile(virtualFile,myProject); String moduleName = module == null ? "Module not found" : module.getName();
獲取指定PSI元素 所屬的項目模塊,請使用
ModuleUtil.findModuleForPsiElement(psiElement)
方法形帮。
如何使用模塊中可用庫槽惫?
如何獲取模塊中可用庫的列表?
使用OrderEnumerator.forEachLibrary
方法獲取庫列表辩撑。示例代碼如下:
final List<String> libraryNames = new ArrayList<String>();
ModuleRootManager.getInstance(module).orderEntries().forEachLibrary(new Processor<Library>() {
@Override
public boolean process(Library library) {
libraryNames.add(library.getName());
return true;
}
});
Messages.showInfoMessage(StringUtil.join(libraryNames, "\n"), "Libraries in Module");
此示例代碼輸出module
模塊的庫列表界斜。
如何獲取庫的內容?
Library
類提供了getUrls
方法合冀,你可以使用它獲取源代碼根目錄和庫包含的類的列表各薇。示例代碼如下:
StringBuilder roots = new StringBuilder("The " + lib.getName() + " library includes:\n");
roots.append("Sources:\n");
for (String each : lib.getUrls(OrderRootType.SOURCES)) {
roots.append(each).append("\n");
}
roots.append"Classes:\n");
for (String each : lib.getUrls(OrderRootType.CLASSES)) {
strRoots.append(each).append("\n");
}
Messages.showInfoMessage(roots.toString(), "Library Info");
此示例代碼中,lib
為Library類型。
如何獲得模塊包含的facet峭判?
使用FacetManager和Facet類开缎。