読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

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

IntelliJのandroidプロジェクトを途中からmaven管理しようとした時のメモ

Java界でサードパーティのライブラリを使おうとするたびに「Maven導入しておくとベンリなのかな?」と思わされるんだけど、これまでは目先の時間の無さを理由に振り切ってきた。なんか情報少ないし。めんどくさそうだし。

が、ここらで導入してみることにした。

なぜ導入するか

を語れるほどよくわかってないけど、なんとなくわかった気にさせてくれたエントリをいくつか。
http://d.hatena.ne.jp/shuji_w6e/20090612/1244804233
http://maven.apache.org/


Mavenのインストール

OSX10.8には最初からMaven3が入っているので何もしなくてよかった。


プロジェクトにMavenサポートを導入

プラグインMaven Integration,Magen Integration Extensionを入れておく。
で、プロジェクトを右クリック > Add Framework SupportでMavenを選択する。

その後、何か選択したり記入したりするかもしれないけど、このブログはこの手順をやった翌日に書いているのでおぼえてない。適当でいいよ。

すると、ディレクトリ構造を勝手に変えられて、srcディレクトリ直下にいくつかディレクトリが作られ、srcディレクトリ直下にあったアプリのパッケージが、新しく作られたsrc/main/javaディレクトリ直下に移動される。またプロジェクトルート直下にpom.xmlが作られる。
新しく作られたディレクトリは以下のような感じ。

src
    /main
              /java
              /resources
    /test
            /java

この時点で、なんでこんなことになるのかよくわかってない。が、既存のアプリやテスト等はIntelliJがうまくやってくれているのか全部動いた。
追記)これがスタンダードプロジェクトストラクチャーらしい。なるほど。
http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html


pom.xmlの編集

作られたpomはこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>アプリ名</artifactId>
    <version>1.0-SNAPSHOT</version>

    
</project>
基本的な部分の編集

はパッケージ名(com.example的なやつ)を入れておくのが一般的だそうな。
アプリ名を入れる。↑は書き換えたけど、実際は本当のアプリ名が入ってたから、一個前の手順できっとアプリ名入れたりするところがあったのかな。

を書き換えたら"Maven projects need to be imported"とかいうポップアップが出てきたので"Import Changes"を選択しておく。これがなんなのかよくわかってない。もういっこ"Enable Auto-Import"っていうのがあったけど、よくわかってないのにAutoはないだろーと思って今のところは控えておいた。

は適当でいいんじゃないですかね。調べてもないけど。

依存関係の追加

これだよ。これがJava嫌いがJava嫌いたる所以のところだよ。エデンがどうたら、っていう人は上級者で、僕みたいなチンカスプログラマはビルドパスとか依存関係とか聞くだけでムカってくるからね。っていうか、イチから依存関係記述していかなきゃいけないとか罰ゲームすぎるだろ。とりあえず素数を数えよう。

で、落ち着いたところでとりあえず適当に1つ選んで追加してみる。ググるとJUnitの例が多いのでなんとなくormliteでやってみる。
設定が成功したときにわかりやすくするために現状のビルドバスの設定を外してコンパイルエラーを起こしておく。libsの下に置いておいたJarもとりあえず消しとけ。

で、以下の記述をpomに追加

    <dependencies>
        <dependency>
            <groupId>com.j256.ormlite</groupId>
            <artifactId>ormlite-android</artifactId>
            <version>4.42</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

で、保存すると"Maven projects need to be imported"が出てくるので"Import Changes"。すると・・・コンパイルが通った・・・!アプリも動いた!
ビルドパスとかどこで設定されてんの?っていうかJarファイルとかどこにあんの?と思って探してみるとJarファイルは/Users/{ユーザー名}/.m2/repository(OSXの場合)にダウンロードされてた。

どこからダウンロードされてくるんだよ?と思って調べてみると、セントラルリポジトリと呼ばれるJava界のhttp://rubygems.org/的なものがあって、そこに登録してあるライブラリはたったこれだけのpomへの記載で済むという按配らしい。で、ないやつは自分でリポジトリ用意してそこにJar置いてpomでそれを指定するとか、JarをDLしておいてpomでそれを指定するとかいう手順が必要になる、と。なるほどなるほど。
追記)Jar直指定の手順などなく、Jarを手動でローカルリポジトリに突っ込んでそれをpomで指定するという手順になる。手順はこの記事の最後に記載。

ビルドパスの問題とかどうなってんだ・・・。ormliteだけMavenで管理されててあとはIntelliJ管理になってると思うんだけど、この辺はMaven Integrationプラグインがよろしくやってくれてるってことなのか。すげーな。

あ、だからCI導入するときとか、メンバーが増えた時とか楽なのか。わかっていたようでわかっていなかった。。

ここで"Maven projects need to be imported"の意味がなんとなくわかってきたので次に出てきた時に"Enable Auto-Import"しておいた。
libsのJar、全部なくしてみようっと。gitも重くならなくていいね。時間があったら、git上に存在するすべてのJarを生まれる前から消し去ってみようかな。



とりあえず、ここまで。


追記)手動でローカルリポジトリにJarを突っ込む方法。

mvn install:install-file -Dfile=<path-to-file>
                         -DgroupId=<group-id>
                         -DartifactId=<artifact-id>
                         -Dversion=<version>
                         -Dpackaging=<packaging>

実際は改行なしの一行で。指定する値はそれぞれ以下。

  • file
    • Jarファイルへのパス
  • groupId
    • 適当。ここで指定したgroupIdをpomで指定する
  • artifactId
    • 適当。ここで指定したartifactIdをpomで指定する
  • version
    • 適当。ここで指定したversionをpomで指定する
  • packaging
    • パッケージの種類。今回は"jar"

gcmがセントラルリポジトリ等になかったので、この方法で突っ込んだ。その時のコマンドは以下。

mvn install:install-file -Dfile=/path/to/gcm.jar -DgroupId=com.google.android.gcm -DartifactId=gcm-client -Dversion=1 -Dpackaging=jar

で、これに応じたpomは以下。

        <dependency>
            <groupId>com.google.android.gcm</groupId>
            <artifactId>gcm-client</artifactId>
            <version>1</version>
        </dependency>

追記)gcmなど、たいていのAndroid絡みのライブラリを導入する常套手段が別にあった->セントラルリポジトリにないAndroidライブラリはMaven Android SDK Deployerでインストール

ニンニン。