こんにちは、Red Hat Middleware Technical Account Manager のイアンです。
お客様のサポートケースの対応では、現象を再現させるために稼働しているJavaアプリケーションのコードを修正/パッチする場合があります。そのときには、Bytemanをよく使っていますが、新しいツールを紹介したいと思います。
Java Runtime (De)compiler (以降JRDとして略)は弊社社員が作って提供しているJavaのデコンパイルと修正したコードをアプリケーションへ挿入するためのツールです1。最新バージョン 7.2 は Java 11 以降に対応していますが、古いバージョン 6 は Java 8 でも使えるように見えます(未検証ですが)。
簡単な例で使い方を説明いたします。
環境準備
この例では、以下の製品とソフトウェアを使用します。
- OpenJDK 11
- JBoss Enterprise Application Platform (EAP) 7.4
- helloworld-rs quickstart
- JRD 7.2
JBoss EAP は Red Hat Customer Portal からダウンロードし、ローカルで展開します。JRDに接続できるために、$EAP_HOME/bin/standalone.conf に以下の行を追加します:
JAVA_OPTS="$JAVA_OPTS -Djdk.attach.allowAttachSelf=true"
jboss-eap-quickstarts リポジトリをローカルにクローンし、 helloworld-rs に移動し、Mavenを使ってビルドします。
$ git clone https://github.com/jboss-developer/jboss-eap-quickstarts.git $ cd jboss-eap-quickstarts/helloworld-rs $ mvn clean package
target ディレクトリに作成した helloworld-rs.war を $EAP_HOME/standalone/deployments にコピーします。
最後に、JRD 7.2 をReleases ページからダウンロードし、ローカルで展開します。
準備ができたら、$EAP_HOME/bin/standalone.sh を実行し、EAPサーバーを起動します。
現状確認
curl
を使って、現状の挙動を確認しましょう。
$ curl -w "\n" http://localhost:8080/helloworld-rs/rest/json {"result":"Hello World!"}
helloworld-rsアプリは "Hello World!" の結果を返しています。
コード修正
JRDの展開ディレクトリの中の start.sh を実行すると、JRDのGUIが表示されます。
左側には、ローカル環境で稼働しているJavaプロセス一覧になります。 EAPのプロセス(①)をクリックすると、ロードしているクラス一覧が真ん中に表示されます。helloworld-rsアプリのコードを修正したいので、フィルター(②)に org.jboss.as.quickstart.*
を入力して、Quickstart関連のクラスに絞り込みます。HelloWorld
クラス(③)を選択すると、右側にデコンパイルされたコードが表示されます。
getHelloWorldJSON()
の中の World を Japan に置き換えましょう。コードを以下のように修正します。
@GET @Path(value="/json") @Produces(value={"application/json"}) public String getHelloWorldJSON() { return "{\"result\":\"" + this.helloService.createHelloMessage("Japan") + "\"}"; }
修正したら、右上の Compile and Upload ボタン(②)をクリックします。
そうすると、以下のような画面が表示され、新しいコードがEAPへアップロードされます。
curl
を使って、挙動を確認しましょう。
$ curl -w "\n" http://localhost:8080/helloworld-rs/rest/json {"result":"Hello Japan!"}
JRDを用いて無事にコードを修正できました!
まとめ
簡単な紹介でしたが、JRDツールを使って、動いているアプリケーションのコードをオンラインで修正できます。また、GUIベースですので、試行錯誤しているときにはBytemanより手軽に修正できると考えております。
なお、修正はメモリ上に存在するだけですので、EAPを再起動したら、元のコードに戻ります。