#状況
- Andtoid StudioでJavaアプリを実行したかったので、Java Libraryのモジュールを作った。
- Java Libraryはリソースが必要である。
- getResource()するとnullになる場合がある。
#Run Configurations
(そもそもこれが思っていたのと間違っていたのですごいハマった)
結論から言うと、JavaアプリなのでNew ConfigurationでApplicationを選ぶと思っているとダメ。
apply plugin: 'application'
を追加してrunタスクを実行すると良い。
##ハマりポイント
ConfigurationのApplicationでMakeから実行していると、getClass().getResource()
かなんかでURLを取ろうとするとnullになる場合がある。
nullになる条件は.imlのorderEntryに自モジュールの.jarが追加されていない場合。
build.gradle
を変更した時の Sync Now をすると.imlに.jarが追加される。
ただし、事前にgradle build
などでjarを生成済みである場合に限る。
(*正直よくわからん)
.jarからリソースのURLが取れている場合には、URL=jar:file:hogehoge
となる。
gralde run
で実行した場合にはURL=file:hogehoge
となる。
なお、IntelliJではgradle run
ではなく、ConfigurationのApplicationから実行してもURL=file:hogehoge
で取得できるので、Android Studioとは挙動が違う。
(多分Android StudioではJava Libraryということなので、ApplocationのMakeの挙動が違うのだと思う)
###run
new Configuration
でGradleを選んでTasksにrunを指定するが、そのプロジェクトに複数のapply plugin: 'application'
のモジュールがある場合にはrunを実行すると何故か別モジュールも一緒に起動する。
なので、Tasksには:モジュール名:run
としておく。
##実行可能Jar
適当にググったら出る
task executableJar(type: Jar, dependsOn: jar) {
manifest {
attributes 'Main-Class': mainClassName
}
from "$buildDir/classes/main"
from "$buildDir/resources/main"
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
#めでたし