{"id":689000,"date":"2026-03-18T09:47:21","date_gmt":"2026-03-18T08:47:21","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=platform&#038;p=689000"},"modified":"2026-03-18T10:08:19","modified_gmt":"2026-03-18T09:08:19","slug":"extending-qodana-adding-custom-code-inspections","status":"publish","type":"platform","link":"https:\/\/blog.jetbrains.com\/ja\/platform\/2026\/03\/extending-qodana-adding-custom-code-inspections\/","title":{"rendered":"Qodana \u306e\u6a5f\u80fd\u62e1\u5f35: \u30ab\u30b9\u30bf\u30e0\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3059\u308b"},"content":{"rendered":"<p>Qodana \u306f JetBrains IDE \u306e<a href=\"http:\/\/pleiades.io\/help\/idea\/code-inspection.html\" target=\"_blank\" rel=\"noreferrer noopener\">\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3<\/a>\u3068\u30af\u30a4\u30c3\u30af\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u7d99\u7d9a\u7684\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u9818\u57df\u306b\u53d6\u308a\u8fbc\u3080\u9759\u7684\u30b3\u30fc\u30c9\u89e3\u6790\u30c4\u30fc\u30eb\u3067\u3059\u3002<a href=\"https:\/\/qodana.cloud\" target=\"_blank\" rel=\"noreferrer noopener\">\u30af\u30e9\u30a6\u30c9<\/a>\u3067\u5b9f\u884c\u3059\u308b\u3053\u3068\u3082\u3001<a href=\"https:\/\/github.com\/JetBrains\/qodana-cli\" target=\"_blank\" rel=\"noreferrer noopener\">Docker \u30b3\u30f3\u30c6\u30ca\u30fc\u304b\u3089\u5b9f\u884c<\/a>\u3059\u308b\u3053\u3068\u3082\u3001CI\/CD \u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306b<a href=\"http:\/\/pleiades.io\/help\/qodana\/ci.html\" target=\"_blank\" rel=\"noopener\">\u7d44\u307f\u8fbc\u3080<\/a>\u3053\u3068\u3082\u3001JetBrains IDE \u3092\u4ecb\u3057\u3066\u547c\u3073\u51fa\u3059\u3053\u3068\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>Qodana \u306f\u3059\u3067\u306b\u512a\u308c\u305f\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u4e00\u5f0f\u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u7d44\u307f\u8fbc\u307f\u306e\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306b\u9650\u5b9a\u3055\u308c\u308b\u3053\u3068\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u30ab\u30b9\u30bf\u30e0\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4ed5\u69d8\u3084\u898f\u5247\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u305f\u3068\u3048\u3070\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7279\u5b9a\u306e\u30b3\u30fc\u30c9\u898f\u5247\u3092\u4f7f\u7528\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u60f3\u50cf\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<blockquote class=\"wp-block-quote\">\n<p><code>service<\/code><mark class=\"has-inline-color\" style=\"color: #1c8212;\"> <\/mark>\u30d1\u30c3\u30b1\u30fc\u30b8\u5185\u306e\u5404 Kotlin \u30af\u30e9\u30b9\u306b\u306f <code>Service<\/code> \u63a5\u5c3e\u8f9e\u3092\u5fc5\u305a\u4f7f\u7528\u3059\u308b\u3002<\/p>\n<\/blockquote>\n<p>\u3053\u306e\u5834\u5408\u3001<code>com.jetbrains.service.JetComponent<\/code> \u306f\u3053\u306e\u898f\u5247\u306b\u6e96\u62e0\u3057\u307e\u305b\u3093\u304c\u3001<code>com.jetbrains.service.BrainComponentService<\/code> \u306f\u307e\u3063\u305f\u304f\u554f\u984c\u3042\u308a\u307e\u305b\u3093\u3002\u4ee5\u4e0b\u3067\u306f\u3001\u3053\u306e\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u5b9f\u88c5\u3059\u308b\u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u30d3\u30eb\u30c9\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001Qodana \u304c\u3053\u306e\u898f\u5247\u3092\u4eca\u5f8c\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u9069\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u898f\u5247\u306f\u3001\u30ab\u30b9\u30bf\u30e0<strong>\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3<\/strong>\u3092\u4f5c\u6210\u3057\u3066 <strong>plugin<\/strong> \u306b\u30d1\u30c3\u30b1\u30fc\u30b8\u5316\u3059\u308b\u3053\u3068\u3067\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u958b\u767a\u306f JetBrains IDE \u30d7\u30e9\u30b0\u30a4\u30f3\u3068\u307e\u3063\u305f\u304f\u540c\u3058\u3067\u3059\u304c\u3001Qodana \u3067\u5b9f\u884c\u3067\u304d\u308b IntelliJ Platform \u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u4ee5\u4e0b\u306f\u305d\u306e\u624b\u9806\u306e\u6982\u8981\u3067\u3059\u3002<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-plugin-template\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ Platform Plugin Template<\/a> \u304b\u3089\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u521d\u671f\u5316\u3057\u307e\u3059\u3002<\/li>\n<li>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d7\u30ed\u30d1\u30c6\u30a3\u3068\u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50\u3001\u304a\u3088\u3073\u5fc5\u8981\u306a\u4f9d\u5b58\u95a2\u4fc2\u3092\u8abf\u6574\u3057\u307e\u3059\u3002<\/li>\n<li>\u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50\u3067\u30ed\u30fc\u30ab\u30eb\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u5ba3\u8a00\u3057\u3001Kotlin \u3067\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/li>\n<li>\u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u30d3\u30eb\u30c9\u3057\u3001\u30d1\u30c3\u30b1\u30fc\u30b8\u5316\u3057\u307e\u3059\u3002<\/li>\n<li>\u30d7\u30e9\u30b0\u30a4\u30f3\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30b5\u30f3\u30d7\u30eb\u30d7\u30ec\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u9069\u5207\u306a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u914d\u7f6e\u3057\u307e\u3059\u3002<\/li>\n<li>Qodana \u306e\u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u3092\u8abf\u6574\u3057\u307e\u3059\u3002<\/li>\n<li>Qodana \u3092\u5b9f\u884c\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u3092\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\uff01<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\">\u30d7\u30e9\u30b0\u30a4\u30f3\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u6e96\u5099<\/h2>\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30d6\u30fc\u30c8\u30b9\u30c8\u30e9\u30c3\u30d7\u3059\u308b\u306b\u306f\u3001<a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-gradle-plugin\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ Platform Plugin Template<\/a> \u30ea\u30dd\u30b8\u30c8\u30ea\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001<em>Use this template<\/em>\uff08\u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\uff09\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30d7\u30e9\u30b0\u30a4\u30f3\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u305d\u308c\u3092 <code>classname-inspection-qodana-plugin<\/code> \u3068\u540d\u4ed8\u3051\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e URL \u3092\u30b3\u30d4\u30fc\u3057\u3001IntelliJ IDEA \u3067\u958b\u304d\u307e\u3059\u3002\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u6e96\u5099\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066 <code>pluginGroup<\/code>\u3001<code>pluginName<\/code>\u3001\u304a\u3088\u3073 <code>pluginRepositoryUrl<\/code> \u3092\u5ba3\u8a00\u3057\u3066 <code>gradle.properties<\/code> \u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u307e\u3059\u3002\u5909\u66f4\u3092\u9069\u7528\u3059\u308b\u305f\u3081\u3001<em>Sync Gradle Changes<\/em>\uff08Gradle \u306e\u5909\u66f4\u3092\u540c\u671f\uff09 \u30d5\u30ed\u30fc\u30c6\u30a3\u30f3\u30b0\u30dc\u30bf\u30f3\u3092\u5fc5\u305a\u30af\u30ea\u30c3\u30af\u3057\u307e\u3057\u3087\u3046\u3002\u4e00\u610f\u306e<a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/plugin-configuration-file.html#idea-plugin__id\" target=\"_blank\" rel=\"noreferrer noopener\">\u30d7\u30e9\u30b0\u30a4\u30f3\u8b58\u5225\u5b50<\/a>\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50\u3067\u3042\u308b <code>plugin.xml<\/code> \u306e <code>id<\/code> \u8981\u7d20\u3092\u5909\u66f4\u3057\u307e\u3059\u3002<\/p>\n<h3 class=\"wp-block-heading\">\u4f9d\u5b58\u95a2\u4fc2\u3092\u5ba3\u8a00\u3059\u308b<\/h3>\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306e\u5bfe\u8c61\u306f Kotlin \u30af\u30e9\u30b9\u3067\u3042\u308b\u305f\u3081\u3001Kotlin \u30d7\u30e9\u30b0\u30a4\u30f3\u3092 Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u4f9d\u5b58\u95a2\u4fc2\u306b\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<code>gradle.properties<\/code> \u30d5\u30a1\u30a4\u30eb\u3067\u4ee5\u4e0b\u3092\u5ba3\u8a00\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/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>\u307e\u305f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50 <code>plugin.xml<\/code> \u306e\u4f9d\u5b58\u95a2\u4fc2\u306b\u540c\u3058\u30d0\u30f3\u30c9\u30eb\u306e Kotlin \u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u542b\u3081\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/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>\u3053\u3053\u3067\u3082\u5fc5\u305a\u30d5\u30ed\u30fc\u30c6\u30a3\u30f3\u30b0\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3001Gradle \u306e\u5909\u66f4\u3092\u540c\u671f\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u3055\u3089\u306b\u3001Kotlin \u30af\u30e9\u30b9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306f IntelliJ Platform \u30d0\u30fc\u30b8\u30e7\u30f3 2025.1 \u4ee5\u964d\u306b\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u6709\u52b9\u5316\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u3063\u305f Kotlin K2 \u30b3\u30f3\u30d1\u30a4\u30e9\u30fc\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50\u3067 <code>org.jetbrains.kotlin.supportsKotlinPluginMode<\/code> \u62e1\u5f35\u6a5f\u80fd\u3092\u5ba3\u8a00\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/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\">\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b<\/h3>\n<p>Kotlin \u30af\u30e9\u30b9\u3092\u5bfe\u8c61\u3068\u3059\u308b\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306e\u5b9f\u969b\u306e\u30b3\u30fc\u30c9\u306b\u306f\u3001\u4ee5\u4e0b\u306e 3 \u3064\u306e\u624b\u9806\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<ol>\n<li>\u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50\u3067 <code>com.intellij.localInspection<\/code> \u62e1\u5f35\u6a5f\u80fd\u3092\u5ba3\u8a00\u3057\u3001\u5fc5\u8981\u306a\u5c5e\u6027\u3068\u5b9f\u88c5\u30af\u30e9\u30b9\u3078\u306e\u5b8c\u5168\u4fee\u98fe\u53c2\u7167\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/li>\n<li>\u3067\u304d\u308c\u3070 Kotlin \u3067\u5b9f\u88c5\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n<li>\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306e\u8aac\u660e\u3001\u4f7f\u7528\u65b9\u6cd5\u306e\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3\u3001\u304a\u3088\u3073\u30b5\u30f3\u30d7\u30eb\u3092\u542b\u3080\u30b9\u30bf\u30f3\u30c9\u30a2\u30ed\u30f3\u306e HTML \u30d5\u30a1\u30a4\u30eb\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/li>\n<\/ol>\n<h4 class=\"wp-block-heading\">\u62e1\u5f35\u6a5f\u80fd\u3092\u5ba3\u8a00\u3059\u308b<\/h4>\n<p>\u4ee5\u4e0b\u306e\u5ba3\u8a00\u3092 <code>plugin.xml<\/code> \u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50\u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/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><code>language<\/code> \u5c5e\u6027\u306f\u3001\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u304c Kotlin \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30d5\u30a1\u30a4\u30eb\u306b\u9069\u7528\u3055\u308c\u308b\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u660e\u793a\u7684\u306b\u6709\u52b9\u5316\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002\u305d\u3046\u3067\u306a\u3044\u5834\u5408\u3001Qodana \u306f\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u305b\u3093\u3002\u6b21\u306b\u3001\u30ec\u30dd\u30fc\u30c8\u3068\u8a2d\u5b9a\u306b\u8868\u793a\u3055\u308c\u308b <code>displayName<\/code> \u3092\u4eba\u9593\u304c\u8aad\u307f\u53d6\u308c\u308b\u5206\u304b\u308a\u3084\u3059\u3044\u6587\u5b57\u5217\u3067\u6307\u5b9a\u3057\u307e\u3059\u3002<code>groupName<\/code> \u5c5e\u6027\u306b\u306f\u3001Qodana \u306e\u30ec\u30dd\u30fc\u30c8\u3068 IDE \u306e\u8a2d\u5b9a\u306e\u4e21\u65b9\u306b\u8868\u793a\u3055\u308c\u308b\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u30ab\u30c6\u30b4\u30ea\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002\u6700\u5f8c\u306b\u3001\u5b9f\u88c5\u30af\u30e9\u30b9\u306e\u5b8c\u5168\u4fee\u98fe\u540d\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<h4 class=\"wp-block-heading\">\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9<\/h4>\n<p>Kotlin \u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u306f\u3001<code>AbstractKotlinInspection<\/code> \u3068\u3044\u3046 Kotlin \u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u7528\u306e\u4fbf\u5229\u306a\u57fa\u672c\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u30af\u30e9\u30b9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002<code>buildVisitor<\/code> \u30e1\u30bd\u30c3\u30c9\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3057\u3001\u578b\u5b89\u5168\u306a\u65b9\u6cd5\u3067 Kotlin \u30af\u30e9\u30b9\u8981\u7d20\u3092\u5168\u63a2\u7d22\u3059\u308b PSI \u30d3\u30b8\u30bf\u30fc\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002<code>classVisitor<\/code> \u306f\u3053\u306e\u7a2e\u306e PSI \u30d3\u30b8\u30bf\u30fc\u3092\u8fd4\u3057\u3001\u691c\u67fb\u5bfe\u8c61\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4efb\u610f\u306e Kotlin \u30af\u30e9\u30b9\u3067\u547c\u3073\u51fa\u3055\u308c\u308b DSL \u306e\u3088\u3046\u306a\u4fbf\u5229\u306a\u95a2\u6570\u3067\u3059\u3002<\/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>\u30d3\u30b8\u30bf\u30fc\u30b5\u30d6\u30af\u30e9\u30b9\u306f\u5b8c\u5168\u4fee\u98fe Kotlin \u30af\u30e9\u30b9\u540d\u3092\u62bd\u51fa\u3057\u3001\u6700\u3082\u53f3\u5074\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u8981\u7d20\u3092\u691c\u67fb\u3057\u3001\u5bfe\u5fdc\u3059\u308b\u63a5\u5c3e\u8f9e\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u4e0d\u9069\u5207\u306a\u30af\u30e9\u30b9\u540d\u306f\u3001PSI \u8981\u7d20\u3068\u3057\u3066\u306e\u5916\u5074\u306e\u30af\u30e9\u30b9\u3068\u4eba\u9593\u304c\u8aad\u307f\u53d6\u308c\u308b\u554f\u984c\u306e\u8aac\u660e\u3068\u3068\u3082\u306b <code>ProblemsHolder<\/code> \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b\u5831\u544a\u3055\u308c\u307e\u3059\u3002<\/p>\n<h4 class=\"wp-block-heading\">\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306e\u8aac\u660e<\/h4>\n<p>\u5404\u30ed\u30fc\u30ab\u30eb\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306b\u306f\u5bfe\u5fdc\u3059\u308b HTML \u5f62\u5f0f\u306e\u8a18\u8ff0\u30d5\u30a1\u30a4\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002<em>Create description file ServicePackageClassNameInspection.html<\/em>\uff08\u8a18\u8ff0\u30d5\u30a1\u30a4\u30eb ServicePackageClassNameInspection.html \u306e\u4f5c\u6210\uff09\u30af\u30a4\u30c3\u30af\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u9069\u5207\u306a\u5834\u6240\u306b <code>src\/main\/resources\/inspectionDescriptions\/ServicePackageClassName.html<\/code> \u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u304c\u4f5c\u6210\u3055\u308c\u307e\u3059\u3002\u307e\u305f\u3001Qodana \u306e\u30ec\u30dd\u30fc\u30c8\u3068 IDE \u306e\u8a2d\u5b9a\u306b\u8868\u793a\u3055\u308c\u308b\u8aac\u660e\u306e\u6307\u5b9a\u3082\u5fc5\u8981\u3067\u3059\u3002<\/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\">\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30d3\u30eb\u30c9<\/h2>\n<p>\u6e96\u5099\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u30d3\u30eb\u30c9\u306b\u7740\u624b\u3057\u307e\u3057\u3087\u3046\uff01 <code>buildPlugin<\/code> Gradle \u30bf\u30b9\u30af\u3092\u5b9f\u884c\u3057\u3001Gradle \u306e\u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u3042\u308b <code>build\/distributions\/qodana-code-inspection-0.0.1.zip<\/code> \u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002JAR \u30d5\u30a1\u30a4\u30eb\u306f Qodana \u306e\u30b9\u30ad\u30e3\u30f3\u3067\u4e3b\u306a\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3068\u3057\u3066\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002<\/p>\n<h4 class=\"wp-block-heading\">\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7\u306b\u7559\u610f\u3059\u308b<\/h4>\n<p>Qodana \u306f\u4ed8\u52a0\u7684\u306a JAR \u30a2\u30fc\u30ab\u30a4\u30d6\u3084\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3\u4f9d\u5b58\u95a2\u4fc2\u3092\u542b\u3080\u30ed\u30fc\u30ab\u30eb\u306e ZIP \u30d7\u30e9\u30b0\u30a4\u30f3\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u76f4\u63a5\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002\u3059\u3079\u3066\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306f 1 \u3064\u306e JAR \u306b\u30d1\u30c3\u30b1\u30fc\u30b8\u5316\u3055\u308c\u3066\u3044\u308b\u304b\u3001\u7279\u5b9a\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u89e3\u51cd\u3055\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<h2 class=\"wp-block-heading\">\u30d7\u30ec\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306e Qodana \u306e\u5b9f\u884c<\/h2>\n<p>Kotlin \u3067\u8a18\u8ff0\u3057\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u3067\u62e1\u5f35\u3057\u305f Qodana \u3067\u691c\u67fb\u3067\u304d\u308b\u30d7\u30e9\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3057\u3087\u3046\u3002Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u30ed\u30fc\u30ab\u30eb\u3067\u5b9f\u884c\u3059\u308b\u306b\u306f\u3001\u30b7\u30b9\u30c6\u30e0\u306b\u4ee5\u4e0b\u306e 2 \u3064\u306e\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u5fc5\u8981\u3067\u3059\u3002<\/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>\u3053\u306e\u30d7\u30ec\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u306f <code>src\/main\/kotlin\/org\/intellij\/sdk\/qodana\/service\/SomeComponent.kt<\/code> \u3068\u3044\u3046\u30af\u30e9\u30b9\u3092\u542b\u3081\u308b\u3079\u304d\u3067\u3059\u304c\u3001\u3053\u306e\u30af\u30e9\u30b9\u306f <code>Service<\/code> \u63a5\u5c3e\u8f9e\u304c\u306a\u3044\u305f\u3081\u3001\u30b3\u30fc\u30c9\u898f\u5247\u306b\u5f93\u3063\u3066\u3044\u307e\u305b\u3093\u3002Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u3092 Qodana \u306b\u7d44\u307f\u8fbc\u3080\u65b9\u6cd5\u306b\u306f\u4ee5\u4e0b\u306e 2 \u3064\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<ul>\n<li>JetBrains Marketplace \u306b\u516c\u958b\u3059\u308b\u3002<\/li>\n<li>\u3055\u3089\u306b\u8fc5\u901f\u306a\u89e3\u6c7a\u7b56\u3068\u3057\u3066\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u306e JAR \u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e <code>.qodana<\/code> \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u914d\u7f6e\u3059\u308b\u3002<\/li>\n<\/ul>\n<p>\u30d3\u30eb\u30c9\u4f5c\u696d\u3092\u5358\u7d14\u5316\u3059\u308b\u305f\u3081\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e <code>build\/distributions\/qodana-code-inspection-0.0.1.zip<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u30d7\u30ec\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e <code>.qodana\/qodana-code-inspection-0.0.1.zip<\/code> \u30d5\u30a1\u30a4\u30eb\u306b\u30b3\u30d4\u30fc\u3057\u3066\u304f\u3060\u3055\u3044\u3002<code>.qodana<\/code> \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u306a\u3044\u5834\u5408\u306f\u4f5c\u6210\u3057\u307e\u3057\u3087\u3046\u3002\u6b21\u306b\u3001\u4efb\u610f\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u304b\u30c4\u30fc\u30eb\u3067\u30a2\u30fc\u30ab\u30a4\u30d6\u3092\u62bd\u51fa\u3057\u307e\u3059\u3002Qodana \u306f <code>build\/distributions\/qodana-code-inspection<\/code> \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u30ab\u30b9\u30bf\u30e0\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u542b\u3081\u308b\u3088\u3046\u306b Qodana \u3092\u69cb\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30d7\u30ec\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30eb\u30fc\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e <code>qodana.yaml<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/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><code>include<\/code> \u30d6\u30ed\u30c3\u30af\u306f\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u3067\u4f7f\u7528\u3067\u304d\u308b\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306e\u5b8c\u5168\u4fee\u98fe\u30af\u30e9\u30b9\u540d\u3092\u53c2\u7167\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066 Qodana \u3092\u5b9f\u884c\u3057\u307e\u3057\u3087\u3046\u3002<\/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>\u3059\u308b\u3068\u3001\u5bfe\u5fdc\u3059\u308b Qodana \u306e Docker \u30a4\u30e1\u30fc\u30b8\u304c\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3059\u3002Docker \u30b3\u30f3\u30c6\u30ca\u30fc\u304c\u4f5c\u6210\u3055\u308c\u3001Qodana \u306e\u69cb\u6210\u306b\u57fa\u3065\u3044\u3066\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002Qodana \u306e\u5b9f\u884c\u74b0\u5883\u5185\u3067\u30ab\u30b9\u30bf\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u3001Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u304b\u3089 Qodana \u306e Docker \u30b3\u30f3\u30c6\u30ca\u30fc\u5185\u306e\u9069\u5207\u306a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u76f4\u63a5\u30de\u30a6\u30f3\u30c8\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u6570\u5206\u5f8c\u306b Qodana \u304c\u30ec\u30dd\u30fc\u30c8\u306e\u8981\u7d04\u3092\u751f\u6210\u3057\u3001\u6a19\u6e96\u51fa\u529b\u306b\u51fa\u529b\u3057\u307e\u3059\u3002<\/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>\u5b8c\u5168\u306a\u30ec\u30dd\u30fc\u30c8\u3092\u30d6\u30e9\u30a6\u30b6\u30fc\u3067\u958b\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/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 \u306b\u3088\u308a\u3001<code>SomeComponent<\/code> \u304c Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30ed\u30fc\u30ab\u30eb\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u304b\u3089\u6307\u5b9a\u3055\u308c\u305f\u30b3\u30fc\u30c9\u898f\u5247\u306b\u5f93\u3063\u3066\u3044\u306a\u3044\u3053\u3068\u304c\u793a\u3055\u308c\u307e\u3059\u3002<\/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\">\u4ee5\u964d\u306e\u5b9f\u884c\u306e\u305f\u3081\u306e\u30d2\u30f3\u30c8<\/h4>\n<p>Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u304c\u5909\u66f4\u3055\u308c\u3066\u518d\u30d3\u30eb\u30c9\u3055\u308c\u308b\u969b\u306b\u306f\u3001Qodana \u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3082\u518d\u4f5c\u6210\u3055\u308c\u308b\u3088\u3046\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u306e\u3088\u3046\u306a\u5834\u5408\u306f\u3001<code>--clear-cache<\/code> CLI \u30b9\u30a4\u30c3\u30c1\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001Qodana \u5b9f\u884c\u74b0\u5883\u306e\u3059\u3079\u3066\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u518d\u8aad\u307f\u8fbc\u307f\u3067\u304d\u307e\u3059\u3002<\/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\">IDE \u3078\u306e Qodana \u306e\u7d44\u307f\u8fbc\u307f<\/h2>\n<p>Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u306f IDE \u306b\u5bfe\u3057\u3066<a href=\"http:\/\/pleiades.io\/help\/idea\/managing-plugins.html#install_plugin_from_disk\" target=\"_blank\" rel=\"noreferrer noopener\">\u30c7\u30a3\u30b9\u30af\u304b\u3089\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u307e\u3059<\/a>\u3002\u3059\u308b\u3068\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u304c\u81ea\u52d5\u7684\u306b\u6709\u52b9\u5316\u3055\u308c\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u5185\u306e\u4efb\u610f\u306e Kotlin \u30af\u30e9\u30b9\u3067\u547c\u3073\u51fa\u3055\u308c\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u52d5\u4f5c\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u3001\u30d7\u30ec\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u623b\u3063\u3066 <code>org.intellij.sdk.qodana.service.SomeComponent<\/code> \u30af\u30e9\u30b9\u3092\u958b\u304d\u3001\u554f\u984c\u306e\u3042\u308b\u30af\u30e9\u30b9\u540d\u306b\u4e0b\u7dda\u304c\u4ed8\u304f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u5229\u4fbf\u6027\u3092\u8003\u616e\u3057\u3001\u30af\u30e9\u30b9\u540d\u306b\u30de\u30a6\u30b9\u30dd\u30a4\u30f3\u30bf\u30fc\u3092\u5408\u308f\u305b\u305f\u969b\u306b\u306f\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306e\u7d50\u679c\u3068\u554f\u984c\u306e\u8aac\u660e\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<em>Problems<\/em>\uff08\u554f\u984c\uff09\u30c4\u30fc\u30eb\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u958b\u304d\u3001\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306b\u3088\u3063\u3066\u5831\u544a\u3055\u308c\u305f\u3059\u3079\u3066\u306e\u554f\u984c\u306e\u30ea\u30b9\u30c8\u3067\u554f\u984c\u3092\u78ba\u8a8d\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u304c IDE \u304c\u63d0\u4f9b\u3059\u308b\u4ed6\u306e\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3068\u540c\u69d8\u306b\u52d5\u4f5c\u3059\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<em>Settings<\/em>\uff08\u8a2d\u5b9a\uff09| <em>Editor <\/em>\uff08\u30a8\u30c7\u30a3\u30bf\u30fc\uff09| <em>Inspections\uff08\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\uff09| Kotlin<\/em> \u306b\u306f\u3001<em>SDK: Discouraged class name<\/em> \u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306b\u52a0\u3048\u3066\u3001\u524d\u306b\u6307\u5b9a\u3057\u305f HTML \u30d5\u30a1\u30a4\u30eb\u304b\u3089\u53d6\u5f97\u3055\u308c\u305f\u8aac\u660e\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<h3 class=\"wp-block-heading\">IDE \u5185\u3067 Qodana \u3092\u5b9f\u884c\u3059\u308b<\/h3>\n<p>\u30d7\u30e9\u30b0\u30a4\u30f3\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u3053\u3068\u3067\u3001IDE \u304b\u3089\u3082 Qodana \u3092\u5b9f\u884c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<em>Problems<\/em>\uff08\u554f\u984c\uff09\u30c4\u30fc\u30eb\u30a6\u30a3\u30f3\u30c9\u30a6\u306e <em>Qodana<\/em> \u30bf\u30d6\u306b\u79fb\u52d5\u3057\u3001<em>Try Locally<\/em>\uff08\u30ed\u30fc\u30ab\u30eb\u3067\u8a66\u3059\uff09\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002Qodana \u304c <code>qodana.yaml<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3057\u3066\u69cb\u6210\u3055\u308c\u3001\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002Qodana \u306e\u30ec\u30dd\u30fc\u30c8\u306f\u30c4\u30fc\u30eb\u30a6\u30a3\u30f3\u30c9\u30a6\u5185\u3067\u76f4\u63a5\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/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 \u30d7\u30e9\u30b0\u30a4\u30f3\u3068 JetBrains Marketplace<\/h2>\n<p>\u30d3\u30eb\u30c9\u3068\u30c6\u30b9\u30c8\u304c\u9069\u5207\u306b\u884c\u308f\u308c\u305f\u30ab\u30b9\u30bf\u30e0\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u30d7\u30e9\u30b0\u30a4\u30f3\u3092 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/marketplace\/publishing-and-listing-your-plugin.html\" target=\"_blank\" rel=\"noreferrer noopener\">JetBrains Marketplace \u3067\u516c\u958b<\/a>\u3059\u308b\u3068\u3001<code>.qodana<\/code> \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u3089\u914d\u5e03\u3059\u308b\u5fc5\u8981\u304c\u306a\u304f\u306a\u308a\u307e\u3059\u3002\u305f\u3060\u3057\u3001Qodana \u306e\u69cb\u6210\u304c\u30d7\u30e9\u30b0\u30a4\u30f3\u8a18\u8ff0\u5b50\u306e <code><mark class=\"has-inline-color\" style=\"color: #1c8212;\">id<\/mark><\/code> \u8981\u7d20\u306b\u4e00\u81f4\u3059\u308b\u516c\u958b\u30d7\u30e9\u30b0\u30a4\u30f3\u8b58\u5225\u5b50\u3092\u78ba\u5b9f\u306b\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/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>Qodana \u306e <code>scan<\/code> \u30b3\u30de\u30f3\u30c9\u306f\u3001.<code>qodana<\/code> \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u30de\u30a6\u30f3\u30c8\u304c\u4e0d\u8981\u306b\u306a\u3063\u305f\u305f\u3081\u3001\u5358\u7d14\u5316\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/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 \u306f\u3053\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u3092 JetBrains Marketplace \u304b\u3089\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3001\u305d\u306e\u3059\u3079\u3066\u306e\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u3001\u30b3\u30f3\u30bd\u30fc\u30eb\u306e\u51fa\u529b\u3068\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u30fc\u3067\u8868\u793a\u53ef\u80fd\u306a HTML \u30ec\u30dd\u30fc\u30c8\u306e\u4e21\u65b9\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n<h2 class=\"wp-block-heading\">\u307e\u3068\u3081<\/h2>\n<p>\u7279\u5b9a\u306e\u30b3\u30fc\u30c9\u898f\u5247\u3092\u78ba\u8a8d\u3059\u308b\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u542b\u3080 Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002\u307e\u305f\u3001\u305d\u308c\u3092\u5b9f\u884c\u3059\u308b\u65b9\u6cd5\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3044\u304f\u3064\u304b\u5b58\u5728\u3057\u307e\u3059\u3002<\/p>\n<ul>\n<li><code>.qodana<\/code> \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b JAR \u3068\u3057\u3066\u914d\u7f6e\u3057\u3001Qodana YAML \u30d5\u30a1\u30a4\u30eb\u306b\u30a4\u30f3\u30af\u30eb\u30fc\u30c9\u3059\u308b\u5f62\u3067\u5b9f\u884c\u3059\u308b\u3002<\/li>\n<li>JetBrains Marketplace \u306e\u516c\u958b\u30d7\u30e9\u30b0\u30a4\u30f3\u3078\u306e\u53c2\u7167\u3068\u3057\u3066\u5b9f\u884c\u3059\u308b\u3002<\/li>\n<li>IDE \u306b JAR \u3068\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u5b9f\u884c\u3059\u308b\uff08\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30ab\u30eb\u306e Qodana \u306e\u5b9f\u884c\u306b\u9069\u7528\u3055\u305b\u308b\uff09\u3002<\/li>\n<li>IDE \u306b JAR \u3068\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u5b9f\u884c\u3059\u308b\uff08\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u3092\u7d44\u307f\u8fbc\u307f\u306e\u30b3\u30fc\u30c9\u30a4\u30f3\u30b9\u30da\u30af\u30b7\u30e7\u30f3\u306b\u30a4\u30f3\u30af\u30eb\u30fc\u30c9\u3055\u305b\u308b\uff09\u3002<\/li>\n<\/ul>\n<p>Qodana \u30d7\u30e9\u30b0\u30a4\u30f3\u3068\u30d7\u30ec\u30a4\u30b0\u30e9\u30a6\u30f3\u30c9\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u7c21\u6f54\u306a\u4f8b\u306b\u3064\u3044\u3066\u306f\u3001<a href=\"https:\/\/github.com\/JetBrains\/intellij-sdk-code-samples\/tree\/main\/code_inspection_qodana\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ SDK \u306e\u30b3\u30fc\u30c9\u30b5\u30f3\u30d7\u30eb<\/a>\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002<\/p>\n<p><strong>\u30aa\u30ea\u30b8\u30ca\u30eb\uff08\u82f1\u8a9e\uff09\u30d6\u30ed\u30b0\u6295\u7a3f\u8a18\u4e8b\u306e\u4f5c\u8005\uff1a<\/strong><\/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":1394,"featured_media":689087,"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\/ja\/wp-json\/wp\/v2\/platform\/689000"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/platform"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/types\/platform"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/users\/1394"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/comments?post=689000"}],"version-history":[{"count":7,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/platform\/689000\/revisions"}],"predecessor-version":[{"id":689377,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/platform\/689000\/revisions\/689377"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/media\/689087"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/media?parent=689000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/categories?post=689000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/tags?post=689000"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ja\/wp-json\/wp\/v2\/cross-post-tag?post=689000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}