GradleのEclipseプラグインにモジュール対応させる

最新のGradle5.5になってもそのEclipseプラグインは、Eclipseクラスパス生成においてモジュール対応していないようだ。そこで、このEclipseの出力結果を変更して強制的に対応させることにする。

.projectにおけるフラグ

まず、モジュールとしてjarファイルを登録した場合に.projectファイルがどうなるかだが、以下のようになる。

    <classpathentry kind="lib" path="....javax.ws.rs-api-2.1.1.jar" sourcepath="....javax.ws.rs-api-2.1.1-sources.jar">
        <attributes>
            <attribute name="module" value="true"/> <!-- これ -->
            <attribute name="gradle_used_by_scope" value="main,test"/>
        </attributes>
    </classpathentry>

単にmodule=trueというフラグがつくだけである。

モジュール対応させる方法

How to set the module path (project Jigsaw) for eclipse projects via gradle?にやり方を説明している人がいた。

以下に転載しておく。

eclipse {
    project {
        natures 'org.eclipse.buildship.core.gradleprojectnature'
    }

    classpath {
        file {
            whenMerged {
                entries.findAll { isModule(it) }.each { //(1)
                    it.entryAttributes['module'] = 'true'
                }

                entries.findAll { isSource(it) && isTestScope(it) }.each {
                    it.entryAttributes['test'] = 'true'
                }

                entries.findAll { isLibrary(it) && isTestScope(it) }.each {
                    it.entryAttributes['test'] = 'true'
                }
            }
        }

        defaultOutputDir = file('build')
        downloadSources = true
        downloadJavadoc = true
    }
}

boolean isLibrary(entry) { return entry.properties.kind.equals('lib') }
boolean isTestScope(entry) { return entry.entryAttributes.get('gradle_used_by_scope').equals('test'); }
boolean isModule(entry) { isLibrary(entry) && !isTestScope(entry); }
boolean isSource(entry) { return entry.properties.kind.equals('src'); }