2013/03/15

[java]Annotation Factoryのjarにはclassを入れる

Androidでボタンを追加するたびに、いつも同じようなことを書く。
ひどくめんどくさいし、覚えてないので腹立たしい。

そう思っていると「android annotationがある」という話を教えてもらった。
便利そうなものは使ってみよう!


と思ったが、なんだかわからないまま使うのも悪いので、このAnnotationのしくみを動かすサンプルぐらいやってみるか、と試すことにした。

参考にしたのは、こちら
Javaのpackage名以外は、そのままやったのだが・・・できたJarを設定してもEclipseが「unable to load annotation processor factory」みたいなことを言う。
パスがおかしいのか? package名がまずいのか? どこか書き間違えたか?
いろいろ見たのだが、わからん。
他のサイトも見たが、わからん。

2時間くらい悩んで、AndroidAnnotationsのJarを見てみることにした。
image

えー、classファイルを置くの??
みんな説明に「srcの下にMETA-INFを作って・・・」って書いてるから、JARにするときも*.javaファイルをやるものとばかり思ってたよ・・・。

classにすると、あっさりできた。


悔しいので、初心者なりに説明を(設定の)。

 

まず、Annotation Processorというやつは、Androidのプロジェクトとは一緒にできない。
新たに普通のJavaのプロジェクトを作ってやる。
Androidでは、それで作ったJARファイルだけを参照させることになる。

 

実装の仕方は、よくわからん。
他の人参照。
プロジェクトの構成は、特にこだわらないようだが、srcの下にMETA-INFを作成し、その下にservicesを作成し、その下に「javax.annotation.processing.Processor」という名前のテキストファイルを作る。
テキストファイルをエディタか何かで開いて、自作したProcessorのclass名をフルで書く。
私だと「com.blogpost.hiro99ma.anno.SampleAnnoProcessor」だった。
「extern」というフォルダは、JARの出力先として私が勝手に決めただけだ。

 

image

JARファイルを作る。
プロジェクト名で右クリックし「Export...」を選択。

「JAR file」を選択して、次へ。
image

JARにまとめたいファイルを決める。
.classpathと.projectはいらんだろう。
自分で作っていた「extern」もいらん。
下のチェックは「class files and resources」。
JARファイルの出力先や名前も適当に決める。
image

あんまり見てない。次へ。
image

ここもあんまり見てない。Finish。
image

JARファイルができた。

 

では、Annotationを追加する方。
プロジェクト名で右クリックし「Properties」を選択。

「Java Compiler > Annotation Processing」で、いろいろ有効にする。
生成場所は「gen」らしい。
image

Factory Pathに、さっきのJARを追加する。
私は「Add External JARs..」で追加したが、追加できればいいらしい。
image

 

ビルドパスも通すらしい。classがあるからか?
ないと、importするときに見つからんと言われるようだ。
同じようにLibrariesに「Add External JARs...」で追加した。
image

 

このくらいやると、使えるみたいだ。
私がAnnotationを調べ始めた理由を忘れてしまったが、まあいいや。

2 件のコメント:

  1. AndroidAnotationの導入は
    https://github.com/excilys/androidannotations/wiki/Eclipse-Project-Configuration
    を参考にやったほうがいいです!
    僕も使ってますが、こんなに難しくなく導入出来ましたYO

    返信削除
    返信
    1. しかさんもアノテーターなんですね!

      悪い癖なのかもしれませんが、何がどうなるのかある程度わからないと、怖くて使えないのです・・・。
      なので、まずは自分でAnnotationを作れるようになろう、が目標だったんだと思います(たぶん)。

      私のイメージだと、JavaのAnnotationは、C/C++の#defineと#pragmaをあわせて強力にして言語仕様に織り込んだ、というような感じで受けとっています。
      が、この記事を書いていた頃は、#defineと同じようなものだろう、と思っていました。
      なので「自分でAnnotationを作って、ボタン押しのイベントハンドラを自動生成するやつだけ作ろう」と思っていたのでした。
      そして・・・以外と難しそうだし・・・他にやることもあることに気付いて、保留、となりました。

      Annotationって便利そうなのですが、皆さん自作はあまりやらないものなのですかね?

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。