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

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

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

```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](https://github.com/jakenjarvis/Android-OrmLiteContentProvider "Android-OrmLiteContentProvider")

-----

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

```xml
<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で使いたい場合、普通はこう書きます。

```groovy: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を優先的に読み込んでしまっているのです。
困りました。

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

```groovy: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](https://github.com/JakeWharton/ActionBarSherlock-Gradle-Sample/blob/master/build.gradle "ActionBarSherlock-Gradle-Sample")

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