Eclipse + Gradleのマルチプロジェクトのハマりどころ

EclipseでGradleのマルチプロジェクト構成で開発,構成管理をしていると結構ハマる。 IntellijVSCodeに乗り換えたいのだが,だいたいマルチプロジェクトがうまく機能しなくて頓挫している。 ちなみに,なぜマルチプロジェクトにしているかというと,不用意に密結合をできるだけ避けるため。

.settings/org.eclipse.buildship.core.prefs

これがないとエラーが起きるが,この設定次第でエラーは起きる。 ファイルの設定次第ではビルドがうまくいかなくなることもあるので注意が必要。 しかも,ビルドの度に勝手に書き換わる。

connection.project.dir=
eclipse.preferences.version=1

Gradleでビルドすると,依存関係の親のプロジェクト(master)が自動的に設定される。

connection.project.dir=master

しかし,この設定だと,親のプロジェクトがないとビルドできない状態になる。 親のプロジェクトなしでビルドしたい場合は,消す必要がある。

プロジェクト間の依存関係を動的に変えたりしなければ,別に苦労しないのかもしれないが。

Classpath

Classpathも結構めんどくさいことになりやすい。 gradle eclipseclasspathを生成すると,環境依存のフルパスが入ってしまうので,使いづらい。

以下が雛形になると思う。

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="bin/main" path="src/main/java">
        <attributes>
            <attribute name="gradle_scope" value="main"/>
            <attribute name="gradle_used_by_scope" value="main,test"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="bin/main" path="src/main/resources">
        <attributes>
            <attribute name="gradle_scope" value="main"/>
            <attribute name="gradle_used_by_scope" value="main,test"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="bin/test" path="src/test/java">
        <attributes>
            <attribute name="gradle_scope" value="test"/>
            <attribute name="gradle_used_by_scope" value="test"/>
            <attribute name="test" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="bin/test" path="src/test/resources">
        <attributes>
            <attribute name="gradle_scope" value="test"/>
            <attribute name="gradle_used_by_scope" value="test"/>
            <attribute name="test" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11/"/>
    <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
    <classpathentry kind="output" path="bin/default"/>
</classpath>

Gradleの依存関係は以下の一行で済む。

 <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>