Skrive IntelliJ IDEA-plugins ved hjelp av Gradle

1. Introduksjon

I løpet av de siste årene har IntelliJ fra JetBrains raskt blitt topp IDE for Java-utviklere. I vår siste State of Java-rapport var IntelliJ den valgte IDE for 61% av respondentene, opp fra 55% året før.

En funksjon som gjør IntelliJ så attraktivt for Java-utviklere er muligheten til å utvide og opprette ny funksjonalitet ved hjelp av plugins.

I denne opplæringen vil vi se på å skrive et IntelliJ-plugin ved hjelp av den nye anbefalte måten med Gradle for å demonstrere noen måter vi kan utvide IDE på. Denne artikkelen er en omblanding av en tidligere som beskriver opprettelsen av det samme pluginet ved hjelp av Plugin Devkit.

2. Hovedtyper av plugins

De vanligste typene av plugins inkluderer funksjonalitet for:

  • Støtte for tilpasset språk: evnen til å skrive, tolke og kompilere kode skrevet på forskjellige språk
  • Rammeverk integrasjon: støtte for tredjepartsrammer som Spring
  • Verktøyintegrasjon: integrering med eksterne verktøy som Gradle
  • Tillegg for brukergrensesnitt: nye menyelementer, verktøyvinduer, fremdriftslinjer og mer

Plugins vil ofte falle i flere kategorier. For eksempel samhandler Git-pluginet som leveres med IntelliJ med git kjørbar installert på systemet. Plugin har verktøyvindu og popup-menyelementer, samtidig som det integreres i arbeidsflyten for prosjektoppretting, preferansevindu og mer.

3. Opprett et plugin

Det er to måter å lage plugins på. Vi bruker den anbefalte måten for nye prosjekter med Gradle i stedet for å bruke deres Plugin Devkit.

Å lage et Gradle-basert plugin gjøres ved å bruke Nytt> Prosjekt Meny.

Merk at vi må inkludere Java og IntelliJ Platform Plugin for å sikre at nødvendige plugin-klasser er tilgjengelige på klassestien.

Når dette skrives, vi kan bare bruke JDK 8 til å skrive IntelliJ-plugins.

4. Eksempel på plugin

Vi oppretter et plugin som gir rask tilgang til det populære Stack Overflow-nettstedet fra flere områder i IDE. Det inkluderer:

  • et Verktøy-menyelement for å gå til siden Still et spørsmål
  • et popup-menyelement i både teksteditor og konsollutgang for å søke i Stack Overflow etter uthevet tekst

4.1. Opprette handlinger

Handlinger er den vanligste måten å få tilgang til et plugin. Handlinger blir utløst av hendelser i IDE, for eksempel å klikke på et menyelement eller en verktøylinjeknapp.

Det første trinnet i å lage en handling er å lage en Java-klasse som utvides Et tiltak. For vårt Stack Overflow-plugin oppretter vi to handlinger.

Den første handlingen åpner siden Still et spørsmål i et nytt nettleservindu:

offentlig klasse AskQuestionAction utvider AnAction {@Override public void actionPerformed (AnActionEvent e) {BrowserUtil.browse ("// stackoverflow.com/questions/ask"); }}

Vi bruker den innebygde BrowserUtil klasse for å håndtere alle nyansene ved å åpne en webside på forskjellige operativsystemer og nettlesere.

Vi trenger to parametere for å utføre et søk på StackOverflow: språketaggen og teksten du skal søke etter.

For å få språkmerken bruker vi PSI (Program Structure Interface). Denne API-en analyserer alle filene i et prosjekt og gir en programmatisk måte å inspisere dem på.

I dette tilfellet bruker vi PSI til å bestemme programmeringsspråket til en fil:

Valgfri psiFile = Optional.ofNullable (e.getData (LangDataKeys.PSI_FILE)); String languageTag = psiFile.map (PsiFile :: getLanguage) .map (Language :: getDisplayName) .map (String :: toLowerCase) .map (lang -> "[" + lang + "]") .orElse ("") ;

For å få teksten å søke etter, bruker vi Redaktør API for å hente uthevet tekst på skjermen:

Editor editor = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); Streng valgtTekst = caretModel.getCurrentCaret (). GetSelectedText ();

Selv om denne handlingen er den samme for både redigerings- og konsollvinduer, fungerer tilgang på den valgte teksten på samme måte.

Nå kan vi sette alt sammen i en handling utført erklæring:

@Override public void actionPerformed (@NotNull AnActionEvent e) {Optional psiFile = Optional.ofNullable (e.getData (LangDataKeys.PSI_FILE)); String languageTag = psiFile.map (PsiFile :: getLanguage) .map (Language :: getDisplayName) .map (String :: toLowerCase) .map (lang -> "[" + lang + "]"). OrElse ("") ; Editor editor = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); Streng valgtTekst = caretModel.getCurrentCaret (). GetSelectedText (); BrowserUtil.browser ("// stackoverflow.com/search?q=" + språkTag + valgt tekst); }

Denne handlingen overstyrer også den andre metoden som heter Oppdater, som lar oss aktivere eller deaktivere handlingen under forskjellige forhold. I dette tilfellet deaktiverer vi søkehandlingen hvis det ikke er valgt tekst:

Editor editor = e.getRequiredData (CommonDataKeys.EDITOR); CaretModel caretModel = editor.getCaretModel (); e.getPresentation (). setEnabledAndVisible (caretModel.getCurrentCaret (). hasSelection ());

4.2. Registrere handlinger

Når vi har skrevet handlingene våre, vi må registrere dem med IDE. Det er to måter å gjøre dette på.

Den første måten er å bruke plugin.xml fil, som blir opprettet for oss når vi starter et nytt prosjekt.

Som standard vil filen ha en tom element, det er der vi legger til handlingene våre:

Å bruke XML-filen til å registrere handlinger vil sikre at de registreres under IDE-oppstart, noe som vanligvis er å foretrekke.

Den andre måten å registrere handlinger på er programmatisk å bruke ActionManager klasse:

ActionManager.getInstance (). RegisterAction ("StackOverflow.SearchAction", ny SearchAction ());

Dette har fordelen av å la oss registrere handlinger dynamisk. For eksempel, hvis vi skriver et plugin for å integrere med et eksternt API, vil vi kanskje registrere et annet sett med handlinger basert på versjonen av API-en som vi kaller.

Ulempen med denne tilnærmingen er at handlinger ikke registreres ved oppstart. Vi må lage en forekomst av ApplicationComponent for å administrere handlinger, noe som krever mer koding og XML-konfigurasjon.

5. Testing av programtillegget

Som med alle programmer, krever det å teste et IntelliJ-plugin. For et lite plugin som det vi har skrevet, er det tilstrekkelig for å sikre at plugin kompileres og at handlingene vi opprettet fungerer som forventet når vi klikker på dem.

Vi kan teste (og feilsøke) pluginet vårt manuelt ved å åpne Gradle-verktøyvinduet og utføre runIde oppgave:

Dette vil starte en ny forekomst av IntelliJ med pluginet vårt aktivert. Ved å gjøre det kan vi klikke på de forskjellige menyelementene vi opprettet og sikre at de riktige Stack Overflow-sidene åpnes.

Hvis vi ønsker å gjøre mer tradisjonelle enhetstester, gir IntelliJ et hodeløst miljø for å kjøre enhetstester. Vi kan skrive tester ved hjelp av hvilket som helst testrammeverk vi ønsker, og testene kjøres ved hjelp av ekte, ulåste komponenter fra IDE.

6. Distribuere programtillegget

Gradle Plugin er en enkel måte å pakke plugins på slik at vi kan installere og distribuere dem. Åpne bare Gradle-verktøyvinduet og kjør buildPlugin oppgave. Dette vil generere en ZIP-fil inne i bygge / distribusjoner katalog.

Den genererte ZIP-filen inneholder koden og konfigurasjonsfilene som trengs for å lastes inn i IntelliJ. Vi kan installere det lokalt, eller publisere det til et plugin-depot for bruk av andre.

Skjermbildet nedenfor viser et av de nye Stack Overflow-menyelementene i aksjon:

7. Konklusjon

I denne artikkelen utviklet vi et enkelt plugin som fremhever hvordan vi kan forbedre IntelliJ IDE.

Mens vi primært jobber med handlinger, tilbyr IntelliJ plugin SDK flere måter å legge til ny funksjonalitet i IDE. For videre lesing, sjekk ut deres offisielle startveiledning.

Som alltid kan den fullstendige koden for eksempelpluginet vårt finnes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found