IntelliJ IDEA bővítmények írása
1. Bemutatkozás
Az elmúlt néhány évben a JetBrains IntelliJ-je gyorsan a legjobb fejlesztői IDE lett. Legutóbbi Java állapot jelentésünkben az IntelliJ volt a választott IDE a válaszadók 55% -ánál, szemben az előző évi 48% -kal.
Az egyik olyan szolgáltatás, amely annyira vonzóvá teszi az IntelliJ-t a Java fejlesztők számára, az a lehetőség, hogy bővítményekkel bővítheti és új funkciókat hozhat létre. Ebben az oktatóanyagban megvizsgáljuk az IntelliJ beépülő modul írását, hogy bemutassuk az IDE kiterjesztésének néhány módját.
És vegye figyelembe, hogy bár ez a cikk az IntelliJ beépülő modulokra összpontosít, az összes JetBrains IDE közös kóddal rendelkezik. Ebből kifolyólag, az itt alkalmazott technikák közül sok alkalmazható más JetBrain IDE-kre is mint például a PyCharm, a RubyMine és még sok más.
2. A beépülő modul funkciója
Az IntelliJ beépülő moduljának funkcionalitása általában a 4 kategória egyikébe tartozik:
- Egyéni nyelvek: a különféle nyelveken írt kód írásának, értelmezésének és összeállításának képessége
- Keretek: olyan harmadik fél keretrendszereinek támogatása, mint a tavasz
- Eszközök: integráció olyan külső eszközökkel, mint a Gradle
- A felhasználói felület kiegészítői: új menüpontok, eszközablakok és gombok és egyebek
A beépülő modulok gyakran több kategóriába sorolhatók. Például az IntelliJ-vel együtt szállított Git plugin kölcsönhatásba lép a rendszerre telepített git futtatható programmal. A beépülő modul biztosítja az eszközablakot és a felugró menüelemeket, ugyanakkor integrálódik a projekt létrehozásának munkafolyamatába, a beállítások ablakába és egyebekbe is.
3. Plugin létrehozása
Az IntelliJ beépülő modulok használatának legegyszerűbb módja a Plugin DevKit használata. Ez elérhető a Új >Projekt menü:
Ne feledje, hogy JetBrains JDK-t kell használnunk annak biztosítása érdekében, hogy a szükséges plugin osztályok elérhetőek legyenek az osztályúton. Az IntelliJ-nek alapértelmezés szerint megfelelő JDK-val kell rendelkeznie, de ha nem, innen letölthetünk egyet.
Az írás kezdetén csak a Java 8-at használhatjuk az IntelliJ bővítmények írásához. Ennek oka, hogy a JetBrains jelenleg nem biztosít hivatalos JDK-t Java 9 vagy újabb verzióhoz.
4. Példa beépülő modulra
Az IntelliJ beépülő modul írásának bemutatásához létrehozunk egy beépülő modult, amely gyors hozzáférést biztosít a népszerű Stack Overflow webhelyhez az IDE több területéről. Hozzáadjuk:
- Az Eszközök menüpont segítségével keresse fel a Kérdés feltevése oldalt
- Egy felugró menüelem mind a szövegszerkesztőben, mind a konzol kimenetében megkeresheti a kiemelt szöveget a Túlcsordulásban.
4.1. Műveletek létrehozása
A műveletek az IntelliJ bővítmények írásakor használt fő összetevők. A műveleteket az IDE eseményei váltják ki, például egy menüpontra vagy az eszköztár gombra kattintva.
A művelet létrehozásának első lépése egy kiterjesztő Java osztály létrehozása Egy bevetés. A Stack Overflow bővítményünkhöz 2 műveletet hozunk létre.
Az első művelet megnyitja a Kérdés feltevése oldalt egy új böngészőablakban:
public class AskQuestionAction kiterjeszti az AnAction {@Override public void actionPerformed (AnActionEvent e) {BrowserUtil.browse ("// stackoverflow.com/questions/ask"); }}
A beépítettet használjuk BrowserUtil osztály, mert kezeli a weblap különböző operációs rendszereken és böngészőkben történő megnyitásának minden árnyalatát.
A második művelet megnyitja a Verem túlcsordulás keresési oldalát, és lekérdezési karakterláncként továbbítja a keresési szöveget. Ezúttal két módszert alkalmazunk.
Az első módszer, amelyet megvalósítunk, pont olyan, mint az első műveletünk, és kezeli a webböngésző megnyitását.
Először azonban két értéket kell összegyűjtenünk a StackOverflow számára. Az egyik a nyelvi címke, a másik pedig a keresendő szöveg.
A nyelvi címke megszerzéséhez a Program Structure Interface-t fogjuk használni. Ez az API elemzi a projekt összes fájlját, és programozott módon biztosítja azok ellenőrzését.
Ebben az esetben a PSI-t használjuk a fájl programozási nyelvének meghatározásához:
PsiFile fájl = e.getData (CommonDataKeys.PSI_FILE); Nyelv lang = e.getData (CommonDataKeys.PSI_FILE) .getLanguage (); String languageTag = "+ [" + lang.getDisplayName (). ToLowerCase () + "]";
Ne feledje, hogy a PSI nyelvspecifikus részleteket is tartalmaz egy fájlról. Például, használhatnánk a PSI-t, hogy megtaláljuk az összes nyilvános módszert egy Java osztályban.
A keresni kívánt szöveg használatához a Szerkesztő API a kijelölt szöveg lekéréséhez a képernyőn:
végső szerkesztő szerkesztő = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); String selectedText = caretModel.getCurrentCaret (). GetSelectedText ();
Annak ellenére, hogy ez a művelet mind a szerkesztő, mind a konzol ablakban megegyezik, a kiválasztott szöveg elérése ugyanúgy működik.
Most mindezt össze tudjuk rakni egy actionPerformed nyilatkozat:
@Orride public void actionPerformed (AnActionEvent e) {PsiFile file = e.getData (CommonDataKeys.PSI_FILE); Nyelv lang = e.getData (CommonDataKeys.PSI_FILE) .getLanguage (); String languageTag = "+ [" + lang.getDisplayName (). ToLowerCase () + "]"; Szerkesztőszerkesztő = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); Karakterlánc kiválasztvaText = caretModel.getCurrentCaret (). GetSelectedText () Karakterlánc lekérdezése = selectedText.replace ('', '+') + languageTag; BrowserUtil.browse ("// stackoverflow.com/search?q=" + lekérdezés); }
Ez a művelet felülír egy második elnevezett módszert is frissítés. Ez lehetővé teszi számunkra a művelet engedélyezését vagy letiltását különböző feltételek mellett.
Ebben az esetben letiltjuk a keresési műveletet, ha nincs kiválasztott szöveg:
@Orride public void update (AnActionEvent e) {Editor editor = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); e.getPresentation (). setEnabledAndVisible (caretModel.getCurrentCaret (). hasSelection ()); }
4.2. Műveletek regisztrálása
Miután megírtuk a tetteinket, regisztrálnunk kell őket az IDE-nél. Ennek kétféle módja van.
Az első módszer a plugin.xml fájl, amelyet akkor hozunk létre, amikor új projektet indítunk.
Alapértelmezés szerint a fájl üres lesz elem, amelyhez hozzáadjuk a tetteinket:
Az XML fájl használata a műveletek regisztrálásához biztosítja, hogy az IDE indításakor regisztráljanak, ami általában előnyösebb.
A műveletek regisztrálásának második módja a ActionManager osztály:
ActionManager.getInstance (). RegisterAction ("StackOverflow.SearchAction", új SearchAction ());
Ennek az az előnye, hogy dinamikusan regisztrálhatjuk a műveleteket. Például, ha egy beépülő modult írunk egy távoli API-val való integrációhoz, akkor érdemes egy másik műveletkészletet regisztrálni az API általunk hívott verziója alapján.
Ennek a megközelítésnek az a hátránya, hogy az indításkor a műveletek nem regisztrálódnak. Létre kell hoznunk a ApplicationComponent műveletek kezelése, amely több kódolást és XML-konfigurációt igényel.
5. A beépülő modul tesztelése
Mint minden programnál, az IntelliJ bővítmény írásához is tesztelni kell. Egy olyan kis pluginhoz, mint amilyet írtunk, elegendő annak biztosítása, hogy a plugin leforduljon, és hogy az általunk létrehozott műveletek a várakozásoknak megfelelően működjenek, amikor rájuk kattintunk.
Plugin futtatási konfigurációjával manuálisan tesztelhetjük (és hibakereshetjük) a beépülő modulunkat:
Ez elindítja az IntelliJ új példányát, aktiválva a beépülő modulunkat. Ez lehetővé teszi számunkra, hogy rákattintsunk az általunk létrehozott különböző menüelemekre, és biztosítsuk a megfelelő Stack Overflow oldalak megnyílását.
Ha hagyományosabb egységvizsgálatot szeretne végezni, az IntelliJ fejetlen környezetet biztosít az egységtesztek futtatásához. Teszteket írhatunk bármilyen tetszőleges keretrendszer segítségével, és a tesztek az IDE valós, gúnyolatlan komponenseinek felhasználásával futnak.
6. A beépülő modul telepítése
A DevKit plugin egyszerű módot kínál a beépülő modulok csomagolására, így telepíteni és terjeszteni tudjuk őket. Egyszerűen kattintson a jobb gombbal a beépülő modulra, és válassza a „Bővítménymodul előkészítése a telepítéshez” lehetőséget. Ez létrehoz egy JAR fájlt a projektkönyvtárban.
A létrehozott JAR fájl tartalmazza az IntelliJ-be való betöltéshez szükséges kódot és konfigurációs fájlokat. Telepítheti helyileg, vagy közzéteheti egy plugin tárolóban mások számára.
Az alábbi képernyőképen látható az egyik új Stack Overflow menüelem:
7. Következtetés
Ebben a cikkben kifejlesztettünk egy egyszerű plugint, amely csak néhányat emel ki arról, hogyan javíthatjuk az IntelliJ IDE-t.
Míg elsősorban műveletekkel dolgoztunk, az IntelliJ plugin SDK számos lehetőséget kínál az új funkciók hozzáadásához az IDE-hez. További olvasmányért olvassa el a hivatalos kezdési útmutatót.
Mint mindig, a bővítményminta teljes kódja megtalálható a GitHub-tárunkban.