頭ン中

学んだことや興味を持ったことなど。

Gradleのideaプラグインで生成したideaプロジェクトにresourceフォルダを認識させたい。

環境

  • Gradle 4.1
  • IntelliJ IDEA Community Edition 2016.1.4 (Javaプロジェクト)

IDEAは2017.2.5でも確認。

目的

表題通り。gradle ideaで生成したファイルを使うとsrc/main/resourceがsourceフォルダとして認識されていたのが気になった。

f:id:kikuko72:20171012215837p:plain

調査

最初はIDEAプラグインの設定で出来るものと思っていた。 ……が、sourceとtestSourceの指定はあるがresourceの指定は無い……。

IdeaModule - Gradle DSL Version 2.2-20140924021627+0000

どうも、「IDEAはsourceとresourceの区別してなくね?」とのこと。

Support resource output directory configuration · Issue #1282 · gradle/gradle · GitHub

よろしい、ならば力技だ。

withXmlフックを使う。

第39章 IDEAプラグイン

IDEAのmoduleの管理はimlファイルがやっているらしい。

まずはGradleで生成したimlファイルとGUI上からresourceフォルダと認識させたimlファイルの差分を比較する。

IDEAから開くだけでも空白などの差分が出るが、目的の差分はシンプルだった。

<sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false"/>

<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />

確かにさっきのissueの通り、GUI上の見た目は変わるが、xml要素としては同じものっぽい。

type属性に"java-resource"がついていれば良さそう。

対処

ということでwithXmlフックを使ってtype属性に無理やり書き込む。

idea.module.iml {
    withXml { provider ->
        provider.node.component.content.sourceFolder
        .find { it.@url = 'file://$MODULE_DIR$/src/main/resources'}.@type = 'java-resource'
    }
}

完全に力技。

これでGradleに生成させたファイルをIDEAで読み込むと無事resourceフォルダとして認識された。

f:id:kikuko72:20171012221809p:plain

あとがき

無理やりやったのでimlファイルの取扱が変わると問題が起こるかもしれません。