torutkのブログ

ソフトウェア・エンジニアのブログ

NetBeansのモジュールファイルをハック

NetBeansのSQEプラグインに含まれるCheckstyleのバージョンが古い(5.0-beta1)ので、新しいバージョン(5.3)にどうやって置き換えられるかを追い求めてみました。

  • (2011/06/20に更新されたSQEではCheckstyle 5.3対応したようです)
  1. SQEプラグインのソースを入手して修正する
  2. プラグインインストール後のファイルをいじる
  3. SQEプラグインのバイナリに手をいれる

SQEプラグインのソースを入手して修正する(王道編)

より、"Get Source Code"をクリックすると、小さなポップアップ(吹き出し)に、MercurialSubversionのURLが記載されています。Subversionは、ドキュメントしか見えないので、まずMercurialをインストールし、以下コマンドで取得しました。

C:\work\sqe> hg clone --insecure https://hg.kenai.com/hg/sqe~trunk
  :

NetBeansでプロジェクトを開きにいくと、モジュールスイートが2つと多数のモジュールが存在します。以下2つのモジュールスイートをまずNetBeansに読み込みました。

  • Software Quality Environment
  • SQE Third-Party Libraries

構築(ビルド)をするとエラーとなりました。

C:\work\sqe\sqe~trunk\nbproject\build-impl.xml:55: Cannot find
 C:\work\sqe\sqe~trunk\nbproject\${nbplatform.nb67.harness.dir}\suite.xml
 imported from C:\work\sqe\sqe~trunk\nbproject\build-impl.xml

このnbplatform.nb67.harness.dir が何ものか、suite.xmlとはなにか(リポジトリには見当たらない)が解決できず、ここで王道は潰えました。

プラグインインストール後のファイルをいじる(邪道編)

SQEプラグインはインストールすると、

  • C:\Users\<ユーザー名>\.netbeans\7.0\modules

の下にorg-nbheaven-sqe-xxxx.jar のように展開されていました。
また、SQEが内蔵するcheckstyleなどのjarファイルは、

  • C:\Users\<ユーザー名>\.netbeans\7.0\modules\ext

の下にありました。
ここを置き換えれば、Checkstyleの差し替えができそうです。実際に試してみたところ、依存関係を含めて以下の3つのファイルを差し替えてOKとなりました。

Checkstyle-5.3の中にあるJARファイルを、以下の名前に変更して差し替えです。

SQEプラグインのバイナリに手をいれる(覇道編)

多数の人にインストールしてもらう場合、インストール後のファイル差し替えはちょっと手間&ミスの原因となるので、できればプラグインモジュールファイル(.nbm)をいじって配布したいところです。
ソースからのビルドは挫折したので、このnbmファイルを力技でいじることができるか調べてみました。力でねじ伏せるので覇道編、ということで・・・。

まず、nbmがjarコマンドで展開できるか調べてみると、ずばりjar形式でした。これで、nbmファイルに含まれるファイルの差し替えの道筋が見えました。

次に、checkstyleのJARファイルを抱えているnbmを見当してみます。見ると、org-nbheaven-sqe-wrapper-checkstyle.nbmが怪しげです。jarで調べてみると

C:\work\sqe\download> jar tf org-nbheaven-sqe-wrapper-checkstyle.nbm
META-INF/
META-INF/MANIFEST.MF
netbeans/
netbeans/config/
netbeans/config/Modules/
netbeans/config/Modules/org-nbheaven-sqe-wrapper-checkstyle.xml
netbeans/modules/
netbeans/modules/ext/
netbeans/modules/ext/checkstyle.jar
netbeans/modules/org-nbheaven-sqe-wrapper-checkstyle.jar
Info/
Info/info.xml

C:\work\sqe\download> 

と、checkstyle.jarが含まれているのが分かります。これを差し替えればよさそうです。

C:\work\sqe> mkdir retrofit
C:\work\sqe> cd retrofit
C:\work\sqe\retrofit> copy ..\org-nbheaven-sqe-wrapper-checkstyle.nbm .
C:\work\sqe\retrofit> mkdir netbeans\modules\ext
C:\work\sqe\retrofit> copy C:\work\checkstyle-5.3\checkstyle-5.3.jar netbeans\modules\ext\checkstyle.jar
C:\work\sqe\retrofit> jar uf org-nbheaven-sqe-wrapper-checkstyle.nbm netbeans\modules\ext\checkstyle.jar
C:\work\sqe\retrofit> 

これでいけるかと、NetBeansを起動し、[ツール]>[プラグイン]を選び、[ダウンロード済み]タブを選択、[プラグインの追加]で差し替えたorg-nbheaven-sqe-wrapper-checkstyle.nbmを指定すると、「プラグイン"wrapper.checkstyle"はすでにインストールされています。」と表示され、インストールができません。

通常プラグインは、新しいバージョンに更新できるようになっているので、バージョンが新しいことを認識させればいいだろうと思い、.nbmに含まれる情報にバージョン情報がないか探してみました。

まず、一番ありそうな、META-INF\MANIFEST.MF を開いてみましたが、JARコマンドのデフォルト生成以上の情報はありません。

次に、Info/info.xmlをJARから抽出して中を開いてみました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//NetBeans//DTD Autoupdate Module Info 2.5//EN"
    "http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd">
  <module codenamebase="org.nbheaven.sqe.wrapper.commons.beanutils.core"
      distribution="" downloadsize="0" homepage="" license="B2B74E56"
      moduleauthor="Sven Reimers, Florian Vogler" needsrestart="false"
      releasedate="2011/06/05" targetcluster="sqe1">
    <manifest AutoUpdate-Show-In-Client="false"
        OpenIDE-Module="org.nbheaven.sqe.wrapper.commons.beanutils.core"
        OpenIDE-Module-Display-Category="Quality"
        OpenIDE-Module-Implementation-Version="hudson-sqe-40"
        OpenIDE-Module-Java-Dependencies="Java &gt; 1.5"
        OpenIDE-Module-Long-Description="TODO"
        OpenIDE-Module-Module-Dependencies="org.netbeans.libs.commons_logging/1 &gt; 1.3.1"
        OpenIDE-Module-Name="wrapper.commons.beanutils.core"
        OpenIDE-Module-Requires="org.openide.modules.ModuleFormat1"
        OpenIDE-Module-Short-Description="TODO"
        OpenIDE-Module-Specification-Version="1.0"/>
      <license name="B2B74E56">
                                 Apache License
          :(以下略)

ここを見ると、module要素のreleasedate属性、manifest要素のOpenIDE-Module-Implementation-Version、同要素のOpenIDE-Module-Specification-Version属性のどれかを変えればいけそうに思えます。

そこで、かたっぱしから試してみると、OpenIDE-Module-Specification-Versionを変えた時に、NetBeansプラグインインストールが新しいバージョンと認識してインストールに進むことができました。

OpenIDE-Module-Specification-Version="1.8"

なお、.nbmとして変更するのは、上記を含めて以下の三つです。

  • org-nbheaven-sqe-wrapper-checkstyle.nbm
  • org-nbheaven-sqe-wrapper-commons-beanutils-core.nbm
  • org-nbheaven-sqe-wrapper-google-collections.nbm

ということで、.nbmファイルのハックはjarコマンドで何とかなるというところでした。

Checkstyle 5.0 beta1 から 5.3へ差し替えによる影響

charsetプロパティはTreeWalkerからCheckerへ移動

ソースファイルの文字エンコーディングがプラットフォームデフォルトでないとき(例:Windows OS上でソースファイルをUTF-8としているとき)、Checkstyle 5.0 beta1では、TreeWalkerのプロパティcharsetを指定していました。

<module name="Checker">
    :
  <module name="TreeWalker">
    <property name="charset" value="UTF-8"/>
      :
  </module>
</module>

ところが、5.3では(多分5.0正式版以降は)、charsetはTreeWalkerではなく、Checkerのプロパティとして指定するようになり、以下のように変更する必要があります。

<module name="Checker">
  <property name="charest" value="UTF-8"/>

  <module name="TreeWalker">
      :
  </module>
</module>

その他変更もあるので、ルール定義はCheckstyle-5.3に同梱のcheckstyle_checks.xmlを雛形に作成し直すとよいでしょう。