リア充爆発日記

You don't even know what ria-ju really is.

ライブラリプロジェクトをmavenで設定するときの対処法

ビルドはとおるけど、実行時に

Caused by: java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable

というエラーになったことある人。

ライブラリプロジェクトをjarで設定してない?こんな感じに。

        <dependency>
            <groupId>com.google.android.gms</groupId>
            <artifactId>google-play-services</artifactId>
            <version>3</version>
            <type>jar</type>
        </dependency>

jarだとresとかは乗らないからこういうことになる。っていうか、この仕様なんとかしてよグーグルさんよ。

で、これをなんとかするにはちょっとハックっぽいんですけどコンパイル用とランタイム用で2つのdependencyを記述する。ActionBarSherlockの場合はこう。jarをprovidedにするのがポイント。

        <!-- Provides resources -->
        <dependency>
            <groupId>com.actionbarsherlock</groupId>
            <artifactId>library</artifactId>
            <version>4.2.0</version>
            <type>apklib</type>
        </dependency>
        <!-- Provides import links -->
        <dependency>
            <groupId>com.actionbarsherlock</groupId>
            <artifactId>library</artifactId>
            <version>4.2.0</version>
            <type>jar</type>
            <scope>provided</scope>
        </dependency>

ただ、前もどっかで書いたけど、こう書くとIntelliJのほうでうまくいかなくなる。ムーン。

google mapv2とかでつかうgoogle play servicesの場合は、maven-android-deployerを使ってるならこう。

        <dependency>
            <groupId>com.google.android.gms</groupId>
            <artifactId>google-play-services</artifactId>
            <version>3</version>
            <type>apklib</type>
        </dependency>
        <dependency>
            <groupId>com.google.android.gms</groupId>
            <artifactId>google-play-services</artifactId>
            <version>3</version>
            <type>jar</type>
        </dependency>

なんでこっちはjarをprovidedにしなくていいかは知らない。