最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子

 更新時(shí)間:2020年06月25日 11:47:02   作者:nightwind666  
這篇文章主要介紹了詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

之前因?yàn)轫?xiàng)目組有自己的代碼規(guī)范,為了約束平時(shí)的開發(fā)規(guī)范,于是基于2019.1.3版本開發(fā)了一個(gè)代碼提示的插件。但是在把IDEA切換到2020.1版本的時(shí)候,卻發(fā)現(xiàn)瘋狂報(bào)錯(cuò),但是網(wǎng)上關(guān)于IDEA插件開發(fā)的相關(guān)文章還是不夠多,只能自己解決。于是根據(jù)官方的SDK文檔,使用Gradle重新構(gòu)建了一下項(xiàng)目,把代碼拉了過來。下文會(huì)根據(jù)2020.1版本簡(jiǎn)單開發(fā)一個(gè)代碼異常的提示插件,把容易踩坑的地方提示一下。

1、首先先根據(jù)IDEA插件開發(fā)官方文檔,用Gradle新建一個(gè)project

選中file -> new -> Project...,在彈出的窗口左側(cè)選擇Gradle,彈出以下界面:

默認(rèn)勾選了Java,需要額外勾選IntelliJ Platform Plugin來表示這是一個(gè)IDEA插件項(xiàng)目,還需要勾選Kotlin/JVM這一項(xiàng),為什么要勾選這一項(xiàng)呢,官網(wǎng)是這么介紹的:

To include support for the Kotlin language in the plugin, check the Kotlin/JVM box (circled in green below.) This option can be selected with or without the Java language.

也就是說,如果我們開發(fā)的插件需要對(duì)JAVA代碼做支持的話,是要勾選這一項(xiàng)的。所有如果插件是基于JAVA代碼檢查的話,需要勾選這一個(gè)選項(xiàng)。

勾選完之后,點(diǎn)擊next,之后的信息根據(jù)自己實(shí)際需要填寫即可,然后點(diǎn)擊finish,然后默默等待Gradle構(gòu)建項(xiàng)目,如果可以的話掛個(gè)梯子,下載包什么的還是挺慢的。

構(gòu)建完后的項(xiàng)目的目錄結(jié)構(gòu)以及每一個(gè)目錄的作用,可以直接去看官方文檔,里面有介紹。

https://www.jetbrains.org/intellij/sdk/docs/tutorials/build_system/prerequisites.html

2、 構(gòu)建完項(xiàng)目后,需要修改build.gradle部分配制

構(gòu)建完后,默認(rèn)會(huì)打開build.gradle文件,內(nèi)容如下:

plugins {
  id 'java'
  id 'org.jetbrains.intellij' version '0.4.19'
  id 'org.jetbrains.kotlin.jvm' version '1.3.71'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
  mavenCentral()
}

dependencies {
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
  testCompile group: 'junit', name: 'junit', version: '4.12'
}

// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
  version '2020.1'
}
compileKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
patchPluginXml {
  changeNotes """
   Add change notes here.<br>
   <em>most HTML tags may be used</em>"""
}

這里有個(gè)坑,構(gòu)建完后,我把以前的代碼復(fù)制過來,提醒我有部分類沒有找到,也就是說沒有引入對(duì)應(yīng)的jar包。后來我在官網(wǎng)例子里面發(fā)現(xiàn),它的build.gradle文件,和我的build文件有點(diǎn)不一樣,具體不一樣的地方如下:

// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
 version = '2020.1'
 plugins = ['java']
 sameSinceUntilBuild = true
}

它在intellij里面,多了一個(gè)plugins = ['java']的選項(xiàng),如果缺少這個(gè)選項(xiàng)的話,會(huì)缺少java-api.jar等jar等JAVA代碼支持的jar包,導(dǎo)致一些類或者方法不可用。所以如果是JAVA代碼支持的話,build.gradle文件需要加上plugins = ['java']這一行。

3、修改plugin.xml文件

plugin.xml文件是對(duì)于本插件的作用的一些描述,以及一些依賴關(guān)系配制,構(gòu)建完后的plugin.xml文件內(nèi)容如下:

<idea-plugin>
  <id>org.example.new-plugin-for-java</id>
  <name>Plugin display name here</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 https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
     on how to target different products -->
  <depends>com.intellij.java</depends>

  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
    <localInspection
        language="JAVA"
        displayName="test displayer"
        groupPath="Java"
        groupBundle="messages.InspectionsBundle"
        groupKey="group.names.probable.bugs"
        enabledByDefault="true"
        level="ERROR"
        implementationClass="com.nw.TestInsepction"/>
  </extensions>

  <actions>
    <!-- Add your actions here -->
  </actions>
</idea-plugin>

這里有個(gè)坑,如果是IDEA2019.2以前的版本的話,這個(gè)文件不用其他東西,直接參考網(wǎng)上的插件開發(fā)教程,寫好代碼,就可以正常運(yùn)行了。但是如果是IDEA2019.2的版本的話,運(yùn)行的時(shí)候會(huì)瘋狂報(bào)錯(cuò),一開始不知道為什么,只能又去翻官方的例子,玩大家一起來找不同,結(jié)果發(fā)現(xiàn)官網(wǎng)的例子,下面的配置信息和默認(rèn)構(gòu)建的不一樣:

 <!-- Evaluates java PSI -->
 <depends>com.intellij.modules.java</depends>

原來這里的依賴還要改一下,改成上面這樣,那為什么要改成這個(gè)依賴呢,這個(gè)時(shí)候,我才發(fā)現(xiàn)默認(rèn)構(gòu)建的plugin.xml里面,在depends上面有一段注釋,大概意思就是,請(qǐng)前往注釋里面的網(wǎng)站去找到如何根據(jù)產(chǎn)品去選擇對(duì)應(yīng)的depends,那就很簡(jiǎn)單了,直接上網(wǎng)頁看,里面很多的介紹,以及各種不同的depends是干嘛的。網(wǎng)頁里面有這么一段話:

(2) The Java language functionality was extracted as a plugin in version 2019.2 of the IntelliJ Platform. This refactoring separated the Java implementation from the other, non-language portions of the platform. Consequently, Java dependencies are expressed differently in plugin.xml depending on the version of the IntelliJ Platform being targeted:

Syntax required for releases prior to 2019.2, allowable in all releases:

  • plugin.xml include com.intellij.modules.java

Syntax for 2019.2 and later releases:

  • plugin.xml allowable alternative include com.intellij.java
  • build.gradle required to include intellij.plugins 'java'

大概意思是,從2019.2版本開始后,java代碼相關(guān)的支持抽成了一個(gè)插件,不包含在默認(rèn)構(gòu)建的包里面了,所以從2019.2版本開始后,plugin.xmlbuild.gradle需要修改成相關(guān)的配置。這也是為什么我們第二步要改build.gradle的原因。

4、參考網(wǎng)上的例子,編寫第一個(gè)代碼提示插件

新建一個(gè)java類,內(nèi)容如下,這是一個(gè)測(cè)試用的提示插件,在所有變量上面提示"this is error"

package com;

import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.psi.JavaElementVisitor;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiField;
import org.jetbrains.annotations.NotNull;

/**
 * 這是一個(gè)測(cè)試用的提示插件,在所有變量上面提示"this is an error"
 * @author LiuYeFeng
 * @date 2020/5/5
 * @e-mail nightwind666@163.com
 */
public class TestInspectionTool extends AbstractBaseJavaLocalInspectionTool {

  @NotNull
  @Override
  public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
    // 返回一個(gè)java元素的訪問器,重寫當(dāng)訪問變量的時(shí)候,需要做的操作
    return new JavaElementVisitor() {
      @Override
      public void visitField(PsiField field) {
        super.visitField(field);
        // 注冊(cè)問題,也就是在變量上面顯示異常紅色下劃線,并提示"this is an error"
     		// 如果可以的話,這里也可以附帶上快速修復(fù)問題的方法
        holder.registerProblem(field, "this is an error");
      }
    };
  }
}

然后在plugin.xml里面的extensions添加上面編寫的插件,如下;

 <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
    <localInspection
        language="JAVA"
        displayName="Test field error"
        groupPath="Java"
        groupBundle="messages.InspectionsBundle"
        groupKey="group.names.probable.bugs"
        enabledByDefault="true"
        level="ERROR"
        implementationClass="com.TestInspectionTool"/>
  </extensions>

以上配置大致是注冊(cè)一個(gè)代碼提示組件,里面的參數(shù)會(huì)決定你的提示配置在IDEA的哪個(gè)分類里面,以及提示的等級(jí),例子里面用ERROR級(jí)別,可以查看的簡(jiǎn)單一點(diǎn)。

5、開始看代碼提示插件的效果

點(diǎn)擊右上角的debug,等待編譯運(yùn)行。運(yùn)行后會(huì)彈出一個(gè)新的IDEA,這個(gè)IDEA會(huì)加載了我們編寫的插件,同時(shí)在我們?cè)瓉砭帉懖寮腎DEA可以看到日志輸出等東西,也可以斷點(diǎn)??梢院?jiǎn)單理解為新的IDEA是一個(gè)瀏覽器,我們?cè)谟镁W(wǎng)頁調(diào)試后端接口。

因?yàn)槲覀兙帉懙牟寮切聦懸粋€(gè)變量,不管三七二十一就會(huì)報(bào)錯(cuò),提示this is an error,效果如下;

到此,一個(gè)完成的代碼異常提示插件,就簡(jiǎn)單完成了。

6、代碼提示插件還可以做到的

我們編寫的這個(gè)插件,其實(shí)是比較簡(jiǎn)單的,并沒有做邏輯分析。我們是可以根據(jù)實(shí)際需要,去編寫一些項(xiàng)目組本身特有的功能的,例如某些繼承自特殊類的所有字段,必須要有注釋。在Service里面的方法,異常返回之前必須要記錄日志或者一些其他操作等,都是可以做到的,還可以做一些快速修復(fù)(quick fix),例如字段沒有注釋可以快速生成注釋。

這就需要對(duì)IDEA語法樹相關(guān)有了解,IDEA把代碼抽象成了Psi語法樹,根據(jù)不同的代碼功能劃分為不同的PsiElement,例如注釋是PsiComment,字段是PsiField,方法是PsiMethod,類是PsiClass。IDEA本身也提供了相當(dāng)多的工具類,例如ReferencesSearch可以尋找類或者方法的引用點(diǎn),PsiTreeUtil可以處理代碼語法樹上面的一些操作,例如獲取變量所在的方法,ControlFlowUtil可以對(duì)代碼進(jìn)行解析等,還有PsiClassUtilPsiFieldUtil等各種相關(guān)性的工具類可以提供各種便捷的操作,這就需要插件開發(fā)者自己去摸索。遇到問題可以去IDEA官方問答論壇去找一下,說不定別人已經(jīng)幫你解決了這個(gè)問題了。

附加:

IntelliJ Platform SDK官網(wǎng)

https://www.jetbrains.org/intellij/sdk/docs/intro/welcome.html

IntelliJ 插件開發(fā)交流社區(qū)

https://intellij-support.jetbrains.com/hc/en-us/community/topics/200366979-IntelliJ-IDEA-Open-API-and-Plugin-Development

到此這篇關(guān)于詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子的文章就介紹到這了,更多相關(guān)IDEA2020.1 JAVA代碼提示插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud @RefreshScope 原理及使用

    Spring Cloud @RefreshScope 原理及使用

    這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • javac -encoding 用法詳解

    javac -encoding 用法詳解

    當(dāng)我們編輯了一個(gè)Java源文件保存時(shí),是以操作系統(tǒng)默認(rèn)的字符編碼保存的(Windows xp默認(rèn)字符集是GBK)。這篇文章主要介紹了javac -encoding 用法詳解,非常具有實(shí)用價(jià)值。
    2016-12-12
  • Intellij idea熱部署插件JRebel的使用

    Intellij idea熱部署插件JRebel的使用

    這篇文章主要介紹了Intellij idea熱部署插件JRebel的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java IO流文件的讀寫具體實(shí)例

    java IO流文件的讀寫具體實(shí)例

    這篇文章主要介紹了java IO流文件的讀寫具體實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • IDEA自動(dòng)生成注釋模板的配置教程

    IDEA自動(dòng)生成注釋模板的配置教程

    本文介紹了如何在IntelliJIDEA中配置類和方法的注釋模板,包括自動(dòng)生成項(xiàng)目名稱、包名、日期和時(shí)間等內(nèi)容,以及如何定制參數(shù)和返回值的注釋格式,需要的朋友可以參考下
    2025-04-04
  • Springboot+Redis執(zhí)行l(wèi)ua腳本的項(xiàng)目實(shí)踐

    Springboot+Redis執(zhí)行l(wèi)ua腳本的項(xiàng)目實(shí)踐

    本文主要介紹了Springboot+Redis執(zhí)行l(wèi)ua腳本的項(xiàng)目實(shí)踐,詳細(xì)的介紹Redis與Lua腳本的結(jié)合應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 談?wù)勛兞棵?guī)范的重要性

    談?wù)勛兞棵?guī)范的重要性

    下面小編就為大家?guī)硪黄務(wù)勛兞棵?guī)范的重要性。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java基礎(chǔ)之ClassLoader詳解

    Java基礎(chǔ)之ClassLoader詳解

    這篇文章主要介紹了Java基礎(chǔ)之ClassLoader詳解,文中對(duì)ClassLoader有非常詳細(xì)的解說,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java基礎(chǔ)理論Stream的Filter與謂詞邏輯

    java基礎(chǔ)理論Stream的Filter與謂詞邏輯

    這篇文章主要為大家介紹了java基礎(chǔ)理論Stream的Filter與謂詞邏輯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 教你如何用Jenkins自動(dòng)化部署項(xiàng)目(從零到搭建完成)

    教你如何用Jenkins自動(dòng)化部署項(xiàng)目(從零到搭建完成)

    這篇文章主要介紹了教你如何用Jenkins自動(dòng)化部署項(xiàng)目(從零到搭建完成),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論

体育| 肇州县| 大新县| 鄂温| 蚌埠市| 甘谷县| 阿巴嘎旗| 临湘市| 永胜县| 襄垣县| 达拉特旗| 新沂市| 罗源县| 仁化县| 佛山市| 璧山县| 营山县| 长沙县| 余干县| 婺源县| 沧州市| 比如县| 黔江区| 江陵县| 镶黄旗| 澄城县| 西充县| 伊金霍洛旗| 鱼台县| 泉州市| 河间市| 桂平市| 宁阳县| 台东市| 金乡县| 澎湖县| 山东省| 龙里县| 凤台县| 双流县| 镇沅|