LoginSignup
8
8

More than 5 years have passed since last update.

gradleでMavenのpom.xmlのpackagingで指定されているファイル以外をdependenciesでcompileする方法

Posted at

経緯

自作AndroidライブラリをMaven Centralで公開しているのですが、海外の方から、 「Duplicate files copied in APK AndroidManifest.xml」とエラーが出てビルドできねーよ。 と問い合わせがあったので調べてみました。
そんな私はAndroidStudio初挑戦です。

対象のライブラリの内容

まず、おさらいがてら、公開しているライブラリのpom.xmlの内容から抜粋です。

pom.xml
    <parent>
        <groupId>com.tojc.ormlite.android</groupId>
        <artifactId>ormlite-content-provider-parent</artifactId>
        <version>1.0.3</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>ormlite-content-provider-library</artifactId>
    <name>Android-OrmLiteContentProvider Library</name>
    <packaging>apklib</packaging>
    <description>This is a library that easy to make using ContentProvider with OrmLite.</description>

ここで、 packagingにapklibを指定している ことに注目してください。
これとは別に、一般のjarファイルもMaven Centralに公開しています。


※このapklibとjarの複数公開のやり方については、説明しません。
気になる方は、以下のアドレスからAndroid-OrmLiteContentProviderの各pom.xmlを覗いてもらえればと思います。
※実はこのやり方、ActionBarSherlockのpom.xmlを参考にしています。

Android-OrmLiteContentProvider


mavenから使う場合

そして、apklibとjarの二つのファイルをMaven CentralにUPしているので、Mavenから使うには、こんな感じで以下のように記述すればOKでした。

<dependency>
    <groupId>com.tojc.ormlite.android</groupId>
    <artifactId>ormlite-content-provider-library</artifactId>
    <version>1.0.3</version>
    <type>jar</type> <!-- or apklib -->
</dependency>

利用者は、typeのところで、使いたい方を記述すれば、そのライブラリが落ちてきます。

gradleから使う場合

さて、これをAndroid Studioやgradleで使いたい場合、普通はこう書きます。

build.gradle
dependencies {
    compile 'com.tojc.ormlite.android:ormlite-content-provider-library:1.0.3'
}

ところが、これだと

Gradle: Execution failed for task ':TestApplication:packageDebug'.
> Duplicate files copied in APK AndroidManifest.xml
    File 1: C:\Users\Jaken\AndroidStudioProjects\TestApplicationProject\TestApplication\build\libs\TestApplication-debug.ap_
    File 2: C:\Users\Jaken\AndroidStudioProjects\TestApplicationProject\TestApplication\build\libs\TestApplication-debug.ap_

と、怒られてしまいます。
エラーのログをよく見ると、上の方に、こんなログも出ていました。

Origin 2: C:\Users\Jaken\.gradle\caches\artifacts-26\filestore\com.tojc.ormlite.android\ormlite-content-provider-library\1.0.3\apklib\5b3fb9e6ca26b4a01166740cf513cbd8f9ac6450\ormlite-content-provider-library-1.0.3.apklib

apklibを読み込んでいるようですね。
そして、apklibの中に、AndroidManifest.xmlが存在しているので、プロジェクトのAndroidManifest.xmlとダブっていることが原因のようです。

Android Studioでは普通に処理ができるjarファイルを読み込んでほしいところです。
ところが、公開されているライブラリのほうで、デフォルトのpackagingがapklibに設定してあるため、apklibを優先的に読み込んでしまっているのです。
困りました。

結論

はい、結論です。こんな時、こう書けば、読み込んでくれます。

build.gradle
dependencies {
    compile 'com.tojc.ormlite.android:ormlite-content-provider-library:1.0.3@jar'
}

後ろに「 @jar 」を付けてあげるだけで、解決しちゃいました・・・。
これ、@jar以外に、@aarなんかもこのテクニックが使えるので、覚えておいて損はないと思います。

おまけ:gradleでActionBarSherlockのaarを使う

ActionBarSherlockのaarを読み込みたい場合は、以下のリンク先のサンプルの記述になります。JakeWhartonさん、ちゃんとサンプル公開してます。さすが。
ActionBarSherlock-Gradle-Sample

ということで、gradleからmavenを使うときのテクニックとして使えると思いますので、参考にしてください。

8
8
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
8
8