0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android StudioでJava Libraryなモジュールからリソースを含んだ実行可能なJarを生成するまで

Last updated at Posted at 2016-11-20

#状況

  • 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) }
}

#めでたし

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?