- 库是模块所依赖的已编译代码(例如 JAR 文件)的存档。IntelliJ 平台支持三种类型的库:1、Module Library:库类只在本模块可见,库信息记录在模块.iml文件中。
- 2、Project Library:库类在项目中可见,库信息记录在.idea/libraries目录下或项目.ipr文件中。
- 3、Global Library:库类信息记录在$USER_HOME$ /.IntelliJIdea /config /options目录下的applicationLibraries.xml文件中,全局库类似于项目库。
-
一、Library
- 所有与Library相关的API全在com.intellij.openapi.roots.libraries包中。
-
访问Library和 Jar
- 例代码输出给定模块所依赖的库列表
-
final List<String> libraryNames = new ArrayList<String>(); ModuleRootManager.getInstance(module).orderEntries().forEachLibrary(library -> { libraryNames.add(library.getName()); return true; }); Messages.showInfoMessage(StringUtil.join(libraryNames, "\n"), "Libraries in Module");
获取所有库的列表
要管理应用程序和项目库的列表, Appliecation级库表列表通过调用访问LibraryTablesRegistrar.getLibraryTable()获取,而Project级库表列表通过调用访问LibraryTablesRegistrar.getLibraryTable(Project)获取。这两个方法会返回一个名为LibraryTable的对象,可以调用LibraryTable.getLibraries()来获取其中的库。- 要获取给定模块中定义的所有模块库的列表,可以使用工具类OrderEntryUtil:
-
-
OrderEntryUtil.getModuleLibraries(ModuleRootManager.getInstance(module));
获取库中依赖的jar文件内容
-
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)) { roots.append(each).append("\n"); } Messages.showInfoMessage(roots.toString(), "Library Info");
创建库
-
要创建库,请执行以下步骤:
-
1、获取写操作
-
-
-
- 例代码输出给定模块所依赖的库列表
2、获取要添加库的库表。根据Library级别,使用以下其中一项:
LibraryTablesRegistrar.getInstance().getLibraryTable()
//project级别
LibraryTablesRegistrar.getInstance().getLibraryTable(Project)
//application级别
ModuleRootManager.getInstance(module).getModifiableModel().getModuleLibraryTable()
3、通过调用创建库LibraryTable.createLibrary()
-
4、将内容添加到库中,对于模块级别,可以使用工具类ModuleRootModificationUtil类把内容添加到库中
-
5、对于模块级库,提交由ModuleRootManager.getInstance(module).getModifiableModel()返回的可修改模型。
-
添加内容或修改库
-
要添加或更改库的根目录,您需要执行以下步骤:
-
-
1、获取写操作
-
2、获取库的可修改模型,使用
Library.getModifiableModel()
-
3、使用诸如
Library.ModifiableModel.addRoot()
执行必要更改的方法 -
4、使用
Library.ModifiableModel.commit()
提交模型。对于模块级库,提交由ModuleRootManager.getInstance(module).getModifiableModel()
返回的可修改模型。 -
-
添加依赖库到Module
-
可使用ModuleRootModificationUtil.addDependency(Module, Library)方法。
-
检查文件是否属于Library
ProjectFileIndex接口实现了许多方法,可以使用它们来检查指定文件是否属于项目库类或库源。您可以使用以下方法: -
//要检查指定的虚拟文件是否是已编译的类文件 ProjectFileIndex.isLibraryClassFile(virtualFile) //检查指定的虚拟文件或目录是否属于库类 ProjectFileIndex.isInLibraryClasses(virtualFileorDirectory) //检查指定的虚拟文件或目录是否属于库源 ProjectFileIndex.isInLibrarySource(virtualFileorDirectory)
二、示例代码
-
获取当前选的类存放在哪个Library中。
-
-
plugin.xml
-
<action id="ProjectModel.LibrariesAction" class="org.intellij.sdk.project.model.LibrariesAction" text="Libraries for File" description="Illustrates accessing libraries" icon="SdkIcons.Sdk_default_icon"> <add-to-group group-id="EditorPopupMenu" anchor="last"/> </action>
java实现
-
-
public class LibrariesAction extends AnAction { @Override public void update(@NotNull final AnActionEvent event) { Project project = event.getProject(); if (project == null) { return; } Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); if (element instanceof PsiClass) { PsiFile psiFile = ((PsiClass) element).getContainingFile(); if (psiFile == null) { return; } VirtualFile virtualFile = psiFile.getVirtualFile(); if (virtualFile == null) { return; } event.getPresentation().setEnabledAndVisible(true); } } @Override public void actionPerformed(@NotNull AnActionEvent event) { Project project = event.getProject(); if (project == null) { return; } Navigatable element = event.getData(CommonDataKeys.NAVIGATABLE); if (element instanceof PsiClass) { PsiFile psiFile = ((PsiClass) element).getContainingFile(); if (psiFile == null) { return; } VirtualFile virtualFile = psiFile.getVirtualFile(); if (virtualFile == null) { return; } final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); StringBuilder jars = new StringBuilder(); for (OrderEntry orderEntry : fileIndex.getOrderEntriesForFile(virtualFile)) { if (orderEntry instanceof LibraryOrderEntry) { final LibraryOrderEntry libraryEntry = (LibraryOrderEntry) orderEntry; final Library library = libraryEntry.getLibrary(); if (library == null) { continue; } VirtualFile[] files = library.getFiles(OrderRootType.CLASSES); if (files.length == 0) { continue; } for (VirtualFile jar : files) { jars.append(jar.getName()).append(", "); } } } String fileAndLibs; if (jars.length() > 0) { fileAndLibs = virtualFile.getName() + ": " + jars.toString(); } else { fileAndLibs = "None"; } Messages.showInfoMessage("Libraries for file: " + fileAndLibs, "Libraries Info"); } } }
运行效果
-
-