事象
下記のようなbuild.gradleファイルを用いてビルドを行った際に、jarファイルが生成されるが、その中身にクラスファイルが存在していませんでした。
apply plugin: 'java'
group = 'com.test.foo'
version = '1.0.0'
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
compileJava {
options.encoding = 'UTF-8'
}
repositories {
mavenCentral()
}
dependencies {
implementation('org.slf4j:slf4j-api:1.7.21')
testCompile 'junit:junit:4.12'
testCompile 'org.hamcrest:hamcrest-library:1.3'
}
原因と解決策
今回の事象の原因は、javaファイルが/src
配下に存在していたことでした。
今回Javaプラグインを用いていますが、このプラグインはデフォルトのままですと/src/main/java
配下のjavaファイルをビルドするようになっています。
そこで、javaファイルを/src/main/java
配下に移しビルドを行ったところ、無事にjarファイル内にクラスファイルが生成されていました。
今回もともとAntでビルドが行われていたプロジェクトをGradleでビルドするように変更するという背景もあり、ソースのディレクトリ構造をあまり意識していなかったので、Javaプラグインにこのような条件があったのを知りませんでした。
ちなみに、こちらにあるようにsourceSets
を用いることで、ビルド対象のディレクトリを設定することもできます。
今回は他のプロジェクトとの統一感を考えて/src/main/java
配下にソースを移動するという方針を取りましたが、この方針もスマートだと思います。
まとめ
Gradleを用いて生成したjarファイル内にクラスファイルが存在しない場合は、ディレクトリ構成およびGradleのビルド対象のディレクトリがどうなっているかを確認してみてください。
Javaプラグインを用いている場合は、デフォルトで/src/main/java
配下のjavaファイルをビルドするようになっていますので、ディレクトリ構成をこれに合わせるか、ビルドする際に参照するディレクトリを明示的に設定するようにしてください。