Javaでも#identを実現する方法

  • 投稿日:
  • カテゴリ:

CVSやSubversionでは$Id$と記述しておくと、
"$Id: AppDao.java 258 2007-12-17 08:45:36Z tamtam $"
のように変換してくれます。

ソースレベルで見ると誰が最後に弄ったのかとソースのバージョンが分かるので便利なのですが、コンパイルしてバイナリファイルになるとこの情報は失われてしまいます。
例えば、test1.c と test2.c というソースから test.so というファイルを作るとしましょう。
test.soがポツーンと置いてある場合、「このsoはどのバージョンのソースで作られたものだろう・・・?」というときに、gccでは#identマクロを使うことで解決できます。

各ソースに↓を記述します。
#ident "$Id$"
そして↓を実行。
ident test.so

test.so:
     $Id: test1.c 124 2007-10-24 04:43:13Z tamtam $
     $Id: test2.c 124 2007-10-24 04:43:13Z tamtam $

このように、どのソースから作られたバイナリかを特定することができます。
普通はsoのファイル名にバージョン番号も入れるのが普通なのですがね・・。

これをJavaで実現する方法です。
ちなみに、Subversionやtracを使ってきちんとプロジェクト管理をしていれば全く問題ないと思います。
JARファイルのファイル名とマニフェストファイルにバージョン番号入れるだろうし。

というわけで、あくまでも方法論です。

まずJDK5以上であることが前提です。アノテーション使うので。

・IdentAnnotation.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface IdentAnnotation {
    String value();
}

使い方は↓

@IdentAnnotation("$Id$")
public class Hoge {}

確認方法

ident Hoge.class
Hoge.class:
     $Id: Hoge.java 124 2007-10-24 04:43:13Z tamtam $

JARファイルも圧縮をしなければ普通に見れます。

新しいサイトもよろしくお願いします!