spring boot ・ doma を使用した際の eclipse (gradle) の環境設定

spring boot で作成した プログラムで、データベースにアクセスする際の O/Rマッパーに doma を選択した際に、依存管理ツールに doma-spring-boot-stater を指定します。

いざ、eclipse で開発しようとした際、doma-n.n.n.jar を使用した環境設定は、公式(※1)を含めて多数存在します。しかし、doma-spring-boot-stater に関しての詳細な設定方法等が見つからなかったので、調査した内容をここに記載します。

■使用環境

windows 10

eclipse 4.15.0
gradle 6.3

doma-spring-boot-starter 1.4.0
doma-processor 2.35.0

■ファクトリーパスの設定

公式ページの説明では、Maven Central Repository より doma を入手し、ファクトリーパスに doma-n.n.n.jar を設定するように記載されています。(※1)

doma-spring-boot-stater の場合、gradle に記載する依存の設定は以下の通りになります。
※必要な箇所のみ抜粋

dependencies {
  implementation "org.seasar.doma.boot:doma-spring-boot-starter:1.4.0"
  annotationProcessor "org.seasar.doma:doma-processor:2.35.0"
}

上記を反映すると、doma-n.n.n.jar が取り込まれません。
代わりに、doma-core-2.35.0.jar が取り込まれます。

gradle の dependencies に設定した doma-processor と共に、doma-core-2.35.0.jar をファクトリーパスに設定する必要があります。
この時、下記画像の通りの順番も関係ありますので、ご注意ください。

※例)[外部jarの追加]より.gradle 配下のファイルを直接指定

■DOMA4019 エラー対応

gradle をデフォルトで使用した際 eclipse 上で[ DOMA4019 ]エラーが発生し、ビルドが失敗します。

javaのビルドパスで、「ソース・フォルダーごとに出力フォルダーの指定を可能にする」にチェックが入っている為です。
こちらのチェックを外すと、エラーが解消されます。

以上、eclipse での躓き箇所と 解決方法でした。

最後に、上記を含めた gradle の設定を公開します。

■gradle の設定

//  doma の gradle設定について、下記を参照してください。
//      https://doma.readthedocs.io/en/2.20.0/build/(日本語訳ページ)

// テンポラリディレクトリのパスを定義する
ext.domaResourcesDir = "${buildDir}/tmp/doma-resources"

  // ---- debug用 -------------------------------------
  //  println "processResources.destinationDir is ${processResources.destinationDir}"
  //  println "ext.domaResourcesDir            is ${ext.domaResourcesDir}"
  //  println "compileJava.destinationDir      is ${compileJava.destinationDir}"

// domaが注釈処理で参照するリソースをテンポラリディレクトリに抽出
task extractDomaResources(type: Copy, dependsOn: processResources)  {
  from processResources.destinationDir
  include 'doma.compile.config'
  include 'META-INF/**/*.sql'
  include 'META-INF/**/*.script'
  into domaResourcesDir
}

// テンポラリディレクトリ内のリソースをcompileJavaタスクの出力先ディレクトリにコピーする
task copyDomaResources(type: Copy, dependsOn: extractDomaResources)  {
  from domaResourcesDir
  into compileJava.destinationDir
}

compileJava {
  // 上述のタスクに依存させる
  dependsOn copyDomaResources
  // テンポラリディレクトリをcompileJavaタスクの入力ディレクトリに設定する
  inputs.dir domaResourcesDir
  options.encoding = 'UTF-8'
}

repositories {
  mavenCentral()
  mavenLocal()
  maven {url 'https://oss.sonatype.org/content/repositories/snapshots/'}
}

dependencies {
  implementation "org.seasar.doma.boot:doma-spring-boot-starter:1.4.0"
  annotationProcessor "org.seasar.doma:doma-processor:2.35.0"
}

eclipse {
  classpath {
    // [DOMA4019] 対応
    //   ソース毎の出力先指定を解除
    file.whenMerged {
      entries.each { entry ->
        if (entry.kind == 'src' && entry.hasProperty('output')) {
          entry.output = null
        }
      }
    }
  }
}

eclipse.jdt.file {
    // [Javaコンパイラー]->[注釈処理] の設定
    def  eclipseAptPrefsFile = '.settings/org.eclipse.jdt.apt.core.prefs'
    file(eclipseAptPrefsFile).write """\
      |eclipse.preferences.version=1
      |org.eclipse.jdt.apt.aptEnabled=true
      |org.eclipse.jdt.apt.genSrcDir=.apt_generated
      |org.eclipse.jdt.apt.genTestSrcDir=.apt_generated_tests
      |org.eclipse.jdt.apt.reconcileEnabled=true
      |""".stripMargin()


    // [Javaコンパイラー]->[注釈処理]->[ファクトリーパス] の設定
    def f = file(".factorypath")
    def w = new FileWriter(f)
    def jar = ""

    def xml = new groovy.xml.MarkupBuilder(w)
    xml.setDoubleQuotes(true)
    xml."factorypath"() {
      // doma-core.jar の読込み
      jar = configurations.annotationProcessor.find { File file -> file.name.matches('doma-core[^//]*') }
      'factorypathentry'(kind: 'EXTJAR', id: jar, enabled: true, runInBatchMode: false)

      // doma-processorjar の読込み
      jar = configurations.annotationProcessor.find { File file -> file.name.matches('doma-processor[^//]*') }
      'factorypathentry'(kind: 'EXTJAR', id: jar, enabled: true, runInBatchMode: false)
    }
    w.close()
}

上記を設定し、gradle eclipse もしくは、eclipse 上で [Gradle] -> [Gradle プロジェクトのリフレッシュ]を実行すると、本記事のファクトリーパスの設定・DOMA4019 を自動対応します。

■参考情報
※1:参考にした、doma 公式の設定ページ。
   https://doma.readthedocs.io/en/2.20.0/build/