LoginSignup
4
3

More than 5 years have passed since last update.

Kotlinプロジェクトに対してsourceJarを生成するときにソースコードがjarに含まれないときの対処法

Posted at

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 にこんな感じの設定を書いて、

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.gradlefrom ~~~.sourceFiles の部分を、 from ~~~.srcDirs にすると解決する

app/build.gradle
//...

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

原因は?

よく分かりません。詳しい方がいたら教えてください :cry:
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ファイルにソースコードは含まれます

app/build.gradle
//...

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 を使っていきましょう。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3