IDEA插件开发--持久化配置信息方案
这里写自定义目录标题
- 配置信息持久化存储
- 保存配置文件的方式
- 每种方式的实现方案
- 1.PropertiesComponent:
- 2.PersistentStateComponent:
- 3.Project Settings:
- 4.外部文件:
- 5.数据库:
- 6.加密数据:
- 7,自定义配置文件格式:
- 配置文件的位置
- 项目级配置(存储在.idea文件夹下):
- 全局配置(存储在用户主目录下的全局配置文件中):
- 不同位置的实现
- 项目级配置信息(.idea 文件夹下):
- 自定义文件格式:
配置信息持久化存储
在 IntelliJ IDEA 中,PropertiesComponent 用于保存插件的持久性配置数据,并将这些数据存储在配置文件中。具体来说,PropertiesComponent 的数据存储在以下位置:
对于全局配置数据,数据将保存在 IDEA 的配置文件中。这些配置文件通常位于 IDEA 的系统目录中,其具体位置取决于你的操作系统。在 Windows 上,它通常位于 %USERPROFILE%.IntelliJIdea\config 目录下,而在 macOS 上,它通常位于 ~/Library/Application Support/JetBrains 目录下。对于项目特定的配置数据,数据将保存在项目的 .idea 目录下,通常存储在 .idea/workspace.xml 文件中。
PropertiesComponent 使用一个简单的键-值存储系统,允许插件将配置数据与唯一的键相关联。这些数据可以包括用户首选项、插件配置、窗口布局信息等。这是一个方便的方式来保存插件所需的配置信息,而不需要编写复杂的文件读写逻辑。
请注意,由于这些数据存储在 IDEA 的配置文件中,因此它们可能会在 IDEA 更新或配置更改时受到影响。在大多数情况下,这是适当的,因为它允许在多台计算机上共享相同的配置。但也要记住,这些数据不适合存储大量或敏感的信息,因为它们通常可以被用户访问和编辑。如果你需要更安全的数据存储方式,可以考虑使用加密或其他机制来保护数据。
保存配置文件的方式
在 IntelliJ IDEA 插件开发中,你可以使用不同的方式来保存配置文件和数据。以下是一些常用的方式:
- PropertiesComponent:com.intellij.ide.util.PropertiesComponent 允许你轻松地存储简单的键-值对数据,这些数据将被保存在 IDEA 的配置文件中。这适用于保存插件的持久性配置数据,例如用户首选项和设置。
- PersistentStateComponent:com.intellij.openapi.components.PersistentStateComponent 接口允许你定义一个组件,用于保存和加载插件的持久性配置数据。这提供了更高级的方式来管理配置数据,包括支持自定义数据类型。
- PluginSettings:通过 com.intellij.ide.util.PropertiesComponent 存储的配置数据可以被存储在 config 目录中。你可以使用 com.intellij.ide.plugins.PluginManager 获取插件配置目录并创建文件来保存配置数据。
- Project Settings:对于项目特定的配置数据,你可以使用项目文件 .idea 中的 XML 文件来存储配置。这通常包括存储插件的项目级配置数据。
- 外部文件:你还可以选择将配置数据存储在项目目录之外的外部文件中,例如 JSON 文件、XML 文件或 properties 文件。这些文件可以由插件进行读取和写入。数据库:如果你需要持久性的数据存储,可以将配置数据存储在数据库中,如 SQLite、H2 等。这通常用于插件需要处理大量数据或需要跨项目共享数据的情况。
- 加密数据:如果配置数据包含敏感信息,你可以选择加密数据,然后将加密后的数据保存在其中一个上述的方式中。
- 自定义配置文件格式:你可以创建自定义的配置文件格式,以满足你的插件需求。这可能涉及创建和解析 XML、JSON、YAML 或其他格式的文件。
选择哪种方式取决于你的插件需求和数据的复杂性。在大多数情况下,PropertiesComponent 和 PersistentStateComponent 是常用的方式,因为它们提供了简单的方法来存储和检索配置数据,而无需手动处理文件和目录结构。如果你的插件需要更高级的数据管理或自定义文件格式,可以考虑其他方式。
每种方式的实现方案
不同的方式需要不同的代码实现。以下是每种方式的代码实现示例:
1.PropertiesComponent:
存储配置数据:
PropertiesComponent.getInstance().setValue("myPluginSetting", "someValue");
获取配置数据:
String value = PropertiesComponent.getInstance().getValue("myPluginSetting");
2.PersistentStateComponent:
创建一个实现 PersistentStateComponent 接口的类,并实现 getState() 和 loadState() 方法来保存和加载配置数据。
public class MyPluginState implements PersistentStateComponent<MyPluginState> {private String mySetting = "default";@Nullable@Overridepublic MyPluginState getState() {return this;}@Overridepublic void loadState(MyPluginState state) {// Load the statemySetting = state.mySetting;}// Accessor methods for your configuration datapublic String getMySetting() {return mySetting;}public void setMySetting(String value) {mySetting = value;}
}
3.Project Settings:
在 .idea 目录下的 XML 文件中添加项目特定的配置数据,然后通过相应的 API 访问这些数据。
4.外部文件:
你可以使用 Java 的文件操作 API 来创建、读取和写入外部文件,如 JSON、XML 或 properties 文件。
// 读取外部文件
File configFile = new File("myPluginConfig.json");
if (configFile.exists()) {// 读取配置数据并解析
}
// 写入外部文件
// 创建文件并写入配置数据
5.数据库:
使用 JDBC 或其他数据库访问方法来连接和操作数据库,将数据存储在数据库表中。
// 使用 JDBC 连接数据库
Connection connection = DriverManager.getConnection("jdbc:sqlite:mydatabase.db");// 创建表和插入数据
// 查询数据
// 更新和删除数据
6.加密数据:
如果需要加密数据,你可以使用 Java 的加密库(例如,Bouncy Castle)来加密和解密数据,然后将加密后的数据存储在其中一个方式中。
// 加密数据
byte[] encryptedData = encryptData(dataToEncrypt, encryptionKey);// 解密数据
byte[] decryptedData = decryptData(encryptedData, decryptionKey);
7,自定义配置文件格式:
如果你选择创建自定义的配置文件格式,你需要编写代码来生成和解析该文件格式。这可能涉及使用 XML、JSON、YAML 等库来处理数据的序列化和反序列化。
请注意,以上示例只是基本示例,具体实现取决于你的插件的需求和数据的复杂性。确保根据你的需求来选择合适的方式,并实施相应的代码逻辑来保存和读取配置数据。
配置文件的位置
在 IntelliJ IDEA 插件开发中,配置信息的存储位置取决于配置信息的范围和用途。通常,以下情况下会将配置信息存储在 .idea 文件夹下(项目级配置),而其他情况则会存储在全局配置中:
项目级配置(存储在.idea文件夹下):
- 项目特定的配置信息:包括项目级插件配置、项目文件、工作区设置、模块配置等。这些配置信息与特定的项目相关,不会影响其他项目。
- 版本控制配置:包括 VCS(版本控制系统)配置文件,如.gitignore,.gitattributes,.hgignore等。这些文件用于控制版本控制行为,通常是项目特定的。
- Run Configuration 和 Debug Configuration:项目中的运行配置和调试配置通常存储在项目的 .idea 文件夹中。
- 项目的工具窗口布局和状态:例如,工具窗口的打开和关闭状态、分割窗格的布局信息等。
全局配置(存储在用户主目录下的全局配置文件中):
- IDE 设置:包括全局 IDE 设置,如编辑器选项、主题、快捷键设置、插件配置等。这些设置适用于整个 IntelliJ IDEA 应用程序,而不仅限于特定项目。
- 插件全局配置:有些插件需要在全局配置中存储信息,以便在所有项目中共享。这通常包括插件的全局设置和配置。
- 插件状态信息:有些插件可能需要在全局配置中存储状态信息,以便在不同项目中共享数据。
- 全局工具窗口布局和状态:例如,工具窗口的打开和关闭状态、分割窗格的布局信息等,适用于整个 IDE。
- 用户首选项:包括用户自定义的首选项设置,如字体、主题、代码样式等。
总之,配置信息会存储在.idea文件夹下主要是项目特定的配置信息,而存储在全局配置中的信息适用于整个 IntelliJ IDEA 应用程序。插件的配置和状态信息通常存储在全局配置中,但也可以根据插件的需求选择存储在项目级配置中。这有助于区分项目特定和全局的配置数据。
不同位置的实现
在 IntelliJ IDEA 插件开发中,存储配置信息到不同的位置需要根据你的需求和数据的范围来进行不同的操作。以下是一些示例代码,演示如何将配置信息存储到不同的位置:
项目级配置信息(.idea 文件夹下):
// 保存配置到项目级配置文件中
String configValue = "projectConfigValue";
PropertiesComponent.getInstance(project).setValue("myProjectSetting", configValue);
这里的 project 是当前项目的引用。
全局配置信息:
// 保存配置到全局配置
String configValue = "globalConfigValue";
PropertiesComponent.getInstance().setValue("myGlobalSetting", configValue);
注意,这里没有指定项目,因此配置信息将存储在全局配置中。
版本控制配置文件:
如果你需要存储配置信息在版本控制配置文件中,你可以通过 VCS 插件提供的 API 来操作。这通常涉及读写相应的配置文件(如 .gitignore 或 .hgignore)。
自定义文件格式:
如果你需要存储配置信息在自定义文件格式中,你可以使用 Java 的文件操作 API 来创建、读取和写入文件。例如,如果你想使用 JSON 文件来存储配置:
String configValue = "customConfigValue";
File configFile = new File("config.json");
try {FileWriter writer = new FileWriter(configFile);writer.write("{\"myConfigKey\":\"" + configValue + "\"}");writer.close();
} catch (IOException e) {e.printStackTrace();
}
这些示例演示了如何将配置信息存储到不同的位置,但具体实现会根据你的需求和数据的复杂性而有所不同。确保选择适当的位置,并根据需要实施相应的代码逻辑。
相关文章:
IDEA插件开发--持久化配置信息方案
这里写自定义目录标题 配置信息持久化存储保存配置文件的方式每种方式的实现方案1.PropertiesComponent:2.PersistentStateComponent:3.Project Settings:4.外部文件: 5.数据库:6.加密数据:7,自定义配置文件…...

Vscode禁止插件自动更新
由于电脑的vscode版本不是很新。2022.10月份的版本1.7.2,电脑vscode的python插件装的也是2022年4月份的某个版本,但插件经常自动更新,导致python代码无法Debug,解决办法: 点设置,搜autoUpdate, 把红色框选成无...
Zookeeper篇---第六篇
系列文章目录 文章目录 系列文章目录一、请简述Zookeeper的选主流程二、为什么Zookeeper集群的数目,一般为奇数个?三、知道Zookeeper监听器的原理吗?一、请简述Zookeeper的选主流程 Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做…...
mysql数据库存储过程之游标(光标cursor)
游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、open、fetch和close。 一、语法。 #声明游标 declare 游标名称 cursor for 查询语句; #开启游标 open 游标名称; #获取游标记录 fetch 游标…...

「帝国风暴兵」加入 The Sandbox,推出真实的全新人物化身系列和体验!
我们很高兴宣布与流行文化中最具标志性的娱乐品牌 Shepperton 设计工作室的「帝国风暴兵」达成合作伙伴关系。这一合作标志着该科幻品牌首次进入元宇宙,让风暴兵的粉丝们以全新的方式体验「帝国风暴兵」。 在这个体验中,玩家将置身于帝国风暴兵的营地&am…...

asp.net员工管理系统VS开发sqlserver数据库web结构c#编程包括出差、请假、考勤
一、源码特点 asp.net员工管理系统是一套完善的web设计管理系统(主要包括出差、请假、考勤基础业务管理),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010 ,数据库为sqlserver2008&a…...

C++套接字库sockpp介绍
sockpp是一个开源、简单、现代的C套接字库,地址为:https://github.com/fpagliughi/sockpp,最新发布版本为0.8.1,license为BSD-3-Clause。目前支持Linux、Windows、Mac上的IPv4、IPv6和Unix域套接字。其它*nix和POSIX系统只需很少的…...
Mac M2开发环境安装
持续更新 brew 安装 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"JAVA多版本环境 ## 终端下载安装 brew install --cask temurin8 brew install --cask temurin11 brew install --cask temurin17## vim ~/.…...

Linux各种版本安装详细步骤和root密码破解
文章目录 VMware新建虚拟机硬件设置设置虚拟网络挂载ISO文件 root密码破解 VMware新建虚拟机 硬件设置 设置虚拟网络 编辑>虚拟网络编辑器>VMnet8(NAT模式) 挂载ISO文件 加电>开启次虚拟机 第二项可以检查挂载上来的iso文件是否完整没有破坏 磁盘分区 选自定义分…...

Netty - 回顾Netty高性能原理和框架架构解析
文章目录 概述JDK 原生 NIO 程序的问题Why Netty使用场景Related ProjectsNetty 高性能设计I/O 模型【阻塞 I/O】:【I/O 复用模型】【基于 Buffer】 线程模型事件驱动模型Reactor 线程模型Netty的线程模型异步处理 Netty框架的架构设计功能特性模块组件Bootstrap、S…...

uni-app——項目day01
配置uni-app開發環境 uni-app快速上手 | uni-app官网 创建项目 图中四个划线就是要配置的地方. 选择vue2还是vue3看个人选择。 目录结构 但是现在新版本创建的项目已经没有components目录了,需要自己创建。 项目运行到微信开发者工具 使用git管理项目 node-mod…...
【Java、MongoDB】程序控制非关系数据库
步骤: (1)连接 连接字符串 (2)CRUD 类与接口 解析 (3)maven管理方法 依赖 <dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-legacy<…...

MySQL查询时间处理相关函数与方法实践笔记
1. 实践案例 在查询mysql数据库获取数据时,有这样一个需求:按每30分钟分组获取电量数据,形成1天48个数据点。 方法一: select hour(a.CreateTime) 时点,case when MINUTE(a.CreateTime)<30 then 1 else 2 end 半小时,sum(a…...

springboot全局拦截sql异常
起因:非法用户可通过特定的输入(如输入内容超长)等操作,使后台逻辑发生错误,从而使后台sql语句暴露至前台,进而为sql攻击提供条件 处理流程:经查找com.mysql.cj.jdbc.exceptions的父类为SQLException,在全局异常处理类中增加如下配置,经测试不起作用 ExceptionHandler(SQLExce…...

AlGaN/GaN HFET 五参数模型
标题:A Five-Parameter Model of the AlGaN/GaN HFET 来源:IEEE TRANSACTIONS ON ELECTRON DEVICES(15年) 摘要—我们引入了AlGaN/GaN异质结场效应晶体管(HFET)漏极电流Id(Vgs,Vds…...

矩阵的除法
B/A 如果矩阵A可逆,那么 证明: A/AB 如果矩阵A和B都可逆,那么 证明:...

Java中的 向上转型 | 向下转型
目录 一.向上转型 直接赋值 总结: 通过传参 通过返回值 二.向下转型 instanceof 一.向上转型 向上转型其实就是创建一个子类对象,并将其当作父类对象来使用,一般语法格式如下: 父类类型 对象名 new 子类类型() 一般有以…...
【华为OD机试AB高分必刷题目】朋友圈(C++-并查集Union-Find实现)
🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试AB高分必刷题目】朋友圈(C++-并查集Union-Find实现)题目描述解题思路C++题解代码代码OJ评判结果代码讲解寄语【华为OD机试AB高分…...

前端面试题之vue篇
vue基础 vue的基本原理 当一个Vue实例创建时,Vue会遍历data中的属性,用Object.defineProperty(Vue使用proxy)转换为getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的watcher程序实例…...

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 垃圾回收定位清除算法 JVM中的垃圾回收器
前言 JVM作为Java进阶的知识,是需要Java程序员不断深度和理解的。 本篇博客介绍JVM的内存模型,对比了1.7和1.8的内存模型的变化;介绍了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾清…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...