項目結構

原文鏈接:
http://www.jetbrains.org/intellij/sdk/docs/basics/project_structure.html

本節(jié)主要講述IntelliJ平臺 中項目及其相關的概念鸳吸,如模塊族檬、facet败徊、SDK。你可以使用項目結構和Java類來管理項目和模塊。

項目和它的組件

本節(jié)簡要討論了IDEA項目結構埠居、項目組件和相關術語。 有關項目及其組件的更多信息,請到IntelliJ IDEA Web幫助參閱Project靶病、ModuleLibraryFacet口予。

項目

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幫助查看FacetFacet依賴

項目結構

從插件開發(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文件描述模塊信息宰闰。

要使用項目和項目文件茬贵,你可以使用以下類和接口:

注意:你不必直接訪問項目文件來加載或保存設置。 更多詳情請參閱持久化組件狀態(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類和接口:

本節(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");

此示例代碼中,libLibrary類型。

如何獲得模塊包含的facet峭判?

使用FacetManagerFacet類开缎。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市林螃,隨后出現的幾起案子奕删,更是在濱河造成了極大的恐慌,老刑警劉巖疗认,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件完残,死亡現場離奇詭異,居然都是意外死亡横漏,警方通過查閱死者的電腦和手機谨设,發(fā)現死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缎浇,“玉大人扎拣,你說我怎么就攤上這事∷囟澹” “怎么了二蓝?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亡笑。 經常有香客問我侣夷,道長横朋,這世上最難降的妖魔是什么仑乌? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮琴锭,結果婚禮上晰甚,老公的妹妹穿的比我還像新娘。我一直安慰自己决帖,他們只是感情好厕九,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著地回,像睡著了一般扁远。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刻像,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天畅买,我揣著相機與錄音,去河邊找鬼细睡。 笑死谷羞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的溜徙。 我是一名探鬼主播湃缎,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼犀填,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗓违?” 一聲冷哼從身側響起九巡,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹂季,沒想到半個月后比庄,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡乏盐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年佳窑,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片父能。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡神凑,死狀恐怖,靈堂內的尸體忽然破棺而出何吝,到底是詐尸還是另有隱情溉委,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布爱榕,位于F島的核電站瓣喊,受9級特大地震影響,放射性物質發(fā)生泄漏黔酥。R本人自食惡果不足惜藻三,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跪者。 院中可真熱鬧棵帽,春花似錦、人聲如沸渣玲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忘衍。三九已至逾苫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枚钓,已是汗流浹背铅搓。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秘噪,地道東北人狸吞。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹋偏。 傳聞我的和親對象是個殘疾皇子便斥,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容