{"id":683097,"date":"2026-02-23T01:53:31","date_gmt":"2026-02-23T00:53:31","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=platform&#038;p=683097"},"modified":"2026-02-23T01:53:35","modified_gmt":"2026-02-23T00:53:35","slug":"qodana-erweitern-benutzerdefinierte-codeinspektionen-erstellen","status":"publish","type":"platform","link":"https:\/\/blog.jetbrains.com\/de\/platform\/2026\/02\/qodana-erweitern-benutzerdefinierte-codeinspektionen-erstellen\/","title":{"rendered":"Qodana erweitern: Benutzerdefinierte Codeinspektionen erstellen"},"content":{"rendered":"<p>Qodana ist ein statisches Codeanalyse-Tool, das <a href=\"https:\/\/www.jetbrains.com\/help\/idea\/code-inspection.html\" target=\"_blank\" rel=\"noreferrer noopener\">Codeinspektionen<\/a> und Quick-Fixes aus JetBrains-IDEs in Continuous-Integration-Systeme einbindet. Es kann in der <a href=\"https:\/\/qodana.cloud\" target=\"_blank\" rel=\"noreferrer noopener\">Cloud<\/a> oder in einem <a href=\"https:\/\/github.com\/JetBrains\/qodana-cli\" target=\"_blank\" rel=\"noreferrer noopener\">Docker-Container<\/a> ausgef\u00fchrt, in CI\/CD-Pipelines <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/ci.html\" target=\"_blank\" rel=\"noopener\">integriert<\/a> oder in einer JetBrains-IDE aufgerufen werden.<\/p>\n<p>Qodana bringt von Haus aus eine beeindruckende Reihe von Inspektionen mit, ist jedoch nicht auf diese beschr\u00e4nkt. Sie k\u00f6nnen selbst definierte Inspektionen hinzuf\u00fcgen, um projektspezifische Anforderungen und Konventionen durchzusetzen.<\/p>\n<p>Nehmen wir zum Beispiel an, Sie haben ein Projekt mit folgender Codekonvention:<\/p>\n<blockquote class=\"wp-block-quote\">\n<p>Jede Kotlin-Klasse in einem <code>service<\/code><mark class=\"has-inline-color\" style=\"color: #1c8212;\"> <\/mark>-Paket muss auf <code>Service<\/code> enden.<\/p>\n<\/blockquote>\n<p><code>com.jetbrains.service.JetComponent<\/code> w\u00fcrde nicht dieser Konvention entsprechen, <code>com.jetbrains.service.BrainComponentService<\/code> hingegen schon. Im Folgenden erstellen wir ein Plugin, das diese Inspektion implementiert, sodass Qodana diese Konvention in zuk\u00fcnftigen Projekten durchsetzen kann.<\/p>\n<p>Wir k\u00f6nnen diese Codekonvention implementieren, indem wir eine benutzerdefinierte <strong>Codeinspektion<\/strong> erstellen, die in einem <strong>Plugin<\/strong> bereitgestellt wird. Qodana-Plugins werden \u00e4hnlich wie JetBrains-IDE-Plugins entwickelt, das hei\u00dft, wir m\u00fcssen einfach ein IntelliJ-Plattform-Plugin erstellen, das in Qodana ausgef\u00fchrt werden kann. Hier ist ein kurzer \u00dcberblick \u00fcber die Schritte, die wir durchf\u00fchren werden:<\/p>\n<ol>\n<li>Projekt aus dem <a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-plugin-template\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ Platform Plugin Template<\/a> initialisieren.<\/li>\n<li>Die Projekteigenschaften und die Plugin-Beschreibung anpassen, zusammen mit den ben\u00f6tigten Abh\u00e4ngigkeiten.<\/li>\n<li>Die lokale Inspektion in der Plugin-Beschreibung deklarieren und in Kotlin implementieren.<\/li>\n<li>Das Plugin kompilieren und ein Paket erstellen.<\/li>\n<li>Im Beispielprojekt das Plugin-Artefakt in ein geeignetes Verzeichnis kopieren.<\/li>\n<li>Die Qodana-Konfigurationsdatei anpassen.<\/li>\n<li>Qodana starten und den Bericht \u00fcberpr\u00fcfen.<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\">Plugin-Projekt vorbereiten<\/h2>\n<p>Um das Projekt zu starten, besuchen Sie das Repository <a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-gradle-plugin\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ Platform Plugin Template<\/a> und klicken Sie auf die Schaltfl\u00e4che <em>Use this template<\/em>, um ein Plugin-Repository zu erstellen. Geben Sie als Namen <code>classname-inspection-qodana-plugin<\/code> ein, kopieren Sie die Projekt-URL und \u00f6ffnen Sie sie in IntelliJ IDEA. Wenn das Projekt einsatzbereit ist, passen Sie die Datei <code>gradle.properties<\/code> an, indem Sie <code>pluginGroup<\/code>, <code>pluginName<\/code> und <code>pluginRepositoryUrl<\/code> entsprechend deklarieren. Vergessen Sie nicht, auf die schwebende Schaltfl\u00e4che <em>Sync Gradle Changes<\/em> zu klicken, um die \u00c4nderungen zu \u00fcbernehmen. Um den eindeutigen <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/plugin-configuration-file.html#idea-plugin__id\" target=\"_blank\" rel=\"noreferrer noopener\">Plugin-Bezeichner<\/a> zu \u00e4ndern, modifizieren Sie den Eintrag <code>id<\/code> in der Plugin-Beschreibungsdatei <code>plugin.xml<\/code>.<\/p>\n<h3 class=\"wp-block-heading\">Abh\u00e4ngigkeiten deklarieren<\/h3>\n<p>Unsere Codeinspektion gilt f\u00fcr Kotlin-Klassen, daher m\u00fcssen wir das Kotlin-Plugin zu den Abh\u00e4ngigkeiten des Qodana-Plugins hinzuf\u00fcgen. In der Datei <code>gradle.properties<\/code> m\u00fcssen Sie Folgendes deklarieren:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">platformBundledPlugins = org.jetbrains.kotlin<\/pre>\n<p>Dar\u00fcber hinaus muss in den Abh\u00e4ngigkeiten der Plugin-Beschreibungsdatei <code>plugin.xml<\/code> dasselbe geb\u00fcndelte Kotlin-Plugin enthalten sein:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">org.jetbrains.kotlin<\/pre>\n<p>Achten Sie wieder darauf, die Gradle-\u00c4nderungen zu synchronisieren, indem Sie auf die schwebende Schaltfl\u00e4che klicken.<\/p>\n<p>Dar\u00fcber hinaus muss die Kotlin-Klasseninspektion den Kotlin-Compiler K2 unterst\u00fctzen, der seit Version 2025.1 der IntelliJ-Plattform standardm\u00e4\u00dfig aktiviert ist. Deklarieren Sie in der Plugin-Beschreibungsdatei die Erweiterung <code>org.jetbrains.kotlin.supportsKotlinPluginMode<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    \n<\/pre>\n<h3 class=\"wp-block-heading\">Codeinspektion erstellen<\/h3>\n<p>Der tats\u00e4chliche Code f\u00fcr jede Codeinspektion f\u00fcr Kotlin-Klassen erfordert drei Schritte:<\/p>\n<ol>\n<li>Eine <code>com.intellij.localInspection<\/code>-Erweiterung in der Plugin-Beschreibungsdatei deklarieren, zusammen mit den ben\u00f6tigten Attributen und einem vollst\u00e4ndig qualifizierten Verweis auf die Implementierungsklasse.<\/li>\n<li>Eine Implementierungsklasse erstellen \u2013 vorzugsweise in Kotlin.<\/li>\n<li>Eine separate HTML-Datei mit einer Beschreibung der Inspektion, der Nutzungsanleitung und einem Beispiel anlegen.<\/li>\n<\/ol>\n<h4 class=\"wp-block-heading\">Erweiterung deklarieren<\/h4>\n<p>Tragen Sie die folgende Deklaration in die Plugin-Beschreibungsdatei <code>plugin.xml<\/code> ein:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    \n<\/pre>\n<p>Das Attribut <code>language<\/code> gibt an, dass die Inspektion f\u00fcr Kotlin-Quellcodedateien gilt. Es ist wichtig, die Inspektion explizit als standardm\u00e4\u00dfig aktiviert zu deklarieren, da Qodana sie andernfalls nicht ausf\u00fchrt. Geben Sie anschlie\u00dfend einen leicht lesbaren, aussagekr\u00e4ftigen Anzeigenamen unter <code>displayName<\/code> ein, der im Bericht und in den Einstellungen angezeigt werden soll. Das Attribut <code>groupName<\/code> legt die Inspektionskategorie fest, die sowohl im Qodana-Bericht als auch in den IDE-Einstellungen angezeigt wird. Geben Sie schlie\u00dflich einen vollst\u00e4ndig qualifizierten Namen f\u00fcr die Implementierungsklasse ein.<\/p>\n<h4 class=\"wp-block-heading\">Quellcode der Codeinspektion<\/h4>\n<p>Das Kotlin-Plugin stellt eine n\u00fctzliche Basis-Inspektionsklasse f\u00fcr Kotlin-Inspektionen bereit: <code>AbstractKotlinInspection<\/code>. \u00dcberschreiben Sie die Methode <code>buildVisitor<\/code> und stellen Sie eine PSI-Visitor-Instanz bereit, die die Kotlin-Klassenelemente auf typsichere Weise durchl\u00e4uft. <code>classVisitor<\/code> ist eine praktische DSL-\u00e4hnliche Funktion, die den ben\u00f6tigten PSI-Visitor zur\u00fcckgibt und f\u00fcr jede Kotlin-Klasse im analysierten Projekt aufgerufen wird.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package org.intellij.sdk.codeInspection\n\nimport com.intellij.codeInspection.ProblemHighlightType\nimport com.intellij.codeInspection.ProblemsHolder\nimport com.intellij.psi.PsiElementVisitor\nimport org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.AbstractKotlinInspection\nimport org.jetbrains.kotlin.psi.KtClass\nimport org.jetbrains.kotlin.psi.KtVisitorVoid\nimport org.jetbrains.kotlin.psi.classVisitor\n\nclass ServicePackageClassNameInspection : AbstractKotlinInspection() {\n    override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean) = classVisitor { klass -&gt;\n        val classNamePsi = klass.nameIdentifier ?: return@classVisitor\n        val classFqn = klass.fqName?.asString() ?: return@classVisitor\n        if (klass.packageLastComponent == \"service\" &amp;&amp; !classFqn.endsWith(\"Service\")) {\n            holder.registerProblem(\n                classNamePsi,\n                \"Class name in the 'service' package must have a 'Service' suffix\"\n            )\n        }\n    }\n\n    private val KtClass.packageLastComponent: String\n        get() = containingKtFile.packageFqName.shortName().asString()\n}<\/pre>\n<p>Die Visitor-Unterklasse extrahiert den vollst\u00e4ndig qualifizierten Kotlin-Klassennamen, untersucht das \u00e4u\u00dferste rechte Paketelement und pr\u00fcft dieses auf das entsprechende Suffix. Unzul\u00e4ssige Klassennamen werden an die <code>ProblemsHolder<\/code>-Instanz gemeldet, eingeschlossen in eine PSI-Elementklasse und mit einer f\u00fcr Menschen lesbaren Problembeschreibung.<\/p>\n<h4 class=\"wp-block-heading\">Inspektionsbeschreibung<\/h4>\n<p>F\u00fcr jede lokale Inspektion muss eine Beschreibungsdatei im HTML-Format bereitgestellt werden. Wenn Sie den Quick-Fix <em>Create description file ServicePackageClassNameInspection.html<\/em> anwenden, wird im richtigen Verzeichnis eine Datei mit dem Namen <code>src\/main\/resources\/inspectionDescriptions\/ServicePackageClassName.html<\/code> angelegt. Sie m\u00fcssen auch eine Beschreibung bereitstellen, die im Qodana-Bericht und in den IDE-Einstellungen angezeigt wird.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Reports class names in the <code>service<\/code> packages that lack the <code>Service<\/code> suffix. <b>Example:<\/b><\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">\n  package com.example.foo.service\n  class SomeComponent {\n    \/* class members *\/\n  }<\/pre>\n<h2 class=\"wp-block-heading\">Plugin kompilieren<\/h2>\n<p>Jetzt ist alles vorbereitet \u2013 wir k\u00f6nnen die Kompilierung starten! F\u00fchren Sie den Gradle-Task <code>buildPlugin<\/code> aus und \u00fcberpr\u00fcfen Sie das Artefakt <code>build\/distributions\/qodana-code-inspection-0.0.1.zip<\/code>, das im Gradle-Ausgabeverzeichnis bereitgestellt wird. Die JAR-Datei wird als Hauptartefakt im Qodana-Scan verwendet.<\/p>\n<h4 class=\"wp-block-heading\">Typ des Plugin-Artefakts beachten<\/h4>\n<p>Qodana unterst\u00fctzt keine lokalen ZIP-Plugin-Artefakte, die zus\u00e4tzliche JAR-Archive oder Drittanbieter-Abh\u00e4ngigkeiten enthalten. Jedes Plugin muss als einzelne JAR-Datei vorliegen oder in ein bestimmtes Verzeichnis entpackt werden.<\/p>\n<h2 class=\"wp-block-heading\">Playground-Projekt mit Qodana pr\u00fcfen<\/h2>\n<p>Nachdem wir nun Qodana mit unserem Plugin erweitert haben, erstellen wir ein Playground-Projekt in Kotlin, das wir mit Qodana analysieren k\u00f6nnen. Um das Qodana-Plugin lokal auszuf\u00fchren, stellen Sie sicher, dass zwei Softwarekomponenten auf Ihrem System verf\u00fcgbar sind:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/JetBrains\/qodana-cli\" target=\"_blank\" rel=\"noreferrer noopener\">Qodana CLI<\/a><\/li>\n<\/ul>\n<p>Unser Playground-Projekt sollte eine Klasse namens <code>src\/main\/kotlin\/org\/intellij\/sdk\/qodana\/service\/SomeComponent.kt<\/code> enthalten, die nicht unserer Codekonvention entspricht, da sie nicht auf <code>Service<\/code> endet. Es gibt zwei M\u00f6glichkeiten, das Qodana-Plugin in Qodana einzubinden:<\/p>\n<ul>\n<li>Im JetBrains Marketplace ver\u00f6ffentlichen.<\/li>\n<li>Das JAR-Artefakt des Plugins in das <code>.qodana<\/code>-Verzeichnis Ihres Projekts kopieren \u2013 die schnellere Methode.<\/li>\n<\/ul>\n<p>Um den Buildvorgang zu vereinfachen, kopieren Sie die Datei <code>build\/distributions\/qodana-code-inspection-0.0.1.zip<\/code> aus dem Plugin-Projekt in die Datei <code>.qodana\/qodana-code-inspection-0.0.1.zip<\/code> im Playground-Projekt. Erstellen Sie das Verzeichnis <code>.qodana<\/code>, falls noch nicht vorhanden. Entpacken Sie anschlie\u00dfend das Archiv mit Ihrem bevorzugten Programm oder Tool. Qodana kann auf das Plugin im Verzeichnis <code>build\/distributions\/qodana-codeinspection<\/code> zugreifen.<\/p>\n<p>Dar\u00fcber hinaus muss Qodana so konfiguriert werden, dass es unsere benutzerdefinierte Codeinspektion verwendet. Nehmen Sie in der Datei <code>qodana.yaml<\/code> im Stammverzeichnis des Playground-Projekts die folgenden \u00c4nderungen vor:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: \"1.0\"\nlinter: qodana-jvm-community\ninclude:\n  - name: org.intellij.sdk.codeInspection.ServicePackageClassNameInspection<\/pre>\n<p>Der <code>include<\/code>-Block muss auf den vollst\u00e4ndig qualifizierten Klassennamen der vom Plugin bereitgestellten Codeinspektion verweisen. F\u00fchren Sie nun im Terminal den folgenden Befehl aus, um Qodana zu starten:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">qodana scan --volume $PWD\/.qodana\/qodana-code-inspection:\/opt\/idea\/custom-plugins\/qodana-code-inspection<\/pre>\n<p>Dadurch wird das entsprechende Qodana-Docker-Image heruntergeladen. Ein Docker-Container wird erstellt und unter Verwendung der Qodana-Konfiguration ausgef\u00fchrt. Damit das benutzerdefinierte Plugin f\u00fcr Qodana erreichbar ist, mounten Sie das Qodana-Plugin-Verzeichnis aus dem lokalen Dateisystem in das entsprechende Verzeichnis des Qodana-Docker-Containers. Nach einigen Minuten erstellt Qodana eine Berichtszusammenfassung und gibt diese \u00fcber die Standardausgabe aus.<\/p>\n<pre class=\"EnlighterJSRAW\">Qodana - Detailed summary                                                                                                                                                                                                                \nAnalysis results: 1 problem detected                                                                                                                                                                                                     \nBy severity: High - 1                                                                                                                                                                                                                    \n-------------------------------------------------------                                                                                                                              \nName                           Severity  Problems count                                                                                                                                                             \n-------------------------------------------------------                                                                                                                              \nSDK: Discouraged class name    High      1                                                                                                                                                             \n-------------------------------------------------------<\/pre>\n<p>\u00d6ffnen Sie den vollst\u00e4ndigen Bericht in Ihrem Browser:<\/p>\n<pre class=\"EnlighterJSRAW\">  Do you want to open the latest report [Y\/n]Yes\n\n!  Press Ctrl+C to stop serving the report\n\n  Showing Qodana report from http:\/\/localhost:8080\/... (10s)<\/pre>\n<p>Qodana meldet, dass <code>SomeComponent<\/code> nicht mit der Codekonvention \u00fcbereinstimmt, die von unserer lokalen Inspektion im Qodana-Plugin vorgegeben wurde.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-678097\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2026\/02\/Qodana-Report.png\" alt=\"\" width=\"1999\" height=\"983\" \/><\/figure>\n<h4 class=\"wp-block-heading\">Tipps f\u00fcr weitere Durchl\u00e4ufe<\/h4>\n<p>Wenn das Qodana-Plugin ge\u00e4ndert und neu kompiliert wird, muss auch der Qodana-Cache neu erstellt werden. Verwenden Sie in solchen F\u00e4llen den Befehlszeilenschalter <code>--clear-cache<\/code>, um alle Abh\u00e4ngigkeiten des Qodana-Laufs neu zu laden.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">qodana scan --clear-cache --volume $PWD\/.qodana\/qodana-code-inspection-0.0.1.jar:\/opt\/idea\/custom-plugins\/codeinspection.jar<\/pre>\n<h2 class=\"wp-block-heading\">Qodana in Ihre IDE integrieren<\/h2>\n<p>Das Qodana-Plugin kann <a href=\"https:\/\/www.jetbrains.com\/help\/idea\/managing-plugins.html#install_plugin_from_disk\" target=\"_blank\" rel=\"noreferrer noopener\">von der Festplatte in die IDE installiert<\/a> werden. Die Codeinspektion ist dann automatisch aktiviert und wird f\u00fcr jede Kotlin-Klasse im untersuchten Projekt aufgerufen. Um zu \u00fcberpr\u00fcfen, ob es funktioniert, kehren Sie zum Playground-Projekt zur\u00fcck, \u00f6ffnen Sie die Klasse <code>org.intellij.sdk.qodana.service.SomeComponent<\/code> und \u00fcberpr\u00fcfen Sie, ob der problematische Klassenname unterkringelt ist. Wenn Sie die Maus auf den Klassennamen bewegen, werden Ihnen das Ergebnis der Codeinspektion sowie eine Beschreibung des Problems angezeigt \u2013 sehr praktisch. Alternativ k\u00f6nnen Sie das <em>Problems<\/em>-Toolfenster \u00f6ffnen \u2013 dort finden Sie das Problem in der Liste aller von Codeinspektionen gemeldeten Probleme.<\/p>\n<p>Die Codeinspektion verh\u00e4lt sich nun wie jede andere von der IDE bereitgestellte Inspektion. Unter <em>Settings <\/em>| <em>Editor <\/em>| <em>Inspections | Kotlin<\/em> finden Sie die Inspektion <em>SDK: Discouraged class name<\/em>, zusammen mit der Beschreibung aus der zuvor erstellten HTML-Datei.<\/p>\n<h3 class=\"wp-block-heading\">Qodana in der IDE ausf\u00fchren<\/h3>\n<p>Nachdem Sie das Plugin installiert haben, k\u00f6nnen Sie Qodana auch in Ihrer IDE ausf\u00fchren. \u00d6ffnen Sie im <em>Problems<\/em>-Toolfenster die Registerkarte <em>Qodana<\/em> und klicken Sie auf die Schaltfl\u00e4che <em>Try Locally<\/em>. Qodana wird mit der Konfiguration aus der Datei <code>qodana.yaml<\/code> ausgef\u00fchrt. Der Qodana-Bericht wird direkt im Toolfenster bereitgestellt.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-678108\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2026\/02\/Qodana-Report-analysis.png\" alt=\"\" width=\"1116\" height=\"566\" \/><\/figure>\n<h2 class=\"wp-block-heading\">Qodana-Plugins und der JetBrains Marketplace<\/h2>\n<p>Korrekt erstellte und getestete benutzerdefinierte Inspektions-Plugins k\u00f6nnen <a href=\"https:\/\/plugins.jetbrains.com\/docs\/marketplace\/publishing-and-listing-your-plugin.html\" target=\"_blank\" rel=\"noreferrer noopener\">im JetBrains Marketplace ver\u00f6ffentlicht<\/a> werden \u2013 dadurch entf\u00e4llt die Notwendigkeit, das Plugin im <code>.qodana<\/code>-Verzeichnis bereitzustellen. Stattdessen m\u00fcssen Sie lediglich sicherstellen, dass in der Qodana-Konfiguration ein \u00f6ffentlicher Plugin-Bezeichner angegeben wird, der mit dem <code><mark class=\"has-inline-color\" style=\"color: #1c8212;\">id<\/mark><\/code>-Element in der Plugin-Beschreibungsdatei \u00fcbereinstimmt.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: \"1.0\"\nlinter: qodana-jvm-community\nplugins: \n  - id: com.github.novotnyr.qodanacodeinspection<\/pre>\n<p>Der <code>scan<\/code>-Befehl von Qodana kann nun einfacher ausgef\u00fchrt werden, da das <code>.qodana<\/code>-Verzeichnis nicht mehr gemountet werden muss.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">qodana scan<\/pre>\n<p>Qodana l\u00e4dt das Plugin vom JetBrains Marketplace herunter und f\u00fchrt alle darin enthaltenen Inspektionen durch. Die Ergebnisse werden sowohl in der Konsole als auch einem HTML-Bericht ausgegeben \u2013 letzteren k\u00f6nnen Sie in einem Webbrowser betrachten.<\/p>\n<h2 class=\"wp-block-heading\">Zusammenfassung<\/h2>\n<p>Wir haben ein Qodana-Plugin mit einer Codeinspektion erstellt, welche die Einhaltung einer bestimmten Codekonvention pr\u00fcft, und wir haben mehrere M\u00f6glichkeiten, um die Inspektion auszuf\u00fchren:<\/p>\n<ul>\n<li>Als JAR-Datei im Verzeichnis <code>.qodana<\/code> ablegen und in der Qodana-YAML-Datei darauf verweisen.<\/li>\n<li>Auf ein \u00f6ffentlich verf\u00fcgbares Plugin im JetBrains Marketplace verweisen.<\/li>\n<li>Als JAR-Datei in der IDE installieren, damit die Inspektion bei lokalen Qodana-Durchl\u00e4ufen ausgef\u00fchrt wird.<\/li>\n<li>Als JAR-Datei in der IDE installieren, damit die Inspektion zusammen mit den eingebauten Codeinspektionen ausgef\u00fchrt wird.<\/li>\n<\/ul>\n<p>Im <a href=\"https:\/\/github.com\/JetBrains\/intellij-sdk-code-samples\/tree\/main\/code_inspection_qodana\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ-SDK-Beispielcode<\/a> finden Sie kurze Beispiele sowohl f\u00fcr das Qodana-Plugin als auch f\u00fcr ein Playground-Projekt.<\/p>\n<p><em>Autor des urspr\u00fcnglichen Blogposts<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2026\/02\/avatar0-1.jpg\" width=\"200\" height=\"200\" alt=\"R\u00f3bert Novotn\u00fd\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>R\u00f3bert Novotn\u00fd<\/h4>\n                                        <p>R\u00f3bert Novotn\u00fd is a Developer Advocate, specializing in the IntelliJ Platform and plugin development.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":964,"featured_media":683110,"comment_status":"closed","ping_status":"closed","template":"","categories":[8844,1065,6924],"tags":[246,3233,41,6470],"cross-post-tag":[6687],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/platform\/683097"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/platform"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/platform"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/964"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=683097"}],"version-history":[{"count":2,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/platform\/683097\/revisions"}],"predecessor-version":[{"id":683122,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/platform\/683097\/revisions\/683122"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/683110"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=683097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=683097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=683097"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=683097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}