JBossはByteman 2.0.0をリリースした。これはオープンソースのJavaバイトコード操作ツールで、GNU LGPL 2.1でライセンスされている。Bytemanはコードのテスト、トレース、モニタリングを支援するJavaエージェントであり、開発者はこれを使って、ロード時や実行中にJavaアプリケーションの動作を変更することができる。これはアプリケーションの書き直しや再コンパイルをすることなく動作し、StringやThreadといったJavaプラットフォームクラスを修正することまで可能だ。
以下にByteman 2.0.0の新機能を挙げる。
- ファイルおよびラインに関するデバッグ情報。コンパイルされたBytemanルールにファイルおよび行数の情報が含まれるようになった。これによりデバッガは実行時にルール経由でステップ実行できるようになる。
- @Listenerを使ったBMunitのTestNGインポート。TestNGクラスはBMUnitの振る舞いを@Listenerアノテーションを使ってインポートするようになった。以前のバージョンはBMNGRunnerをサブクラスする必要があったが、これだとテストクラスがすでに別のテストクラスを拡張しているときに競合が起こっていた。
- Throw Errorルール。Bytemanはたとえターゲットクラスによって宣言されていなくても、throw Errorルールを許すようになった。
- バグ修正。この最新リリースでは、1.6.0リリースで見つかった8つのバグが修正されている。
Bytemanでは、シンプルなEvent Condition Action (ECA)スクリプト言語を使って、どこで、いつ、どのように、ターゲットのJavaコードが変換されるべきかを指定する。インジェクトされたコードが実行されてもコードの実行は継続するが、インジェクトされたコードが例外をスローしたり、すぐに強制リターンしてもよい。以下に単純なBytemanスクリプトの例を挙げる。
# script.btm RULE trace main entry CLASS App METHOD main AT ENTRY IF true DO traceln("entering main") ENDRULE
このスクリプトでは、App.main()メソッドの開始時に "entering main" を出力するよう、Bytemanに指示している。アプリケーションでBytemanを有効にするためには、JavaエージェントJVM引数を追加して、スクリプトを指定する。
-javaagent:<BYTEMAN-DIR>\lib\byteman.jar=script:script.btm
bminstall.shを使って、すでに動作しているアプリケーションにBytemanを追加することも可能だ。もっと複雑なルールやコードインジェクションには、ビルトインのByteman Rule Helperを使ったり、プラグインとして自作のPOJOを作ることもできる。
Bytemanと同様、AOPもクラスのインスツルメントやコードのインジェクトができるのだが、Bytemanを使えばクラスを作成したりコードをコンパイルする必要がない。コードを書くときに予め考慮しておく必要もなく、後からインジェクトするコードを決めることができる。また、Bytemanは使いやすくて変更しやすく、特にテストやアドホックなログ用途に適している。
まずはBytemanバイナリをダウンロードして、これをJavaエージェントとしてアプリケーションに指定しよう。BytemanにはJDK 6以上が必要であることに注意しよう。詳しくは、Byteman プログラマーズガイドを読むこと。このリリースに関する詳しい情報はByteman 2.0.0のリリースノートに書かれている。公式Byteman ドキュメントやフォーラムを訪れてもよいだろう。ソースコードはGitHubから入手可能だ。