-
基于DevEco Studio 4.0 Beta2,hvigorVersion为3.0.2,开发了一个项目,上传到了远程仓库,当同事下载后,却始终无法运行,频繁报错,由于API都是使用的9,第一感觉就是开发环境不同,于是,让其发来了他的开发环境,DevEco Studio 3.1.1 Release,hvigorVersion为2.4.2,果然是环境不同,那解决方式就简单了,要么升级IDE,要么hvigorVersion改为当前设备;升级IDE,确实可以解决,但不是最优之解,毕竟为了解决问题,就来一次升级,一是不方便,二是大多数开发者都喜欢稳定版,升级为Beta版,着实不愿;那就只能走第二种方式了,但偏偏第二种方式,始终解决不了,查官网,查社区,文档匮乏到简直没有。在Android Studio中,出现开发环境不同,无非就是更改build.gradle下gradle版本号和gradle-wrapper.properties文件里的版本号,便可轻松解决问题,但在DevEco Studio中,这种方式似乎难以走通,但是又不得不去解决,毕竟在很多的场合下,开发环境是很难达到统一的,比如你去下载一个三方库,想运行看看效果,有可能就会遇到开发环境不同,无法运行情况,所以,遇到问题,就要去解决问题,而不是逃避问题,只有这样方可柳暗花明,方可造福大众。经过半天的摸索,问题已经修复,虽然现在回首,感觉问题的解决方式很是简单,但是在无资料,错误提示不明的情况下,解决起来真的无从下手,好在最后没有白忙活一场,于是就总结了一下,如果你在开发HarmonyOS开发中也需要到了此类问题,希望能给你带来一丝帮助。一、低版本IDE导入高版本项目报错信息当你开发环境低于目标项目开发环境时,在导入项目后就会遇到如下的错误信息。给出了两种解决途径,一种是更改为本地的hvigorVersion,一种是升级IDE,当我们点击蓝色文字时,就会主动触发其解决方式,我们直接点击第一种。可以发现,在hvigor-config.json5文件中,已改为你设备的版本号。编译项目之后,你会发现,毛用没有,虽然没错误了,但是无法运行。二、文档匮乏,如何迎难而上遇到如上的问题,肯定是先去官网,社区摸索一通,但是,丝毫没有找到解决的方式,没办法,只能自己调研其解决方式,仿照着Android Studio类似的错误,来解决DevEco Studio,由于文件以及构建工具都发生了变化,最后也难以排查出根本问题所在,但是灵感却来了,既然IDE可以类比,那么项目同样可以类比。高版本和低版本,项目结构基本一样,既然无法运行,除了版本号不一致之外,肯定还有部分文件不一致,才导致了项目无法编译,基于这种猜想,针对高低版本两个项目所有的文件,采取了一一类比,经过验证,这种方式是可行的,但是是十分耗时的。
-
在 IntelliJ IDEA 的 Maven 插件中,Lifecycle(生命周期) 是 Maven 构建项目的核心流程,它由一系列有序的阶段(Phase)组成。每个阶段代表一个特定的构建步骤,执行时会按顺序运行该阶段及其之前的所有阶段。以下是 Maven 标准生命周期中常见阶段的详细说明:1. 生命周期阶段分类Maven 的生命周期分为 三套独立流程,每套流程包含不同的阶段:Clean Lifecycle(清理流程)用于清理项目生成的临时文件和输出目录(如 target/)。Default Lifecycle(默认流程)核心构建流程,涵盖编译、测试、打包、安装等步骤。Site Lifecycle(站点流程)生成项目文档和报告(如 API 文档、测试报告等)。2. 各阶段详细说明Clean Lifecycle(清理流程)阶段作用pre-clean清理前的预处理(极少使用)。clean删除 target/ 目录(包括编译生成的类文件、打包的 JAR/WAR 等)。post-clean清理后的收尾工作(极少使用)。示例命令:mvn clean # 仅执行清理 Default Lifecycle(默认流程)阶段作用validate验证项目配置是否正确(如检查 pom.xml 依赖是否有效)。compile编译项目的主源代码(src/main/java)到 target/classes/。test编译并运行单元测试(src/test/java),测试代码不会打包到最终产物中。package将编译后的代码打包成可分发格式(如 JAR、WAR),存放到 target/。verify运行集成测试或检查包的有效性(如通过 maven-surefire-plugin 验证)。install将包安装到本地 Maven 仓库(~/.m2/repository/),供其他项目依赖。deploy将包发布到远程仓库(如 Nexus、Artifactory),供团队共享。关键点:执行 package 时,会先执行 validate → compile → test → verify。install 和 deploy 会将包上传到仓库,但 install 是本地仓库,deploy 是远程仓库。示例命令:mvn compile # 仅编译主代码 mvn test # 编译并运行测试 mvn package # 编译、测试、打包 mvn install # 编译、测试、打包、安装到本地仓库 mvn deploy # 编译、测试、打包、发布到远程仓库 Site Lifecycle(站点流程)阶段作用pre-site生成站点前的预处理(极少使用)。site生成项目文档站点(HTML 格式),存放到 target/site/。post-site站点生成后的收尾工作(如压缩文档)。site-deploy将生成的站点部署到服务器(如通过 FTP 或 SSH 上传)。示例命令:mvn site # 生成项目文档 mvn site-deploy # 部署文档到服务器 3. 常见问题解答Q1:为什么执行 mvn package 时会自动运行测试?Maven 生命周期是阶段串联的,执行 package 会隐式触发其之前的所有阶段(包括 test)。如果需要跳过测试,可添加参数:mvn package -DskipTests # 跳过测试编译和运行 mvn package -Dmaven.test.skip=true # 完全跳过测试相关操作(更快) Q2:install 和 deploy 的区别?install:将包上传到本地仓库(~/.m2/repository/),仅当前机器可用。deploy:将包上传到远程仓库(如公司 Nexus 或 Maven Central),供团队其他成员下载。Q3:如何自定义生命周期行为?通过 Maven 插件(Plugin) 绑定到特定阶段。例如:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <executions> <execution> <phase>test</phase> <!-- 绑定到 test 阶段 --> <goals> <goal>test</goal> </goals> </execution> </executions> </plugin> 4. 总结图示Clean Lifecycle: pre-clean → clean → post-clean Default Lifecycle: validate → compile → test → package → verify → install → deploy Site Lifecycle: pre-site → site → post-site → site-deploy操作建议:在 IDEA 中右键点击 Maven 项目的 Lifecycle 节点,选择对应阶段即可执行。复杂构建可通过 mvn <phase1> <phase2> 组合命令(如 mvn clean install)。通过理解这些阶段,你可以更灵活地控制 Maven 的构建流程!
-
大家好,5月份的技术汇总贴它虽迟但到。本次带来了关于MYSQL,Linux,puthon,Java,Vue,GO语言,Android等等多方面知识,量大管饱,希望可以帮助到大家。1.Mysql之存储过程-转载https://bbs.huaweicloud.com/forum/thread-0290181146500803029-1-1.html2.Linux 指令初探:开启终端世界的大门-转载https://bbs.huaweicloud.com/forum/thread-0254181146580042030-1-1.html3.Flink 的 source、transformations、sink的详细示例-转载https://bbs.huaweicloud.com/forum/thread-0290181146683326030-1-1.html4.vue 实现纯 web H5 打印功能https://bbs.huaweicloud.com/forum/thread-0278181376093532038-1-1.html5.Java内存分析全面指南https://bbs.huaweicloud.com/forum/thread-0221182242802337058-1-1.html6.Go语言中获取函数实体的四种方法小结【转】https://bbs.huaweicloud.com/forum/thread-0290183611684337158-1-1.html7.Python numpy数组元素的访问及数组的增删改查功能详解【转】https://bbs.huaweicloud.com/forum/thread-0259183611770450178-1-1.html8.SpringMVC 通过ajax 实现文件上传的步骤【转】https://bbs.huaweicloud.com/forum/thread-0261183611880824110-1-1.html9.SpringMVC 如何使用thymeleaf 进行数据展示【转】https://bbs.huaweicloud.com/forum/thread-0275183611920676184-1-1.html10.Maven Profile高级策略与冲突解决方案【转】https://bbs.huaweicloud.com/forum/thread-0261183611970508111-1-1.html11.IDEA中为SpringBoot项目接入MySQL数据库的详细指南【转】https://bbs.huaweicloud.com/forum/thread-0221183612078346159-1-1.html12.判断Android APP使用了Tauri 这个跨端框架的操作方法【转】https://bbs.huaweicloud.com/forum/thread-0221183612125526160-1-1.html13.git如何查看提交行数、删除行数【转】https://bbs.huaweicloud.com/forum/thread-0275183612159112185-1-1.html14.Python自动化之pynput键盘鼠标操作全攻略【转】https://bbs.huaweicloud.com/forum/thread-0278183612235224170-1-1.html15.Python结合DeepSeek实现自动生成测试用例的示例代码【转】https://bbs.huaweicloud.com/forum/thread-0261183612276691112-1-1.html16.使用Python开发一个Word文档批量合并工具【转】https://bbs.huaweicloud.com/forum/thread-0275183612333980186-1-1.html17.AJAX get请求提交数据的具体步骤【转】https://bbs.huaweicloud.com/forum/thread-0261183612688189113-1-1.html18.mybatis in foreach双层嵌套的问题解决【转】https://bbs.huaweicloud.com/forum/thread-0261183612884484114-1-1.html19.MyBatis防止SQL注入攻击的有效方法【转】https://bbs.huaweicloud.com/forum/thread-0278183612934320172-1-1.html20.Java内存区域与内存溢出异常分析与解决【转】https://bbs.huaweicloud.com/forum/thread-0221183612977820161-1-1.html
-
一、环境准备1. 基础环境已安装IntelliJ IDEA并创建Spring Boot项目。本地安装MySQL 5.7+(推荐8.0),并创建数据库(如springboot_db)。2. 检查依赖确保项目包含Spring Web、Spring Data JPA和MySQL Driver依赖(可通过pom.xml添加)。二、添加MySQL依赖修改pom.xml在<dependencies>中添加以下依赖:12345678910111213141516171819<!-- Spring Data JPA --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency> <!-- MySQL驱动(版本需与本地MySQL一致) --><dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope></dependency> <!-- 可选:Lombok简化代码 --><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency>注意:Spring Boot 3.x默认使用MySQL 8.x驱动,若使用MySQL 5.x需指定驱动版本(如5.1.49)。三、配置MySQL连接1. 修改application.properties在src/main/resources/application.properties中添加数据库配置:12345678910# 数据源配置spring.datasource.url=jdbc:mysql://localhost:3306/springboot_db?useSSL=false&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA配置spring.jpa.hibernate.ddl-auto=updatespring.jpa.show-sql=truespring.jpa.properties.hibernate.format_sql=true关键参数解释:spring.jpa.hibernate.ddl-auto=update:启动时自动更新表结构(可选create、none)。useSSL=false:禁用SSL(本地开发可关闭)。serverTimezone=UTC:统一时区,避免时间差问题。2. 验证配置启动项目,若控制台输出以下日志,说明数据库连接成功:HikariPool-1 - Start completed四、创建实体类与Repository1. 定义实体类(User)123456789101112131415161718192021package com.example.demo.entity; import jakarta.persistence.*;import lombok.Data; @Data@Entity@Table(name = "user") // 指定表名public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, unique = true) private String username; @Column(nullable = false) private String password; private String email;}注解说明:@Entity:标记为JPA实体。@Table:指定映射的表名。@Data:Lombok注解,自动生成getter/setter。2. 创建Repository接口123456789package com.example.demo.repository; import com.example.demo.entity.User;import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { // 自定义查询方法(按用户名查找) User findByUsername(String username);}五、编写Service与Controller1. 实现Service层1234567891011121314151617181920package com.example.demo.service; import com.example.demo.entity.User;import com.example.demo.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service; @Servicepublic class UserService { @Autowired private UserRepository userRepository; public User saveUser(User user) { return userRepository.save(user); } public User findUserByUsername(String username) { return userRepository.findByUsername(username); }}2. 编写RESTful Controller1234567891011121314151617181920212223package com.example.demo.controller; import com.example.demo.entity.User;import com.example.demo.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*; @RestController@RequestMapping("/api/users")public class UserController { @Autowired private UserService userService; @PostMapping public User createUser(@RequestBody User user) { return userService.saveUser(user); } @GetMapping("/{username}") public User getUser(@PathVariable String username) { return userService.findUserByUsername(username); }}六、测试与验证1. 启动应用运行启动类DemoApplication,观察控制台是否生成建表SQL:1234567create table user ( id bigint not null auto_increment, email varchar(255), password varchar(255) not null, username varchar(255) not null unique, primary key (id));2. 使用Postman测试API新增用户(POST请求):URL:http://localhost:8080/api/usersBody(JSON):12345{ "username": "csdn_user", "password": "123456", "email": "csdn@example.com"}查询用户(GET请求):URL:http://localhost:8080/api/users/csdn_user七、常见问题与解决方案Q1:数据库连接失败(Access denied)原因:用户名/密码错误,或用户无权限访问数据库。解决:检查application.properties中的username和password。在MySQL中授权用户:12GRANT ALL PRIVILEGES ON springboot_db.* TO 'root'@'localhost';FLUSH PRIVILEGES;Q2:驱动类未找到(Driver class not found)原因:MySQL驱动版本与配置不匹配。解决:检查spring.datasource.driver-class-name是否为com.mysql.cj.jdbc.Driver(MySQL 8.x)。确认pom.xml中MySQL依赖未冲突。Q3:时区错误(ServerTimezone not configured)解决:在JDBC URL中添加&serverTimezone=Asia/Shanghai(或UTC)。Q4:表不存在(Table ‘springboot_db.user’ doesn’t exist)解决:确保spring.jpa.hibernate.ddl-auto=update。检查实体类@Table(name="user")是否与数据库表名一致。
-
Git Assistant 插件基于项目的 Git Log 提供可视化的洞察视角,研发团队经理必备。贡献者排名:查看谁在您的仓库排行榜上名列前茅。它既有趣又有竞争力,信息量丰富!提交时间分析:发现您的团队最活跃的时间——按小时、周、月或年。您是夜猫子还是早起的人?时区分布:可视化您的提交来自世界哪个地方。全球团队合作变得清晰可见!使用对数尺改善视觉呈现热点信息:看看最近哪个模块修改频繁,谁是最重要的人
-
注意事项:1)解压之后压缩包叫apache-jmeter-4.0.zip,如是src.zip后缀的都不对,打开之后会报错不可用,因为里面缺少我们下一步将要配置的环境变量.jar文件。2)对应的jdk版本不可太低,一般jmeter3.0的对应jdk1.7,jmeter4.0对应jdk1.8以上,否者启用jmeter也会报错。3)一定要确保环境变量配置正确(包括jdk的与jmeter的环境变量配置)。一、下载与安装1、JMeter下载/安装官网:https://jmeter.apache.org镜像地址:https://mirrors.cloud.tencent.com/apache/jmeter/binaries/apache-jmeter-5.6.zip2、Jdk下载镜像地址:Index of java-local/jdk/8u202-b083、配置环境变量 电脑桌面----》“计算机”图标----》鼠标右键选择“属性”----》点击高级系统设置----》高级---》环境变量页面新建jmeter 配置路径第一步添加jmeter路径变量:JMETER_HOME值:F:\soft\apache-jmeter-5.6\apache-jmeter-5.6 (拷贝你的解压路径即可)第二步添加classpath路径新建或编辑CLASSPATH配置classpath变量,没有的话也要按照上面步骤进行新建,有的话直接进行选中,点击编辑即可。变量值固定为:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar; 做完之后一定要保存,不确定的话可以直接点击确定按钮直到退到我的电脑页面基本配置完成,然后验证一下是否配置正确,是否可用。确认安装是否成功,双击jmeter.bat或者以管理员方式运行。注意:运行成功以后的CMD界面和JMeter主界面都不要关闭。要想使用这个相应时间首先需要安装3 Basic Graphs插件下载官方地址:https://jmeter-plugins.org/install/Install/ 将下载的plugins-manager.jar包复制到Jmeter安装目录,lib/ext下面重启jmeter后技能使用Plugins Manager插件安装到这一步我发现,好像直接在plugins manager->available plugins中直接搜然后下载即可。
-
idea版本2023.3.2报错信息:com.intellij.diagnostic.PluginException: 4372 ms to call on EDT LoginMenuAction#Update@MainMenu (com.huawei.hdn.toolkitplatform.action.LoginMenuAction). Revise AnAction.getActionUpdateThread property [Plugin: com.huawei.hdn.toolkitPlatform] at com.intellij.diagnostic.PluginProblemReporterImpl.createPluginExceptionByClass(PluginProblemReporterImpl.java:23) at com.intellij.diagnostic.PluginException.createByClass(PluginException.java:89) at com.intellij.openapi.actionSystem.impl.ActionUpdater.computeOnEdt(ActionUpdater.kt:223) at com.intellij.openapi.actionSystem.impl.ActionUpdater.access$computeOnEdt(ActionUpdater.kt:71) at com.intellij.openapi.actionSystem.impl.ActionUpdater$computeOnEdt$1.invokeSuspend(ActionUpdater.kt) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684) Suppressed: java.lang.Throwable: EDT-trace-at-313-ms (5/5) 后面的报错很长,超过5000字符,不能发帖
-
每次打开idea的设置,然后关闭后,都会出现这个异常的信息。idea的版本是2023.3.2com.intellij.diagnostic.PluginException: No display name specified in plugin descriptor XML file for configurable com.huawei.codeelf.common.settings.configurable.CodeElfConfigurable; specify it using 'displayName' or 'key' attribute to avoid necessity to load the configurable class when Settings dialog is opened [Plugin: com.huawei.codearts.snap] at com.intellij.openapi.options.ex.ConfigurableWrapper.getDisplayName(ConfigurableWrapper.java:156) at com.intellij.openapi.options.ex.Weighted.lambda$static$0(Weighted.java:26) at java.base/java.util.TimSort.binarySort(TimSort.java:296) at java.base/java.util.TimSort.sort(TimSort.java:221) at java.base/java.util.Arrays.sort(Arrays.java:1307) at java.base/java.util.ArrayList.sort(ArrayList.java:1721) at com.intellij.openapi.options.ex.SortedConfigurableGroup.buildConfigurables(SortedConfigurableGroup.java:41) at com.intellij.openapi.options.SearchableConfigurable$Parent$Abstract.getConfigurables(SearchableConfigurable.java:75) at com.intellij.openapi.options.ex.EpBasedConfigurableGroup.<init>(EpBasedConfigurableGroup.kt:110) at com.intellij.openapi.options.ex.ConfigurableExtensionPointUtil.getConfigurableGroup(ConfigurableExtensionPointUtil.java:119) at com.intellij.ide.actions.ShowSettingsUtilImpl$Companion.getConfigurableGroups(ShowSettingsUtilImpl.kt:48) at com.intellij.ide.actions.ShowSettingsUtilImpl.getConfigurableGroups(ShowSettingsUtilImpl.kt) at com.intellij.ide.actions.ShowSettingsAction.perform(ShowSettingsAction.java:61) at com.intellij.ide.actions.ShowSettingsAction.actionPerformed(ShowSettingsAction.java:48) at com.intellij.openapi.actionSystem.ex.ActionUtil.doPerformActionOrShowPopup(ActionUtil.java:344) at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performActionDumbAwareWithCallbacks$4(ActionUtil.java:318) at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareWithCallbacks(ActionUtil.java:381) at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAwareWithCallbacks(ActionUtil.java:318) at com.intellij.openapi.actionSystem.ex.ActionUtil.invokeAction(ActionUtil.java:553) at com.intellij.ui.popup.ActionPopupStep.performAction(ActionPopupStep.java:258) at com.intellij.ui.popup.ActionPopupStep.lambda$onChosen$3(ActionPopupStep.java:235) at com.intellij.ui.popup.AbstractPopup.lambda$dispose$18(AbstractPopup.java:1733) at com.intellij.openapi.wm.impl.FocusManagerImpl.lambda$doWhenFocusSettlesDown$3(FocusManagerImpl.java:169) at com.intellij.util.ui.EdtInvocationManager.invokeLaterIfNeeded(EdtInvocationManager.java:33) at com.intellij.ide.IdeEventQueue.ifFocusEventsInTheQueue(IdeEventQueue.kt:220) at com.intellij.ide.IdeEventQueue.executeWhenAllFocusEventsLeftTheQueue(IdeEventQueue.kt:186) at com.intellij.openapi.wm.impl.FocusManagerImpl.doWhenFocusSettlesDown(FocusManagerImpl.java:165) at com.intellij.openapi.wm.impl.FocusManagerImpl.doWhenFocusSettlesDown(FocusManagerImpl.java:159) at com.intellij.ui.popup.AbstractPopup.dispose(AbstractPopup.java:1731) at com.intellij.ui.popup.WizardPopup.dispose(WizardPopup.java:161) at com.intellij.ui.popup.list.ListPopupImpl.dispose(ListPopupImpl.java:407) at com.intellij.ui.popup.PopupFactoryImpl$ActionGroupPopup.dispose(PopupFactoryImpl.java:293) at com.intellij.openapi.util.ObjectTree.runWithTrace(ObjectTree.java:130) at com.intellij.openapi.util.ObjectTree.executeAll(ObjectTree.java:162) at com.intellij.openapi.util.Disposer.dispose(Disposer.java:250) at com.intellij.openapi.util.Disposer.dispose(Disposer.java:238) at com.intellij.ui.popup.WizardPopup.disposeAllParents(WizardPopup.java:269) at com.intellij.ui.popup.list.ListPopupImpl.disposePopup(ListPopupImpl.java:518) at com.intellij.ui.popup.list.ListPopupImpl.handleNextStep(ListPopupImpl.java:542) at com.intellij.ui.popup.list.ListPopupImpl._handleSelect(ListPopupImpl.java:505) at com.intellij.ui.popup.list.ListPopupImpl.handleSelect(ListPopupImpl.java:449) at com.intellij.ui.popup.PopupFactoryImpl$ActionGroupPopup.handleSelect(PopupFactoryImpl.java:305) at com.intellij.ui.popup.list.ListPopupImpl$MyMouseListener.mouseReleased(ListPopupImpl.java:745) at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:298) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6657) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3385) at com.intellij.ui.popup.list.ListPopupImpl$MyList.processMouseEvent(ListPopupImpl.java:810) at java.desktop/java.awt.Component.processEvent(Component.java:6422) at java.desktop/java.awt.Container.processEvent(Container.java:2266) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5027) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4855) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4969) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4583) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4524) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2809) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4855) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:794) at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739) at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:766) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:764) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:763) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:695) at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.kt:635) at com.intellij.ide.IdeEventQueue._dispatchEvent$lambda$10(IdeEventQueue.kt:580) at com.intellij.openapi.application.impl.RwLockHolder.runWithEnabledImplicitRead(RwLockHolder.kt:75) at com.intellij.openapi.application.impl.RwLockHolder.runWithImplicitRead(RwLockHolder.kt:67) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:580) at com.intellij.ide.IdeEventQueue.access$_dispatchEvent(IdeEventQueue.kt:72) at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:355) at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1$1.compute(IdeEventQueue.kt:354) at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:793) at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:354) at com.intellij.ide.IdeEventQueue$dispatchEvent$processEventRunnable$1$1.invoke(IdeEventQueue.kt:349) at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$1(IdeEventQueue.kt:1014) at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:114) at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1014) at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$7(IdeEventQueue.kt:349) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:848) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:391) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)
-
IntelliJ IDEA开发中常用的快捷键有很多,以下是一些常见且使用频率较高的快捷键: - **编辑类快捷键**:通过`psvm + Tab`可以快速生成main方法,`sout + tab`用于生成输出语句。此外,`Ctrl+X`和`Ctrl+Y`分别用于删除一行和复制一行代码。对于注释代码,可以使用`Ctrl+/`或`Ctrl+Shift+/`。如果误操作了,可以通过`Ctrl + Z`进行撤销,多次撤销可以使用`Ctrl + Shift + Z`。 - **调试快捷键**:在debug过程中,可以使用`F7`单步执行,`F8`逐行执行,`Shift + F8`跳出当前方法。而`Alt + M`则可以一键修复doc comment。 - **搜索快捷键**:查找文件内内容,可以使用`Ctrl + E`;而全局搜索则可以用`Ctrl + Shift + N`。 - **窗口管理快捷键**:切换不同的窗口可以使用`Alt + Left`和`Alt + Right`,并且对于隐藏的窗口,可以使用`Alt + Tab`进行切换。 以上只是其中一部分常用快捷键,实际上IntelliJ IDEA提供了非常多的快捷键以帮助开发者提升编程效率。你可以根据自己的需求和使用习惯去学习和掌握更多的快捷键。
-
IntelliJ IDEA是由JetBrains公司开发的一款卓越的Java集成开发环境(IDE),它有社区版和专业版两个主要版本。 1. 社区版(Community):这是免费的版本,基于开源代码构建,适用于纯JVM和Android开发。它拥有大部分开发所需的基本功能,但并不支持前端css和js的技术支持。 2. 专业版(Ultimate):这个版本是付费的,可用于web端和企业端的开发使用。它支持众多的前端和后端框架和技术,提供了更全面的分析和数据库工具、HTTP客户端等高级功能。 在版本更新方面,从v2022.2开始,所有IntelliJ IDEA更新都附带了JetBrains Runtime 17 (JBR 17),这带来了显着的IDE性能改进、更好的安全性、由于Metal API而在macOS上增强的渲染性能等等。 然而,需要注意的是,新版本可能会对电脑配置有较高的要求,例如某些用户反映在升级到最新版本后出现了操作延迟和卡顿的问题。因此,在选择使用何种版本时,应根据自己的实际需求和电脑配置进行权衡。
-
在 IntelliJ IDEA 中接入 GitGPT 插件的步骤如下: 1. 打开 IntelliJ IDEA,点击菜单栏的 "File"(文件)> "Settings"(设置)。 2. 在设置窗口左侧导航栏中,选择 "Plugins"(插件)。 3. 在插件页面右上角,点击 "Marketplace"(市场)标签,搜索 "GitGPT"。 4. 在搜索结果中找到 "GitGPT" 插件,点击 "Install"(安装)按钮进行安装。 5. 安装完成后,重启 IntelliJ IDEA 生效。 注意:目前并没有名为 "GitGPT" 的插件,请确保你搜索的插件名称是正确的。如果你需要接入某个特定的插件,请提供正确的插件名称。
-
IntelliJ IDEA 是目前最好用的 JAVA 开发 IDE,它本身的功能已经非常强大了,但是每个人的需求不一样,有些需求 IDEA 本身无法满足,于是我们就需要自己开发插件来解决。工欲善其事,必先利其器,想要提高开发效率,我们可以借助 IDEA 提供的插件功能来满足我们的需求。如果没有我需要的功能怎么办?很简单,我们自己造一个!插件能做什么?IDEA 的插件几乎可以做任何事情,因为它把 IDE 本身的能力都封装好开放出来了。主要的插件功能包含以下四种:自定义语言支持:如果有 IDEA 暂时不支持的语言,你可以自己写一个插件来支持,例如 Go 语言原来的支持就是通过插件做的,后来单独做了一个 Goland。官方有自定义语言插件支持的教程。框架支持:例如Struts 2 的框架支持工具集成:可以给 IDEA 的自带功能进行增强,例如对 Git 的操作增加 CodeReview 的功能。参考Gerrit用户界面:自定义的插件改变用户界面。参考BackgroundImage我为了减少重复代码的编写,写了一个代码生成的插件【IDEA代码生成插件CodeMaker】,支持自定义代码生成的模板。Hello world 插件依照惯例,我们从 Hello world 开始。新建一个 Gradle 的插件工程有些教程推荐用 IDEA 默认的插件工程来开始,但是我比较推荐用 Gradle 来管理整个插件工程,后面的依赖管理会很方便,否则都得靠手动管理。点击新建工程,选择 Gradle接下来填写项目属性配置 Gradle,用默认配置就行新建完工程之后,IDEA 会自动开始解析项目依赖,因为它要下载一个几百兆的 SDK 依赖包,所以会比较久,打开科学上网能快一点。Gradle 依赖解析完成之后,项目结构如下图,其中 plugin.xml 是插件的配置,build.gradle 是项目依赖的配置(类比 pom.xml)。下面就是默认生成的 plugin.xml<idea-plugin> <!--插件id--> <id>com.xiaokai.test.demo</id> <!--插件名称--> <name>Demo</name> <!--开发者信息--> <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor> <!--插件说明--> <description><![CDATA[ Enter short description for your plugin here.<br> <em>most HTML tags may be used</em> ]]></description> <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html on how to target different products --> <!-- uncomment to enable plugin in all products <depends>com.intellij.modules.lang</depends> --> <!--依赖的其他插件能力--> <extensions defaultExtensionNs="com.intellij"> <!-- Add your extensions here --> </extensions> <!--插件动作--> <actions> <!-- Add your actions here --> </actions></idea-plugin>创建一个 ActionAction 是 IDEA 中对事件响应的处理器,它的 actionPerformed 就像是 JS 中的 onClick 方法。可以看出来,插件的开发本质上跟 web、Android 的开发没有什么不同,因为都是事件驱动的编程。我们可以直接使用 IDEA 提供的 Action 生成器点击 OK 之后会在 src 生成类文件:package com.xiaokai.test;import com.intellij.openapi.actionSystem.AnAction;import com.intellij.openapi.actionSystem.AnActionEvent;public class HelloWorldAction extends AnAction { @Override public void actionPerformed(AnActionEvent e) { // TODO: insert action logic here }}同时,动作的信息也会注册到 plugin.xml 中 <!--插件动作--> <actions> <!-- Add your actions here --> <action id="demo.hello.world" class="com.xiaokai.test.HelloWorldAction" text="HelloWorld" description="Say Hello World"> <add-to-group group-id="GenerateGroup" anchor="last"/> </action> </actions>弹出对话框创建完 Action 之后我们就要开始往里面写逻辑了,既然是 Hello World 教学,那我们就来试一下最简单的弹出对话框。 @Override public void actionPerformed(AnActionEvent e) { //获取当前在操作的工程上下文 Project project = e.getData(PlatformDataKeys.PROJECT); //获取当前操作的类文件 PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE); //获取当前类文件的路径 String classPath = psiFile.getVirtualFile().getPath(); String title = "Hello World!"; //显示对话框 Messages.showMessageDialog(project, classPath, title, Messages.getInformationIcon()); }代码写完之后,打开 Gradle 的界面,点击 runIde 就会启动一个安装了插件的 IDEA,然后就可以进行测试。你还可以右键启动 Debug 模式,这样还能进行断点。可以看到,我们右键打开 Generate 菜单之后,里面最后一项就是我们添加的 Action,进阶的教程如果想学习更多的原理和设计理念可以看IntelliJ Platform SDK的官方文档。不过老实说,它的文档写的挺差的,基本上就是简单讲了一下概念和原理,没有深入的分析。所以如果要深入研究还得靠自己。最靠谱的学习方式就是看别人写的插件,举个例子,你想知道怎么样实现自动生成代码,你就去找支持这个功能的插件,看他的源码是怎么写的。我当时写CodeMaker的时候也是靠自己啃源码之后写出来的。下面我简单介绍一下我用过的一些 API,这些 API 基本都没有文档说明,全靠代码相传。判断当前光标选择的元素是什么 //获取当前事件触发时,光标所在的元素 PsiElement psiElement = anActionEvent.getData(LangDataKeys.PSI_ELEMENT); //如果光标选择的不是类,弹出对话框提醒 if (psiElement == null || !(psiElement instanceof PsiClass)) { Messages.showMessageDialog(project, "Please focus on a class", "Generate Failed", null); return; }获取当前类文件的所有类对象一个类文件中可能会有内部类,所以读取的时候返回的是一个列表 public static List<PsiClass> getClasses(PsiElement element) { List<PsiClass> elements = Lists.newArrayList(); List<PsiClass> classElements = PsiTreeUtil.getChildrenOfTypeAsList(element, PsiClass.class); elements.addAll(classElements); for (PsiClass classElement : classElements) { //这里用了递归的方式获取内部类 elements.addAll(getClasses(classElement)); } return elements; }格式化代码 public static void reformatJavaFile(PsiElement theElement) { CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(theElement.getProject()); try { codeStyleManager.reformat(theElement); } catch (Exception e) { LOGGER.error("reformat code failed", e); } }使用粘贴板 CopyPasteManager.getInstance() .setContents(new SimpleTransferable(table.toString(), DataFlavor.allHtmlFlavor));原文链接:IDEA 插件开发入门教程 - 知乎 (zhihu.com)
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签