Gradle:JavaExecの使い方

2019年6月3日

JavaExecは、特にjarファイルにまとめなくとも、ソースをコンパイルした状態で実行できる。

task something(type: JavaExec, dependsOn: ['classes']) {
  main = "foo.bar.Something"
  classpath = sourceSets.main.runtimeClasspath
}

などとする。

失敗の場合の調査の仕方

が、失敗した場合、以下の簡単なメッセージしか出ないことも多い。

* What went wrong:
Execution failed for task ':something'.
> Process 'command 'C:\Program Files\Java\jdk1.8.0_112\bin\java.exe'' finished with non-zero exit value 1

このような場合は、コマンドライン全体を表示させることができる。

task something(type: JavaExec, dependsOn: ['classes']) {
  main = "foo.bar.Something"
  classpath = sourceSets.main.runtimeClasspath
  doFirst {
    println commandLine
  }
}

以下のような文字列が表示される。これは非常に長いものになるが、実際にjavaコマンドに与えられているものだ。

[C:\Program Files\Java\jdk1.8.0_112\bin\java.exe, -Dfile.encoding=UTF-8, -Duser.country=JP, -Duser.language=en, -Duser.variant, -cp, C:\foo\bar\classes;C:\Users\admin\.gradle\caches\modules-2\files-2.1\com.gwtcenter\admin\1.2\da074104a1004f4e2279d989f831cf77161772eb\admin-1.2.jar;.... C:\Users\admin\.gradle\caches\modules-2\files-2.1\org.codehaus.mojo\animal-sniffer-annotations\1.14\775b7e22fb10026eed3f86e8dc556dfafe35f2d5\animal-sniffer-annotations-1.14.jar, foo.bar.Main]

マニュアルは、JavaExecにある。

クラスパスを追加するには?

上の例では、classpathとしてsourceSets.main.runtimeClasspathが指定されているのだが、この意味がわからない。おそらくは、runtimeというconfigurationに含まれている依存と思われるのだが、しかし、それ以外の依存を入れたい場合にはどうしたら良いのだろうか?

まず上記の設定というのは以下と同一のようだ。

task something(type: JavaExec, dependsOn: ['classes']) {
  main = "foo.bar.Something"
  classpath = sourceSets.main.output + configurations.runtime
}

つまり、mainのソースから出力されたclasses+mainの依存ということになる。ここまでわかれば簡単だ。

例えば以下を記述し、

configurations {
  extra
}


dependencies {
  extra group: 'com.google.gwt', name: 'gwt-user', version: '2.8.2'
  ...

以下とすればよい。

task something(type: JavaExec, dependsOn: ['classes']) {
  main = "foo.bar.Something"
  classpath = sourceSets.main.output + configurations.runtime + configurations.extra
}

参考