アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

Gradle Application Pluginで作成したアプリで特定モジュールのディレクトリの子ファイルを動的に取得する

以下のような構造のフォルダ構成から、graphql以下のファイルを全て取得します。これはMain-Classがあるモジュールから参照されているモジュールとします。jarファイルには既に含まれているとします。

graphql/filename1.graphqls
graphql/filename2.graphqls
graphql/filename3.graphqls
...

よくある回答

特定の1つのファイルでの例は以下です。
[kotlin]

ClassLoader.getSystemClassLoader().getResource("graphql/filename1.graphqls")!!.readText()

ファイル名を取得する例は以下です。
しかし、この例ではIntelliJの実行等ではファイル名が取得できますが、Gradle Application Pluginで作成したものから起動する場合は取得できません。

ClassLoader.getSystemClassLoader().getResourceAsStream("graphql/")!!.bufferedReader().readText()

回答

GraphqlSchemaModule の部分は取得したいモジュールのクラスなら何でも良いです。
jarファイルの場所を特定してそれを読み込みます。

val currentJarUri = GraphqlSchemaModule::class.java.protectionDomain.codeSource.location.file
val jarFIle = JarFile(currentJarUri)
return JarFile(currentJarUri)
    .entries()
    .toList()
    .filter { it.isDirectory.not() }
    .filter { it.name.startsWith("graphql/") }
    .map {
        jarFIle.getInputStream(it).bufferedReader().readText()
    }