Gradle/Eclipseプラグインでビルドパスに他プロジェクトを追加



ここで書くのは、EclipseのGradleプラグインではなく、GradleのEclipseプラグインである。つまり、build.gradleの中の以下のことだ。

apply plugin: 'eclipse'

すべての投稿は/tag/gradle-eclipseにあるので参照されたい。

問題点

gradleのeclipseプラグインは非常に便利で、基本的にbuild.gradleに記述した通りにEclipseの環境、.projectと.classpathを自動的に設定してくれる。特に便利なのは、ビルドパスの自動設定だ。

しかし、開発段階でEclipseの他プロジェクトを参照したいとき、これを簡単に設定する方法が無い。つまり、以下をやりたいのだが、常に手で設定しなくてはいけない。

これは.classpathファイルに以下のように記述されるらしい。これをgradleに挿入させる方法は無いものか。

    <classpathentry combineaccessrules="false" kind="src" path="/github_depDetect"/>
    <classpathentry combineaccessrules="false" kind="src" path="/github_fxwrapper"/>

完全ではない一応の解決策

以下のようにする。他に使用している機能はコメントで示している

def addOtherProjects = { cp->
  ['/github_depDetect', '/github_fxwrapper'].each{
    cp.entries.add(
      new org.gradle.plugins.ide.eclipse.model.SourceFolder(it, null)
    )
  }
}

eclipse {
  classpath {          
    //downloadSources=true
    file  {
      whenMerged {cp->
        //removeDuplicatedSources(cp)
        //removeOutputFoldersForSourceFolders(cp)
        //removeAllExcludes(cp)
        addOtherProjects(cp)
      }
    }    
  }     
}

一応はビルドパスに入れてくれるのだが、しかし以下の状態になる。

    <classpathentry kind="src" path="/github_depDetect"/>
    <classpathentry kind="src" path="/github_fxwrapper"/>

「combineaccessrules=”false”」が抜けているのだ。

combineaccessrulesとは何か?

これはビルドパスの設定で、以下のようにAccess rulesをダブルクリックし、出てきたダイアログにて「Combine rules with the access rules of the exported project entries」のチェックをはずすと表示されるらしい。

実際に片方についてチェックOFFしてみるとこうなる。

    <classpathentry combineaccessrules="false" kind="src" path="/github_depDetect"/>
    <classpathentry kind="src" path="/github_fxwrapper"/>

答えはWhat does combineaccessrules mean in Eclipse classpaths?にあった。

要するに、依存しているプロジェクトの中の使ってはいけないAPIを指定するものらしい。

例えば、プロジェクトAにプロジェクトBが依存しており、プロジェクトAの中のまだ開発中で不安定なAPIをBに使わせたくない場合に設定するというものらしい。