読者です 読者をやめる 読者になる 読者になる

Gradleでリソースファイルの出力先を変更

Java Groovy

GradleJava プラグインを使う場合、main のクラスファイルやリソースファイルの出力先は下記のようになっています。

Gradle 1.7
ファイル種類 出力先の設定 デフォルト値
クラスファイル sourceSets.main.output.classesDir build/classes/main
リソースファイル sourceSets.main.output.resourcesDir build/resources/main

Maven とは違ってクラスファイルとリソースファイルを別々のディレクトリへ出力するようになっていますが、この動作で不都合の生じる場合は下記のようにしてリソースファイルの出力先を変更する事になります。

sourceSets.main.output.resourcesDir = ・・・
sourceSets {
    main {
        output.resourcesDir = ・・・
    }
}

リソースファイル出力先の変更例 (Weld の単体実行)

不都合の生じるケースとして、CDIJava Contents and Dependency Injection) の参照実装である Weld を Gradle 上で単体実行するケースが挙げられます。

Weld の単体実行は META-INF/beans.xml の配置されているディレクトリから DI 対象のクラスを探す ので、クラスファイルとリソースファイルの配置場所が異なっていると DI 対象のクラスを見つけられず CDI が正常に機能しません。

この場合、下記のように sourceSets.main.output.classesDir の値を sourceSets.main.output.resourcesDir へ設定し、リソースファイルをクラスファイルと同じディレクトリへ出力させれば問題は解決します。

リソースファイルの出力先変更例 (build.gradle)
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.jboss.weld.se:weld-se-core:2.0.3.Final'
    compile 'org.slf4j:slf4j-simple:1.7.5'
}

sourceSets {
    main {
        // クラスファイルと同じディレクトリへリソースファイルを出力する設定
        output.resourcesDir = output.classesDir
    }
}

task run(dependsOn: 'build') << {
    // Weld の単体実行
    javaexec {
        main = 'org.jboss.weld.environment.se.StartMain'
        classpath = runtimeClasspath
    }
}
実行例
> gradle run
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
:run
[main] INFO org.jboss.weld.Version - WELD-000900 2.0.3 (Final)
・・・

補足

上記 Weld 単体実行のケースは、生成された JAR ファイルをクラスパスへ追加する事でも対応可能です。(この場合、リソースファイルの出力先変更は不要)

クラスパスへ JAR を追加して対応する例 (build.gradle)
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.jboss.weld.se:weld-se-core:2.0.3.Final'
    compile 'org.slf4j:slf4j-simple:1.7.5'
}

task run(dependsOn: 'build') << {
    // Weld の単体実行
    javaexec {
        main = 'org.jboss.weld.environment.se.StartMain'
        // 生成された JAR ファイルをクラスパスへ追加
        classpath = runtimeClasspath + files(jar.archivePath)
    }
}