idea插件开发-Library

  •         库是模块所依赖的已编译代码(例如 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 libraryNames = new ArrayList();
        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

        •     
                
              

          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");
            }
          }
        
        }

        运行效果

      • idea插件开发-Library_第1张图片

你可能感兴趣的:(Idea插件开发,intellij-idea,java,ide)