Kotlinでライブラリを作るときに、sourceJar内にソースコードのファイルが上手く入らなくて小一時間悩んだので、簡単にまとめておきます。
環境
- macOS Sierra
- Android Studio 3.0
- Gradle 4.1
- Android Plugin for Gradle 3.0.0
- kotlin, kotlin-gradle-plugin 1.1.51
問題
たとえば、Androidプロジェクトを新規に立ち上げて、 app/build.gradle
にこんな感じの設定を書いて、
//...
task sourceJar(type: Jar) {
classifier = "sources"
from android.sourceSets.main.java.sourceFiles
}
定義したタスクを実行すると、 app/build/libs/app-sources.jar
が生成される
$ pwd
/path/to/sample
$ find app/src/main -name "*.java"
app/src/main/java/com/litmon/app/sample/MainActivity.java
$ ./gradlew sourceJar
$ ls app/build/libs/
. .. app-sources.jar
この app-sources.jar
の中身を見てみると、
$ jar tf app/build/libs/app-sources.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/litmon/
com/litmon/app/sample/
com/litmon/app/sample/MainActivity.java
javaのソースコードは含まれている(これは想定通り)
このプロジェクトの MainActivity.java
をKotlinに変換して、再度gradleタスクを走らせてjarを再生成して、中身を見てみると、
# After Convert Java File to Kotlin File
$ find app/src/main -name "*.kt"
app/src/main/java/com/litmon/app/sample/MainActivity.kt
$ ./gradlew sourceJar
$ jar tf app/build/libs/app-sources.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/litmon/
com/litmon/app/
com/litmon/app/sample/
なんと MainActivity.kt
ファイルが含まれていない!!(想定外)
解決策
app/build.gradle
の from ~~~.sourceFiles
の部分を、 from ~~~.srcDirs
にすると解決する
//...
task sourceJar(type: Jar) {
classifier = "sources"
from android.sourceSets.main.java.srcDirs // <- ここ
}
$ ./gradlew sourceJar
$ jar tf app/build/libs/app-sources.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/litmon/
com/litmon/app/
com/litmon/app/sample/
com/litmon/app/sample/MainActivity.kt
原因は?
よく分かりません。詳しい方がいたら教えてください
http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.api.AndroidSourceDirectorySet.html#com.android.build.gradle.api.AndroidSourceDirectorySet:sourceFiles
FileTree sourceFiles
The list of source files as a FileTree
うーん。
分からん。
https://developer.android.com/studio/build/build-variants.html#configure-sourcesets とかでは、 android.sourceSets.main.java.srcDirs
を触っているので、基本的にここにソースコードが含まれると思ったほうがいいってことなんだろうか?
以下、上記サイトから一部抜粋
android {
...
sourceSets {
// Encapsulates configurations for the main source set.
main {
// Changes the directory for Java sources. The default directory is
// 'src/main/java'.
java.srcDirs = ['other/java']
ちなみに
Javaプロジェクトの方で srcDirs
にしても、問題なくjarファイルにソースコードは含まれます
//...
task sourceJar(type: Jar) {
classifier = "sources"
from android.sourceSets.main.java.srcDirs
}
$ ./gradlew sourceJar
$ jar tf app/build/libs/app-sources.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/litmon/
com/litmon/app/
com/litmon/app/sample/
com/litmon/app/sample/MainActivity.java
結論
基本は from android.sourceSets.main.java.srcDirs
を使っていきましょう。