{"id":690566,"date":"2026-03-21T04:03:38","date_gmt":"2026-03-21T03:03:38","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=platform&#038;p=690566"},"modified":"2026-03-21T04:03:43","modified_gmt":"2026-03-21T03:03:43","slug":"ampliar-la-funcionalidad-de-qodana-con-inspecciones-personalizadas-de-codigo","status":"publish","type":"platform","link":"https:\/\/blog.jetbrains.com\/es\/platform\/2026\/03\/ampliar-la-funcionalidad-de-qodana-con-inspecciones-personalizadas-de-codigo\/","title":{"rendered":"Ampliar la funcionalidad de Qodana con inspecciones personalizadas de c\u00f3digo"},"content":{"rendered":"<p>Qodana es una herramienta de an\u00e1lisis est\u00e1tico de c\u00f3digo que lleva las <a href=\"https:\/\/www.jetbrains.com\/help\/idea\/code-inspection.html\" target=\"_blank\" rel=\"noreferrer noopener\">inspecciones de c\u00f3digo<\/a> y los arreglos r\u00e1pidos de los JetBrains IDEs al \u00e1mbito de la integraci\u00f3n continua. Puede ejecutarse en la <a href=\"https:\/\/qodana.cloud\" target=\"_blank\" rel=\"noreferrer noopener\">nube<\/a>, <a href=\"https:\/\/github.com\/JetBrains\/qodana-cli\" target=\"_blank\" rel=\"noreferrer noopener\">ejecutarse desde un contenedor Docker<\/a>, <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/ci.html\" target=\"_blank\" rel=\"noopener\">integrarse<\/a> en procesos de CI\/CD o invocarse a trav\u00e9s de un JetBrains IDE.<\/p>\n<p>Qodana ya ofrece un impresionante conjunto de inspecciones, pero no se limita a lo que lleva incorporado. Puede a\u00f1adir inspecciones personalizadas para hacer cumplir las especificaciones y convenciones del proyecto.<\/p>\n<p>Por ejemplo, imagine un proyecto con una convenci\u00f3n de c\u00f3digo espec\u00edfica:<\/p>\n<blockquote class=\"wp-block-quote\">\n<p>Cada clase Kotlin de un paquete <code>service<\/code><mark class=\"has-inline-color\" style=\"color: #1c8212;\"> <\/mark> debe tener un sufijo <code>Service<\/code>.<\/p>\n<\/blockquote>\n<p>En este caso, <code>com.jetbrains.service.JetComponent<\/code> no se ajustar\u00eda a esta convenci\u00f3n, mientras que <code>com.jetbrains.service.BrainComponentService<\/code> ser\u00eda perfectamente adecuada. Para continuar, crearemos un complemento que implemente esta inspecci\u00f3n, para que Qodana pueda hacer cumplir esta convenci\u00f3n en futuros proyectos.<\/p>\n<p>Podemos implementar esta convenci\u00f3n de c\u00f3digo creando una <strong>inspecci\u00f3n de c\u00f3digo<\/strong> personalizada empaquetada en un <strong>complemento<\/strong>. Los complementos de Qodana se desarrollan igual que los de los JetBrains IDEs, es decir, solo tenemos que crear un complemento de IntelliJ Platform que se pueda ejecutar en Qodana. He aqu\u00ed un r\u00e1pido resumen de los pasos que seguiremos:<\/p>\n<ol>\n<li>Inicialice el proyecto desde <a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-plugin-template\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ Platform Plugin Template<\/a>.<\/li>\n<li>Ajuste las propiedades del proyecto y el descriptor del complemento junto con las dependencias necesarias.<\/li>\n<li>Declare la inspecci\u00f3n local en el descriptor del complemento e implem\u00e9ntelo en Kotlin.<\/li>\n<li>Compile y empaquete el complemento.<\/li>\n<li>En el proyecto de prueba de ejemplo, sit\u00fae el artefacto del complemento en un directorio correcto.<\/li>\n<li>Ajuste el archivo de configuraci\u00f3n de Qodana.<\/li>\n<li>Ejecute Qodana y mire el informe.<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\">Preparaci\u00f3n del proyecto del complemento<\/h2>\n<p>Para arrancar el proyecto, visite el repositorio <a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-gradle-plugin\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ Platform Plugin Template<\/a> y haga clic en el bot\u00f3n <em>Use this template<\/em> para crear un repositorio de complementos. Ll\u00e1melo <code>classname-inspection-qodana-plugin<\/code>, copie la URL del proyecto y \u00e1bralo en IntelliJ IDEA. Cuando el proyecto est\u00e9 listo, personalice <code>gradle.properties<\/code> declarando <code>pluginGroup<\/code>, <code>pluginName<\/code> y <code>pluginRepositoryUrl<\/code> seg\u00fan sea necesario. No se olvide de pulsar el bot\u00f3n flotante <em>Sync Gradle Changes<\/em> para aplicar los cambios. Para modificar el <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/plugin-configuration-file.html#idea-plugin__id\" target=\"_blank\" rel=\"noreferrer noopener\">identificador \u00fanico del complemento<\/a>, cambie el elemento <code>id<\/code> en el descriptor del complemento <code>plugin.xml<\/code>.<\/p>\n<h3 class=\"wp-block-heading\">Declarar dependencias<\/h3>\n<p>Nuestra inspecci\u00f3n de c\u00f3digo tiene como objetivo las clases Kotlin, por lo que necesitamos a\u00f1adir el complemento de Kotlin a las dependencias del complemento de Qodana. El archivo <code>gradle.properties<\/code> requiere que declare:<\/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>Adem\u00e1s, el descriptor del complemento <code>plugin.xml<\/code> debe contener el mismo complemento Kotlin empaquetado en sus dependencias:<\/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>De nuevo, recuerde sincronizar los cambios de Gradle pulsando el bot\u00f3n flotante.<\/p>\n<p>Adem\u00e1s, la inspecci\u00f3n de clases de Kotlin debe ser compatible con el compilador K2 de Kotlin, habilitado de forma predeterminada desde la versi\u00f3n 2025.1 de IntelliJ Platform. En el descriptor del complemento, declare la extensi\u00f3n <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\">Creaci\u00f3n de la inspecci\u00f3n de c\u00f3digo<\/h3>\n<p>El c\u00f3digo real para cualquier inspecci\u00f3n de c\u00f3digo que se dirija a clases Kotlin requiere tres pasos:<\/p>\n<ol>\n<li>Declare una extensi\u00f3n <code>com.intellij.localInspection<\/code> en el descriptor del complemento junto con los atributos necesarios y una referencia totalmente cualificada a la clase de implementaci\u00f3n.<\/li>\n<li>Cree una clase de implementaci\u00f3n, preferiblemente en Kotlin.<\/li>\n<li>Proporcione un archivo HTML independiente con una descripci\u00f3n de la inspecci\u00f3n, directrices de uso y un ejemplo.<\/li>\n<\/ol>\n<h4 class=\"wp-block-heading\">Declarar la extensi\u00f3n<\/h4>\n<p>A\u00f1ada la siguiente declaraci\u00f3n al archivo descriptor del complemento <code>plugin.xml<\/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<p>El atributo <code>language<\/code> indica que la inspecci\u00f3n se aplica a los archivos de c\u00f3digo fuente en Kotlin. Es importante activar expl\u00edcitamente la inspecci\u00f3n de forma predeterminada; de lo contrario, Qodana no la ejecutar\u00e1. A continuaci\u00f3n, proporcione un <code>displayName<\/code> descriptivo, legible para el usuario, que se mostrar\u00e1 en el informe y en la configuraci\u00f3n. El atributo <code>groupName<\/code> establece la categor\u00eda de inspecci\u00f3n que se muestra tanto en el informe de Qodana como en la configuraci\u00f3n del IDE. Por \u00faltimo, proporcione un nombre completamente cualificado para la clase de implementaci\u00f3n.<\/p>\n<h4 class=\"wp-block-heading\">C\u00f3digo fuente de inspecci\u00f3n del c\u00f3digo<\/h4>\n<p>El complemento de Kotlin proporciona una clase de inspecci\u00f3n base muy \u00fatil para las inspecciones de Kotlin: <code>AbstractKotlinInspection<\/code>. Anule el m\u00e9todo <code>buildVisitor<\/code> y proporcione una instancia de visitante PSI que recorra los elementos de clase de Kotlin de forma segura en cuanto a tipos. <code>classVisitor<\/code> es una pr\u00e1ctica funci\u00f3n similar a la de DSL que devuelve este tipo de visitante PSI y se invoca sobre cualquier clase Kotlin del proyecto que est\u00e9 inspeccionando.<\/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>La subclase del visitante extrae el nombre de clase de Kotlin totalmente cualificado, inspecciona el elemento del paquete situado m\u00e1s a la derecha y comprueba el sufijo correspondiente. Cualquier nombre de clase incorrecto se notifica a la instancia <code>ProblemsHolder<\/code> con una clase envolvente como elemento PSI y una descripci\u00f3n del problema legible para el usuario.<\/p>\n<h4 class=\"wp-block-heading\">Descripci\u00f3n de la inspecci\u00f3n<\/h4>\n<p>Cada inspecci\u00f3n local requiere un archivo de descripci\u00f3n complementario, representado como HTML. Si utiliza el arreglo r\u00e1pido <em>Create description file ServicePackageClassNameInspection.html<\/em>, se crear\u00e1 un archivo llamado <code>src\/main\/resources\/inspectionDescriptions\/ServicePackageClassName.html<\/code> en la ubicaci\u00f3n adecuada. Tambi\u00e9n tendr\u00e1 que proporcionar una descripci\u00f3n que se mostrar\u00e1 en el informe de Qodana y en los ajustes del IDE.<\/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.<\/pre>\n<p><b>Example:<\/b><\/p>\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\">Compile el complemento<\/h2>\n<p>Ya est\u00e1 todo listo: \u00a1es hora de compilar! Ejecute la tarea <code>buildPlugin<\/code> de Gradle y busque el artefacto <code>build\/distributions\/qodana-code-inspection-0.0.1.zip<\/code> disponible en el directorio de salida de Gradle. El archivo JAR se utilizar\u00e1 como artefacto principal en el an\u00e1lisis de Qodana.\u00a0<\/p>\n<h4 class=\"wp-block-heading\">Tenga en cuenta el tipo de artefacto del complemento<\/h4>\n<p>Qodana no admite directamente artefactos de complementos ZIP locales que incluyan archivos JAR adicionales o dependencias de terceros. Cualquier complemento se debe empaquetar como un \u00fanico JAR o descomprimir en un directorio espec\u00edfico.<\/p>\n<h2 class=\"wp-block-heading\">Ejecutar Qodana en un proyecto de prueba<\/h2>\n<p>Vamos a crear un proyecto de prueba, escrito en Kotlin, que podamos inspeccionar con Qodana ahora que lo hemos extendido con nuestro complemento. Para ejecutar el complemento de Qodana de forma local, aseg\u00farese de que los siguientes dos componentes de software est\u00e9n disponibles en su sistema:<\/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>Nuestro proyecto de prueba deber\u00eda contener una clase llamada <code>src\/main\/kotlin\/org\/intellij\/sdk\/qodana\/service\/SomeComponent.kt<\/code>, que no sigue nuestra convenci\u00f3n de c\u00f3digo, ya que no tiene el sufijo <code>Service<\/code>. Hay dos formas de integrar el complemento de Qodana en Qodana:<\/p>\n<ul>\n<li>Publ\u00edquelo en JetBrains Marketplace<\/li>\n<li>Para una implementaci\u00f3n m\u00e1s r\u00e1pida, coloque el artefacto JAR del complemento en el directorio <code>.qodana<\/code> de su proyecto.<\/li>\n<\/ul>\n<p>Para simplificar la compilaci\u00f3n, copie el archivo <code>build\/distributions\/qodana-code-inspection-0.0.1.zip<\/code> del proyecto del complemento en el archivo <code>.qodana\/qodana-code-inspection-0.0.1.zip<\/code> del proyecto de prueba. Cree el directorio <code>.qodana<\/code>, si a\u00fan no existe. A continuaci\u00f3n, extraiga el archivo con el programa o herramienta que prefiera. Qodana puede acceder al complemento en el directorio <code>build\/distributions\/qodana-code-inspection<\/code>.<\/p>\n<p>Adem\u00e1s, es necesario configurar Qodana para incluir nuestra inspecci\u00f3n de c\u00f3digo personalizada. Modifique el archivo <code>qodana.yaml<\/code> en el directorio ra\u00edz del proyecto de prueba como se indica a continuaci\u00f3n:<\/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>El bloque <code>include<\/code> debe hacer referencia al nombre de clase totalmente cualificado de la inspecci\u00f3n de c\u00f3digo disponible en el complemento. Ahora ejecute el siguiente comando para ejecutar Qodana desde el terminal:<\/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>Esto descargar\u00e1 la imagen de Docker de Qodana correspondiente. Se crear\u00e1 y ejecutar\u00e1 un contenedor de Docker basado en la configuraci\u00f3n de Qodana. Para que el complemento personalizado sea accesible dentro de la ejecuci\u00f3n de Qodana, monte el directorio del complemento de Qodana desde el sistema de archivos local al directorio apropiado dentro del contenedor de Docker de Qodana. Tras un par de minutos, Qodana elaborar\u00e1 un resumen del informe y lo imprimir\u00e1 en el resultado est\u00e1ndar.<\/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>Abra el informe completo en su navegador:<\/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 mostrar\u00e1 que <code>SomeComponent<\/code> no cumple la convenci\u00f3n de c\u00f3digo proporcionada por nuestra inspecci\u00f3n local en el complemento de Qodana.<\/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\">Consejos para futuras ejecuciones<\/h4>\n<p>Cuando el complemento de Qodana se modifica y se reconstruye, la cach\u00e9 de Qodana tambi\u00e9n debe volver a crearse. En tales casos, utilice el par\u00e1metro de CLI <code>--clear-cache<\/code> para recargar todas las dependencias de la ejecuci\u00f3n de Qodana.<\/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\">Integrar Qodana en su IDE<\/h2>\n<p>El complemento de Qodana <a href=\"https:\/\/www.jetbrains.com\/help\/idea\/managing-plugins.html#install_plugin_from_disk\" target=\"_blank\" rel=\"noreferrer noopener\">puede instalarse desde el disco<\/a> en el IDE. A continuaci\u00f3n, su inspecci\u00f3n de c\u00f3digo se activa e invoca autom\u00e1ticamente para cualquier clase de Kotlin de un proyecto. Para comprobar que funciona, vuelva al proyecto de prueba, abra la clase <code>org.intellij.sdk.qodana.service.SomeComponent<\/code> y aseg\u00farese de que el nombre de la clase con problemas aparece subrayado. Para mayor comodidad, al pasar el rat\u00f3n sobre el nombre de la clase se mostrar\u00e1 el resultado de la inspecci\u00f3n del c\u00f3digo junto con la descripci\u00f3n del problema. Alternativamente, puede abrir la ventana de herramientas <em>Problems<\/em> y buscar el problema en la lista de todos los problemas notificados por las inspecciones de c\u00f3digo.\u00a0<\/p>\n<p>La inspecci\u00f3n de c\u00f3digo se comporta ahora como cualquier otra inspecci\u00f3n proporcionada por el IDE. En <em>Settings <\/em>| <em>Editor <\/em>| <em>Inspections | Kotlin<\/em>, encontrar\u00e1 la inspecci\u00f3n <em>SDK: Discouraged class name<\/em>, junto con la descripci\u00f3n obtenida del archivo HTML que le proporcionamos antes.<\/p>\n<h3 class=\"wp-block-heading\">Ejecutar Qodana dentro del IDE<\/h3>\n<p>Con el complemento instalado, ahora tambi\u00e9n puede ejecutar Qodana desde su IDE. En la ventana de herramientas <em>Problems<\/em>, vaya a la pesta\u00f1a <em>Qodana<\/em> y pulse el bot\u00f3n <em>Try Locally<\/em>. Qodana se configurar\u00e1 con el archivo <code>qodana.yaml<\/code> y se ejecutar\u00e1. El informe de Qodana se encuentra directamente en la ventana de herramientas.\u00a0<\/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\">Complementos de Qodana y JetBrains Marketplace<\/h2>\n<p>Los complementos de inspecci\u00f3n personalizados correctamente compilados y probados pueden <a href=\"https:\/\/plugins.jetbrains.com\/docs\/marketplace\/publishing-and-listing-your-plugin.html\" target=\"_blank\" rel=\"noreferrer noopener\">publicarse en JetBrains Marketplace<\/a>, para que no sea necesario servirlos desde el directorio <code>.qodana<\/code>. En su lugar, solo tiene que asegurarse de que la configuraci\u00f3n de Qodana especifique un identificador de complemento p\u00fablico que coincida con el elemento <code><mark class=\"has-inline-color\" style=\"color: #1c8212;\">id<\/mark><\/code> del descriptor del complemento.<\/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>El comando <code>scan<\/code> de Qodana est\u00e1 simplificado, ya que el montaje del directorio .<code>qodana<\/code> ya no es necesario.<\/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 descarga este complemento desde JetBrains Marketplace y ejecuta todas sus inspecciones, produciendo tanto un resultado de consola como un informe HTML que puede mostrarse en un navegador web.<\/p>\n<h2 class=\"wp-block-heading\">Resumen<\/h2>\n<p>Hemos creado un complemento de Qodana con una inspecci\u00f3n de c\u00f3digo que comprueba una convenci\u00f3n de c\u00f3digo espec\u00edfica, y tenemos varias formas de ejecutarlo:<\/p>\n<ul>\n<li>Como un JAR colocado en el directorio <code>.qodana<\/code> e incluido en el archivo YAML de Qodana.<\/li>\n<li>Como referencia al complemento disponible p\u00fablicamente en JetBrains Marketplace.<\/li>\n<li>Como un JAR instalado en el IDE, donde la inspecci\u00f3n se aplica en una ejecuci\u00f3n local de Qodana.<\/li>\n<li>Como un JAR instalado en el IDE, donde la inspecci\u00f3n se incluye entre las inspecciones de c\u00f3digo integradas.\u00a0<\/li>\n<\/ul>\n<p>Consulte el <a href=\"https:\/\/github.com\/JetBrains\/intellij-sdk-code-samples\/tree\/main\/code_inspection_qodana\" target=\"_blank\" rel=\"noreferrer noopener\">el ejemplo de c\u00f3digo del IntelliJ SDK<\/a> para ver demostraciones concisas tanto del complemento de Qodana como de un proyecto de prueba.<\/p>\n<p><em>Art\u00edculo original en ingl\u00e9s de:<br \/><\/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":1086,"featured_media":690591,"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\/es\/wp-json\/wp\/v2\/platform\/690566"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/platform"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/types\/platform"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/comments?post=690566"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/platform\/690566\/revisions"}],"predecessor-version":[{"id":690615,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/platform\/690566\/revisions\/690615"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media\/690591"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media?parent=690566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/categories?post=690566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/tags?post=690566"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/cross-post-tag?post=690566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}