Java Runtime (De)compilerの紹介

こんにちは、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() の中の WorldJapan に置き換えましょう。コードを以下のように修正します。

@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を再起動したら、元のコードに戻ります。


  1. オープンソースツールで、Red Hatからのサポートはいたしかねます。不具合などがあれば、直接にIssueを起票して頂ければ幸いです。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。