idea插件开发-Library

news2024/11/26 16:43:40
  •         库是模块所依赖的已编译代码(例如 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");
            }
          }
        
        }

        运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scrapy框架 增量式、分布式爬虫

文章目录 Scrapy框架1.增量爬虫2.分布式爬虫 Scrapy框架 1.增量爬虫 实现思路 利用redis集合数据类型 1.获取到url后进行判断 是否重复&#xff1f;&#xff1f;&#xff1f; 2.第一次爬取到数据&#xff0c;爬取完成写入该记录... &#xff08;两个点: 必须要没有爬过的数据…

chatgpt赋能python:Python实现计算器:从入门到实现

Python实现计算器&#xff1a;从入门到实现 计算器是计算机科学中最基础并且实用的东西之一。Python作为一种高级编程语言&#xff0c;它可以用于编写一个功能完整的计算器。在本文中&#xff0c;我们将介绍Python如何实现一个简单的、交互式的计算器&#xff0c;通过使用基本…

【MySQL 数据库】7、SQL 优化

目录 一、插入数据优化(1) insert 语句① 批量插入数据② 手动控制事务③ 主键顺序插入&#xff0c;性能要高于乱序插入 (2) load 大批量插入数据【☆❀ 二、主键优化(1) 数据组织形式(2) 页分裂(3) 页合并(4) 主键设计原则 三、orber by 优化四、group by 优化五、limit 优化&…

chatgpt赋能python:Python怎么五个一行输出?

Python怎么五个一行输出&#xff1f; 在Python中&#xff0c;实现五个一行输出并不难&#xff0c;只需要使用循环语句即可。下面&#xff0c;我们将介绍如何使用Python实现五个一行输出。 实现方法 首先&#xff0c;我们需要定义一个包含一定数量元素的列表或字符串。然后&a…

chatgpt赋能python:Python中如何生成随机浮点数?

Python中如何生成随机浮点数&#xff1f; 随机数在计算机编程中常常使用&#xff0c;而在Python中&#xff0c;我们可以使用内置的random模块来产生随机数。不同于整数随机数&#xff0c;如果想要产生浮点数的随机数&#xff0c;我们就需要进行一些额外的操作。 产生浮点数类…

Baumer工业相机堡盟工业相机如何使用BGAPISDK控制相机数据流的开启和关闭(C++)

Baumer工业相机堡盟工业相机如何使用BGAPISDK控制相机数据流的开启和关闭&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPI SDK的技术背景Baumer工业相机使用BGAPISDK控制相机数据流的方式1.引用合适的类文件2.使用BGAPISDK控制相机数据流的方式2.使用BGAPISDK控制…

Pascal Voc 2007 2012

1、简介 PASCAL 全称&#xff1a;Pattern Analysis, Statical Modeling and Computational Learning PASCAL VOC&#xff08;The PASCAL Visual Object Classes &#xff09;是一个经典的计算机视觉数据集&#xff0c;由牛津大学、马里兰大学和微软剑桥研究院的研究人员创建的…

HiveSQL初级题目

文章目录 Hive SQL题库(初级)第一章 环境准备1.1 建表语句1.2 数据准备1.3 插入数据 第二章 简单查询2.1 查找特定条件2.1.1 查询姓名中带“冰”的学生名单2.1.2 查询姓“王”老师的个数2.1.3 检索课程编号为“04”且分数小于60的学生的课程信息&#xff0c;结果按分数降序排列…

chatgpt赋能python:Python如何保存文件到文件夹?

Python如何保存文件到文件夹&#xff1f; Python是一种高级编程语言&#xff0c;广泛应用于数据科学、网络编程、自动化任务等领域。其中&#xff0c;保存文件到文件夹是Python编程中的重要功能。本文将介绍Python如何保存文件到文件夹的方法&#xff0c;包括如何创建文件夹和…

动态网站JSP技术

文章目录 零、本节学习目标一、JSP概述&#xff08;一&#xff09;什么是JSP1、JSP的概念2、JSP的特征&#xff08;二&#xff09;编写第一个JSP1、创建Web项目2、修改Artifact名称&#xff0c;重新部署项目3、创建欢迎JSP页面4、启动服务器&#xff0c;查看结果 二、JSP基本语…

chatgpt赋能python:Python怎么产生方波?

Python怎么产生方波&#xff1f; 随着科技的发展&#xff0c;数字信号处理在各个领域都有广泛的应用&#xff0c;产生方波是其中一个基础的信号处理技术。在Python中&#xff0c;可以通过一些简单的代码来产生方波信号。本文将介绍如何使用Python产生方波。 什么是方波信号&a…

牛客小白赛复盘] 牛客小白月赛74

[牛客小白赛复盘] 牛客小白月赛74 总结A 简单的整除1. 题目描述2. 思路分析3. 代码实现 B 整数划分1. 题目描述2. 思路分析3. 代码实现 C 传送阵1. 题目描述2. 思路分析3. 代码实现 D 修改后的和1. 题目描述2. 思路分析3. 代码实现 E 幼稚园的树21. 题目描述2. 思路分析3. 代码…

一分钟学一个 Linux 命令 - tar

前言 大家好&#xff0c;我是 god23bin。今天给大家带来的是 Linux 命令系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天&#xff0c;我们要介绍的是一个常用且强大的命令&#xff1a;tar。 什么是 tar 命令&#xff1f; tar 是 tape archive…

C语言经典题目(三)

C站的小伙伴们&#xff0c;大家好呀&#xff01;&#x1f60a;&#x1f60a;✨✨这一篇是C语言之经典题目篇&#xff0c;除程序设计&#xff0c;还有一些不错的程序分析&#xff0c;快来和我一起进入C语言的世界吧&#xff01;✨✨✨ &#x1f495;C语言其他刷题篇在这里哦&…

【Python程序设计】——重点题目(期末不挂科)

课本&#xff1a; 目录 &#x1f552; 1. 控制结构&#x1f552; 2. 数据类型&#x1f552; 3. 函数&#x1f552; 4. 文件操作&#x1f552; 5. 面向对象&#x1f552; 6. Excel操作&#x1f552; 7. 实验课题目合集&#x1f552; 8. 思政题 &#x1f552; 1. 控制结构 【例…

chatgpt赋能python:Python怎么二次安装?

Python怎么二次安装&#xff1f; 介绍 Python作为一种广泛应用的编程语言&#xff0c;其安装也是极其简单。只需要在Python官网上下载对应版本的安装包&#xff0c;并按照提示进行安装即可。但是&#xff0c;如果你需要二次安装Python&#xff0c;比如更新到新的版本或者将Py…

百度、头条、360、搜狗下拉拓词及长尾关键词挖掘-批量多线程

百度、头条、360、搜狗下拉拓词及长尾关键词挖掘软件介绍&#xff1a; 1、在如今竞争激烈的互联网时代&#xff0c;作为SEO站长&#xff0c;我们都知道一个事实&#xff1a;流量就是金钱&#xff01;而要想在海量信息中脱颖而出&#xff0c;我们需要借助一些强大的工具来帮助我…

OpenMMLab-AI实战营第二期——4-1.目标检测与MMDetection

文章目录 1. 目标检测的基本范式1.0-1 目标检测简介1.0-2 基本概念1.1 滑窗1.1.1 滑窗基本思想1.1.2 滑窗效率问题改进1.1.3 感受野计算 1.2-1 使用卷积实现密集预测1.2.1 在特征图上进行密集预测1.2.2 边界框回归1.2.3 非极大值抑制&#xff08;Non-Maximum Suppression&#…

chatgpt赋能python:Python入门:如何下载和安装JupyterNotebook

Python入门&#xff1a;如何下载和安装Jupyter Notebook Jupyter Notebook是Python编程必备的工具之一&#xff0c;它可以帮助你快速地编写和测试Python代码。在这篇文章中&#xff0c;我们将向你展示如何下载和安装Jupyter Notebook。如果你是一名Python入门者&#xff0c;这…

神经网络:CNN中的filter,kernel_size,strides,padding对输出形状的影响

输入数据在经过卷积层后&#xff0c;形状一般会发生改变&#xff0c;而形状的变化往往与以下四个超参数有关。 1&#xff0c;filter&#xff08;out_channel&#xff09; 该超参数控制着输入数据经过卷积层中需要与几个卷积核进行运算&#xff0c;而输入数据与每个卷积核进行…