整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          自己動手,豐衣足食:從零開始寫個 IDEA 插件,要啥功能就做啥

          Java代碼的時候,經常會涉及到重復性的操作,這個時候就會想要是有這樣一個插件就好了,如果是大家都會遇到的場景,IDE或許已經提供了,再不然也有可能有人編寫了相關的插件。

          要是這個操作是你們的編碼環境特有的,那就只能自己寫工具了。所以這里來學學如何編寫IDEA插件,讓自己的編程環境更加強大,更好的進行裝x。

          開發環境

          開發IDEA插件有以下這些依賴:

          • IntelliJ IDEA Community Edition
          • IntelliJ IDEA Community Edition 源碼
          • Plugin DevKit 插件
          • IntelliJ Platform SDK

          安裝IntelliJ IDEA Community Edition

          你可能已經安裝了Ultimate版本,但是你還是需要安裝[IDEA][]的社區版本。因為商業版是閉源的,所以在調試時無法調試核心代碼。

          下載IntelliJ IDEA Community Edition源碼

          社區版的安裝包里是不包含源碼的,所以我們需要手動從github上clone一份:

          git clone --depth 1 git://git.jetbrains.org/idea/community.git idea

          關于從源碼運行IDEA的方法參考 Check Out And Build Community Edition:

          http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html

          添加IDEA jdk

          雖然不知道原因,但是根據Check Out And Build Community Edition:

          http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html

          我們需要建立一個 IDEA jdk來運行插件:

          除非你在Mac上使用官方JDK,否則你需要手動添加 /lib/tools.jar到classpath中。關注微信公眾號:匠心零度,在后臺回復:idea,可以獲取我整最新 IDEA 教程,都是干貨。

          配置IntelliJ Platform SDK

          打開 File|ProjectStructure新建一個 IntelliJPlatformSDK:

          Java SDK選擇我們剛剛建立的 IDEA jdk:

          然后我們可以把下載的IDEA社區版源碼添加到源碼路徑中,這樣在調試時,就可以調試IDEA自身的代碼了:

          第一個插件

          我們來編寫一個最簡單的插件來學習編寫一個插件的完整步驟。

          新建工程

          選擇 IntellJPlatformPlugin,然后Project SDK指定剛剛新建的plugin sdk:

          新建的插件項目:

          插件根目錄下有兩個目錄 src和 resources。src是插件代碼目錄, resource是插件資源目錄,其中 META-INF/plugin.xml是插件的描述文件,就像Java web項目的 web.xml一樣。

          plugin.xml默認的內容如下:

          <idea-plugin>    <id>com.your.company.unique.plugin.id</id>    <name>Plugin display name here</name>    <version>1.0</version>    <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>    <change-notes><!\[CDATA\[      Add change notes here.<br>        <em>most HTML tags may be used</em>      \]\]>  </change-notes>    <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/build\_number_ranges.html for description -->  <idea-version since-build="145.0"/>    <!\-\- 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>  

          新建一個Action

          插件擴展IDEA最常見的方式就是在菜單欄或者工具欄中添加菜單項,用戶通過點擊菜單項來觸發插件功能。IDEA提供了 AnAction類,這個類有一個虛方法 actionPerformed,這個方法會在每次菜單被點擊時調用。

          新建一個自定義的Action有兩個步驟:

          1、 繼承 AnAction類,在 actionPerformed方法中實現插件邏輯 2、 注冊action,有兩種方式,通過代碼注冊和通過 plugin.xml注冊

          我們先寫一個簡單的Action類:

          publicclass TextBoxes extends AnAction {      // 如果通過Java代碼來注冊,這個構造函數會被調用,傳給父類的字符串會被作為菜單項的名稱    // 如果你通過plugin.xml來注冊,可以忽略這個構造函數    public TextBoxes() {          // 設置菜單項名稱        super("Text _Boxes");          // 還可以設置菜單項名稱,描述,圖標        // super("Text _Boxes","Item description",IconLoader.getIcon("/Mypackage/icon.png"));    }      public void actionPerformed(AnActionEvent event) {          Project project = event.getData(PlatformDataKeys.PROJECT);          String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon());          Messages.showMessageDialog(project, "Hello, " \+ txt + "!\n I am glad to see you.", "Information", Messages.getInformationIcon());      }  }  

          然后我們在 plugin.xml中注冊這個Action:

          <actions>    <group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu">      <add-to-group group-id="MainMenu" anchor="last"  />         <action id="Myplugin.Textboxes"class="Mypackage.TextBoxes" text="Text _Boxes" description="A test menu item" />    </group>  </actions>  

          這里我們新建了一個菜單組,其中text字符串的下劃線表示這個字母作為快捷鍵。這個菜單顯示的效果如下:

          除了手動新建Action,IDEA還提供了快速新建的方法,在代碼目錄上點擊新建,可以看到Action:

          可以在這個面板中填寫你要新建的Action信息,IDEA會幫你新建類,還有在plugin.xml中幫你注冊:

          運行插件

          運行插件特別簡單,和運行普通Java代碼一樣,點擊運行或者調試的按鈕,就會啟動一個新的IDEA實例,這個實例中插件是生效的。

          點擊Text Boxes就可以看到插件的效果了。

          一步:官網下載IDEA

          地址:https://www.jetbrains.com/idea/download/other.html

          第二步:卸載舊的IDEA(沒有則跳過)

          打開電腦上的控制面板-->程序-->程序和功能,找到舊版IDEA,卸載時勾選提示的兩個復選框,然后點擊Uninstall

          第二步:安裝IDEA

          點擊Next >

          自定義安裝路徑,點擊Next >


          個人感覺只需要在
          64-bit launch前面打鉤就行,下面的12345的功能如下:

          1. 創建桌面快捷方式圖標,建議創建64位的圖標
          2. 將IDEA的啟動目錄添加到環境變量中,從命令行也能啟動idea,根據個人需要勾選。
          3. 勾選后,鼠標右鍵點擊一個文件夾,會出現“Open Folder as Project”選項,個人感覺用處不大
          4. 關聯這四個格式的文件,也就是以后打開java、groovy、kt、kts結尾的文件,默認使用idea打開。個人感覺用處也不大,如果是打開單個java文件,我更喜歡用notepad++。
          5. 下載java的jre環境,如果本機已經有java運行環境了就不用勾選。

          點擊Next >

          點擊install進行安裝。

          安裝成功,點擊Finish結束

          第一次運行idea會讓選擇設置,我們選擇第二個默認的即可。

          近開始學習SpringBoot,和大家分享一下簡單的SpringBoot項目搭建。

          1.File->new->project;

          2.選擇“Spring Initializr”,點擊next;(jdk1.8默認即可)

          3、.完善項目信息,組名可不做修改,項目名可做修改;最終建的項目名為:demo,src->main->java下包名會是:com->springboot_learn->test;點擊next;

          4.Web下勾選Spring Web Start,(網上創建springboot項目多是勾選Web選項,而較高版本的Springboot沒有此選項,勾選Spring Web Start即可,2.1.8版本是Spring Web);SQL勾選:MySQL Driver,JDBC API 和 MyBatis Framework三項;點擊next;

          5.選擇項目路徑,點擊finish;打開新的窗口;

          6.剛創建好的項目目錄結構

          7.點擊右側的Maven,點擊設置(扳手圖標)進行項目Maven倉庫的配置;

          8.(1)選擇本地Maven路徑;(2)勾選配置文件后邊的選項,然后修改為本地Maven的配置文件,它會根據配置文件直接找到本地倉庫位置;

          9.配置完后,如果沒有自動導包,可以點擊左上角重新導包按鈕,或者呢個下載按鈕,選擇下載所有源文件和文檔

          10.在templates文件下新建index.html頁面,作為啟動的初始頁面;

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>hello</title>
          </head>
          <body>
              你好!初學者,我是SpringBoot的簡單啟動頁面!
          </body>
          </html>

          11.在com.springboot_learn.test下新建controller文件夾,在controller文件夾下建一個簡單的helloController類;(Controller類要添加@Controller注解,項目啟動時,SpringBoot會自動掃描加載Controller)

          package com.springboot.demo.controller;
          
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;
          
          /**
           * @author 
           * @version 1.0
           * @date 2021/09/07 10:50 上午
           */
          
          /**
           * Web層:就是Controller層,實現與web前端的交互。
           */
          @RestController
          @RequestMapping("/ceshi")
          public class HelloWorldController {
              @RequestMapping("/index")
              public String sayHello(){
                  System.out.println("測試開始");
                  return "index";
              }
          
          }
          

          12.在resources文件夾下application中先配置DataSource基本信息,application文件有兩種文件格式,一種是以.properties為后綴,一種是以.yml為后綴的,兩種配置方式略有差別,。右鍵application文件選擇Refact,選擇Rename,將后綴改為yml;

          spring:
            datasource:
              name: test #數據庫名
              url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false #url
              username: root  #用戶名
              password: 123456  #密碼
              # 升級后的mysql驅動類,Driver位置由com.mysql.jdbc.Driver 變為com.mysql.cj.jdbc.Driver
              driver-class-name: com.mysql.cj.jdbc.Driver #數據庫鏈接驅動
          
          mybatis:
            mapper-locations: classpath:mapper/*.xml  #配置映射文件
            type-aliases-package: package com.springboot.demo.bean #配置實體類

          13.運行項目啟動類TestApplication.java

          14.在瀏覽器中輸入localhost:8080,回車顯示初始的index界面;到這項目的初步搭建已經完成,下面可以下一些簡單的業務邏輯,比如從數據庫獲取信息,登錄之類的簡單功能;

          15.在進行下一步編寫時,我們先來鏈接一下數據庫;點擊右側的Database,點“加號”,新建數據庫鏈接;

          16.填寫數據庫相關信息,點擊Test Connection;需要在本地先搭建Mysql數據庫,database建立test,創建user表.

          17.連接成功后,顯示數據庫信息,user表的基本信息也顯示了,下面就照這個來了;

          19.SpringBoot項目大概分為四層:

          (1)DAO層:包括XxxMapper.java(數據庫訪問接口類),XxxMapper.xml(數據庫鏈接實現);(這個命名,有人喜歡用Dao命名,有人喜歡用Mapper,看個人習慣了吧)

          (2)Bean層:也叫model層,模型層,entity層,實體層,就是數據庫表的映射實體類,存放POJO對象;

          (3)Service層:也叫服務層,業務層,包括XxxService.java(業務接口類),XxxServiceImpl.java(業務實現類);(可以在service文件夾下新建impl文件放業務實現類,也可以把業務實現類單獨放一個文件夾下,更清晰)

          (4)Web層:就是Controller層,實現與web前端的交互。

          依照上面四層,創建目錄結構如下:

          20.代碼展示:

          (1)在application配置文件中添加MyBatis配置:

          spring:
            datasource:
              name: test #數據庫名
              url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false #url
              username: root  #用戶名
              password: 1qaz2wsx  #密碼
              # 升級后的mysql驅動類,Driver位置由com.mysql.jdbc.Driver 變為com.mysql.cj.jdbc.Driver
              driver-class-name: com.mysql.cj.jdbc.Driver #數據庫鏈接驅動
          
          mybatis:
            mapper-locations: classpath:mapper/*.xml  #配置映射文件
            type-aliases-package: package com.springboot.demo.bean #配置實體類

          (2)pom.xml文件配置信息

          <?xml version="1.0" encoding="UTF-8"?>
          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
              <modelVersion>4.0.0</modelVersion>
              <parent>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-parent</artifactId>
                  <version>2.1.6.RELEASE</version>
                  <relativePath/> <!-- lookup parent from repository -->
              </parent>
              <groupId>com.example</groupId>
              <artifactId>test</artifactId>
              <version>0.0.1-SNAPSHOT</version>
              <name>test</name>
              <description>Demo project for Spring Boot</description>
          
              <properties>
                  <java.version>1.8</java.version>
              </properties>
          
              <dependencies>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-jdbc</artifactId>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-thymeleaf</artifactId>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-web</artifactId>
                  </dependency>
                  <dependency>
                      <groupId>org.mybatis.spring.boot</groupId>
                      <artifactId>mybatis-spring-boot-starter</artifactId>
                      <version>2.1.0</version>
                  </dependency>
          
                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                      <version>8.0.11</version>
                      <scope>runtime</scope>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-test</artifactId>
                      <scope>test</scope>
                  </dependency>
              </dependencies>
          
              <build>
                  <plugins>
                      <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                      </plugin>
                  </plugins>
              </build>
          
          </project>
          

          (3)Bean實體類,依據數據庫表,生成set和get方法;

          package com.springboot.demo.bean;
          
          /**
           * @author 
           * @version 1.0
           * @date 2021/09/07 4:27 下午
           */
          /**
           * Bean層:也叫model層,模型層,entity層,實體層,就是數據庫表的映射實體類,存放POJO對象;
           * 依據數據庫表,生成set和get方法;
           */
          public class UserBean {
              private int id;
              private String name;
              private String password;
          
              public int getId() {
                  return id;
              }
          
              public void setId(int id) {
                  this.id = id;
              }
          
              public String getName() {
                  return name;
              }
          
              public void setName(String name) {
                  this.name = name;
              }
          
              public String getPassword() {
                  return password;
              }
          
              public void setPassword(String password) {
                  this.password = password;
              }
          }
          

          (4)DAO層訪問數據庫接口文件:

          package com.springboot.demo.mapper;
          
          import com.springboot.demo.bean.UserBean;
          /**
           * @author 
           * @version 1.0
           * @date 2021/09/07 4:41 下午
           */
          /**
           * DAO層訪問數據庫接口文件
           */
          public interface UserMapper {
          
              UserBean getInfo(String name,String password);
          
          }
          

          5)DAO層訪問數據庫實現文件(需在resource包下創建mapper文件夾,然后再創建一個UserMapper.xml.在application配置文件中mybatis:mapper-locations:對應的就是該文件地址),注意<mapper>標簽的namespace屬性要填寫 訪問數據庫接口類文件路徑:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
          <mapper namespace="com.springboot.demo.mapper.UserMapper">
          
              <select id="getInfo" parameterType="String" resultType="com.springboot.demo.bean.UserBean">
                  SELECT * FROM user WHERE name = #{name} AND password = #{password}
              </select>
          
          </mapper>

          (6)Service層業務接口類編寫:

          package com.springboot.demo.service;
          import com.springboot.demo.bean.UserBean;
          import org.springframework.stereotype.Repository;
          
          /**
           * @author 
           * @version 1.0
           * @date 2021/09/07 4:29 下午
           */
          
          /**
           * Service層:也叫服務層,業務層,包括XxxService.java(業務接口類),XxxServiceImpl.java(業務實現類);
           * (可以在service文件夾下新建impl文件放業務實現類,也可以把業務實現類單獨放一個文件夾下,更清晰
           */
          
          @Repository
          public interface UserService {
          
              UserBean loginIn(String name,String password);
          
          }
          

          (7)Service層業務實現類編寫,注意要注解@Service,注入DAO:

          package com.springboot.demo.impl;
          import com.springboot.demo.bean.UserBean;
          import com.springboot.demo.mapper.UserMapper;
          import com.springboot.demo.service.UserService;
          
          /**
           * @author 
           * @version 1.0
           * @date 2021/09/07 4:48 下午
           */
          /**
           * Service層業務實現類編寫,注意要注解@Service,注入DAO:
           */
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.stereotype.Service;
          
          @Service
          public class UserServiceImpl implements UserService {
          
              //將DAO注入Service層
              @Autowired
              private UserMapper userMapper;
          
              @Override
              public UserBean loginIn(String name, String password) {
                  return userMapper.getInfo(name,password);
              }
          }
          

          8)項目啟動類要添加注解@MapperScan項目啟動時掃描mapper接口,否則會報錯找不到mapper文件:

          package com.springboot.demo;
          
          import org.mybatis.spring.annotation.MapperScan;
          import org.springframework.boot.SpringApplication;
          import org.springframework.boot.autoconfigure.SpringBootApplication;
          
          @SpringBootApplication
          @MapperScan("com.springboot.demo.mapper")
          
          public class DemoApplication {
              public static void main(String[] args) {
                  SpringApplication.run(DemoApplication.class);
              }
          
          }
          

          (9)編寫測試類,看是否能成功 訪問數據庫,獲取數據庫信息:

          package com.springboot.demo;
          
          
          import com.springboot.demo.bean.UserBean;
          import com.springboot.demo.service.UserService;
          import org.junit.Test;
          import org.junit.runner.RunWith;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.boot.test.context.SpringBootTest;
          import org.springframework.test.context.junit4.SpringRunner;
          
          @RunWith(SpringRunner.class)
          @SpringBootTest
          public class TestApplicationTests {
          
              @Autowired
              UserService userService;
          
              @Test
              public void contextLoads() {
                  UserBean userBean = userService.loginIn("springboot", "123456");
                  System.out.println("該用戶ID為:");
                  System.out.println(userBean.getId());
              }
          }

          (10) controller層,注意添加@controller注解,注入Service服務:

          package com.springboot.demo.controller;
          
          /**
           * @author 
           * @version 1.0
           * @date 2021/09/07 4:58 下午
           */
          
          import com.springboot.demo.bean.UserBean;
          import com.springboot.demo.service.UserService;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.stereotype.Controller;
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RequestMethod;
          
          @Controller
          public class LoginController {
          
              //將Service注入Web層
              @Autowired
              UserService userService;
          
              @RequestMapping("/login")
              public String show(){
                  return "login";
              }
          
              @RequestMapping(value = "/loginIn",method = RequestMethod.POST)
              public String login(String name,String password){
                  UserBean userBean = userService.loginIn(name,password);
                  if(userBean!=null){
                      return "success";
                  }else {
                      return "error";
                  }
              }
          }

          (11)html文件:

          login.html

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>login</title>
          </head>
          <body>
              <form role="form" action = "/loginIn" method="post">
                  賬號:<input type="text" id="name" name = "name"> <br>
                  密碼:<input type="password" id = "password" name = "password"> <br>
                  <input type="submit" id = "login" value = "login">
              </form>
           
          </body>
          </html>

          success.html

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>success</title>
          </head>
          <body>
              <h1>登錄成功!</h1>
          </body>
          </html>

          error.html

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>error</title>
          </head>
          <body>
              <h1>登錄失?。?lt;/h1>
          </body>
          </html>

          21.先運行測試類,看是否成功獲取數據庫信息:

          22.運行TestApplication.java文件,啟動項目,無任何WARN警告信息,進入瀏覽器輸入localhost:8080/login




          項目到這里就算完美結束了,對自己說一聲,加油,努力學習。

          分享是人們與社會產生聯系的一種方式,本質上是一種互利行為,在互利中,選擇、鞏固和發展彼此的社會關系。完全沒有分享,社會將不能成立。分享是構成社會的要素之一。


          主站蜘蛛池模板: 国产精品一区二区久久乐下载| 国产一区二区精品久久岳√| 国产福利电影一区二区三区久久老子无码午夜伦不 | 性色av一区二区三区夜夜嗨| 国产91精品一区二区麻豆亚洲| 成人免费区一区二区三区| 亚洲AV无码一区二区三区人 | 国产成人精品一区二区三区免费 | 成人区人妻精品一区二区不卡视频 | 精品国产一区二区三区无码| 男人的天堂亚洲一区二区三区| 亚洲无线码在线一区观看| 日韩一区二区在线免费观看| 无码少妇一区二区| 日韩精品在线一区二区| 国产精品视频无圣光一区| 伊人色综合一区二区三区影院视频| 美女视频一区二区| 国产一区风间由美在线观看| 亚洲av综合av一区二区三区| 日韩AV无码久久一区二区| 国产精品高清一区二区三区| 国产色情一区二区三区在线播放| 日韩AV无码一区二区三区不卡| 成人丝袜激情一区二区| 日本一区二区三区久久| 高清一区二区三区视频| 一本色道久久综合一区| 中文字幕在线精品视频入口一区| 亚洲色精品aⅴ一区区三区| 国产在线精品一区二区在线观看| 日韩精品一区二区三区四区| 精品人妻AV一区二区三区| 国产精品日韩一区二区三区| 高清一区二区三区| 国产福利微拍精品一区二区| 国产aⅴ精品一区二区三区久久| 美女AV一区二区三区| 无码人妻AⅤ一区二区三区| 国产精品久久无码一区二区三区网| 国产精品一区电影|