#javaJavaSpoonは、プログラミング可能な静的コード解析&ソースコード変換ライブラリーです。Javaここ数か月は、Javaの標準機能について書いたエントリーが続きました。今回は、ちょっとマニアックなライブラリーについて書いてみます。Wikipedia)で開発されている、静的コード解析&ソースコード変換ライブラリーです。(software)参照)があり、それと区別するためです*1。以降は、単にSpoonと表記します。Spoonは、独自の階層モデルを使ってコードを構文解析し、その結果をツリーで表現します。解析を行うには、ツリーに対して探索を行うJavaプログラムを書いて実行します。ソースコード変換も同様に、ツリーに対して挿入・更新・削除を行うJavaプログラムを書いて実行し、結果をソースコードとして出力することができます。これを使うと、プロジェクトでの違反コードが見つかった場合にビルドを失敗させる、ということが可能になります。既存の静的解析ツールでは、カスタムチェックルールを追加するのにバイトコードレベルの知識が必要になったりします。Spoonでは、バイトコードを意識しなくても良いので、比較的簡単にチェックコードを書くことができます。リリースされているバイナリーは、target=java1.6でコンパイルされているようです。そのため、実行にはJava6以上のJREが必要ですが、解析ターゲットは古いバージョンでも問題ないと思います。ランタイムはJava6ということなので、それ以外はJava8も使えます。SpoonのテストコードはJava8を使っていますし、もちろん、解析コードはJava8で書いてもOKです。ロードマップ(下記リンク参照)によると、今のところサポートするJavaのバージョンはJava6までのようです。今後はJava7,Java8のサポートも目指しているみたいです。INRIA/spoonSpoonは、CeCILL-Cという馴染みのないライセンスを使っています。フランスの法律を考慮したフランス版GNUのようなライセンスのようです。今回は、最新リリースバージョン4.1.0を使います。Jarファイルを直接ダウンロードするには、下記リンク先のページからダウンロードしてください。スタンドアローンで使うのならspoon-core-4.1.0-jar-with-dependencies.jarをダウンロードすると良いです。SpoonMavenで使うには、下記のdependencyを追加します。</dependency>使い方GUIモードで実行してみます。}}コマンドラインで実行する例です。/path/toはJarファイルのインストール先です。オプションにより、GUIモードで起動します。Mavenで実行する方法は、FAQページに記載されています。(spoon.gforge.inria.fr)IDEから実行する方が簡単かもしれません。私は最終的にEclipseで実行しています。図1:SpoonのGUIモードでSampleApp.javaを解析したところツリーは手動で展開しています。GUIの機能はそれほど充実していません。API))を実装します。実行時には、Visitorパターンにより、各Processorに各要素が渡されてきます。先ほどのサンプルコードから、null代入とSystem.out検出してみましょう。}}それぞれ、ErrorとWarningとして検出させて、見つかった場合はその情報を標準出力に出力させています。検出されたかどうかを判定するには、Launcher#getEnvironmentを使います。Processorの指定は、"-p"オプションを使用します。2つのProcessorを指定するには、セミコロンで区切ります。local.SampleApp.main(SampleApp.java:8)ソースコード変換(使い方だけ)バイトコードを操作するのではなく、ツリーモデルに変換してからコードを挿入し、ツリーをソースコードに変換する方式のようです。基本的な使い方は解析の場合と同じく、Processorを実装します。解析はRead-onlyだったのに対して、ソースコード変換は要素への追加・変更・削除の操作を行います。変換結果は、spooned/という名前のディレクトリーに出力されます。解析だけの場合でも出力されます。Transformation"をご覧ください。(spoon.gforge.inria.fr)ざっとSpoonについてみてきました。今後、新しいJavaバージョンへの追従がどこまで進むかに期待したいところです。全体を把握できていないので、比較的簡単そうなGUI部分を改造したPullReqでも送ってみようかなー、などと思っています。(software)が指すのはこちらのSpoonではないという考え。(2)プロフィールid:argiusはてなブログをはじめよう!argiusさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。