警告とヒント

さて。Eclipseでいうところのコンパイラが出すエラー/警告に関するところはNetBeansでは「ヒント」というのは昨日の日記でまとめた通りですが、今日は実際にそれぞれ設定できる内容を比較してみたいと思います。

まずは、Eclipseのエラー/警告からです。そもそもの大前提として、Eclipseの場合はチェック項目に対し、違反している場合にそれを無視するか警告するかエラーにするかを設定できます。で、実際に設定できる内容は以下の通りです。

  • コード・スタイル
    • staticメンバーへの非staticアクセス
    • staticメンバーへの間接アクセス
    • インスタンス・フィールドへの限定されていないアクセス
    • 何の記述も無い空のブロック
    • エンクロージング型のアクセス不可メンバーへのアクセス
    • コンストラクター名を持つメソッド
    • パラメータへの代入
    • 外部化されていないストリング
  • 潜在的なプログラミングの問題
    • serialVersionUIDなしのシリアライズ可能クラス
    • 効果の無い代入(例えば、x = x)
    • 予期しない論理代入の可能性(例えば、'if (a = b)')
    • finallyが正常に完了しない
    • 空のステートメント
    • ストリング連結での文字配列の使用
    • 隠れたcatchブロック
    • 可変引数の型の一部が不正確
    • ボクシングおよびアンボクシング変換
    • switchでカバーされない列挙型定数
    • switch文のcaseのフォールスルー
    • Nullポインター・アクセス
    • 潜在的なNullポインター・アクセス
  • 名前のシャドーイングおよび競合
    • フィールド宣言が他のフィールドまたは変数を隠蔽
    • ローカル変数宣言が他のフィールドまたは変数を隠蔽
    • 型パラメータが別の型を隠蔽
    • メソッドがパッケージ可視メソッドを非オーバーライド
    • インターフェース・メソッドがprotectedの'Object'メソッドと競合
  • 使用すべきでは無い制限されたAPI
    • 使用すべきではないAPI
      • 使用すべきではないコード内での使用すべきではないAPIの使用を知らせる
      • 使用すべきではないメソッドのオーバーライドまたは実装を知らせる
    • 禁止された参照(アクセス・ルール)
    • 阻止された参照(アクセス・ルール)
  • 不要なコード
    • ローカル変数が読み取られない
    • パラメータが読み取られない
      • オーバーライドしたメソッドの実装を無視
      • @paramタグのパラメータ記述を無視
    • 未使用のインポート
    • 未使用のローカルまたはprivateメンバー
    • 冗長なnull検査
    • 不要なelseステートメント
    • 不要なキャストまたはinstanceof操作
    • 不要な例外スロー宣言
      • オーバーライドしたメソッドの実装を無視
      • @throwsまたは@exceptionタグの例外ドキュメントを無視
      • ExceptionおよびThrowableを無視
    • 未使用のbreakまたはcontinueラベル
    • 冗長なスーパー・インターフェース
  • 総称型
    • 未検査の総称型操作
    • raw型の使用
    • finalな型で制約された総称型パラメータ
  • 注釈
    • @Override注釈の欠落
    • @Deprecated注釈の欠落
    • 注釈をスーパー・インターフェースとして使用
    • @SuppressWarningsで処理されないトーク
    • 未使用の@SuppressWarningsトーク
      • @SuppressWarnings注釈の使用可能化


日本語の文章で書かれてもいまいち意味が分かりづらいものもありますが、まぁそれはさておき、一方のNetBeansのヒントの方も、基本的にはチェック項目に対し、違反している場合にそれを無視するか警告するかエラーにするかを設定できます。警告には、単なる「警告」と「現在の行の警告」の二種類があるようですが、いまいち意味が分かりません。で、実際に設定できる内容は以下の通りです。

  • インポート
    • 未使用のインポート
    • 禁止パッケージからのインポート
    • 同じパッケージからのインポート
    • スターインポート
    • java.langパッケージからのインポート
  • Javadoc
  • Javacの標準的な警告
    • オーバーライド
    • 不要なキャスト
    • 直列化
    • フォールスルー
    • 未検査
    • ゼロで除算
    • ifのあとの文が空
    • finally
    • 非推奨
  • エラー修正
  • API
    • 可視コンストラクタ付きのユーティリティクラス
    • SerialVersionUid
    • コンストラクタ無しのユーティリティクラス
    • 公開APIを使用して非公開な型をエクスポート
  • NetBeans開発
    • 取り消し可能なタスクに対し、cancel()が空
    • instanceOf演算子の使い方が不正
  • JDK1.5以降
    • @Override注釈を追加
    • スーパーインターフェースとして注釈を使用しない
  • 空の文
    • forの後の文が空
    • whileの後の文が空
    • if/elseの後の文が空
    • 空の文
    • doの後の文が空
  • 一般
    • 足りないhashCodeまたはequalsを生成
    • == または != を使用して文字列を比較
    • 二重検査されたロック
    • 自信に割り当て
    • 参照から静的フィールドにアクセス
    • フィールドが別のフィールドを隠蔽
    • 新しい変数に戻り値を割り当て
    • 間違ったパッケージ
    • 局所変数がフィールドを隠蔽
  • 中括弧
    • If-Else文には中括弧が必要
    • Do-While文には中括弧が必要
    • Whileループには中括弧が必要
    • Forループには中括弧が必要


どれがどれに対応するのか微妙に分かりづらいのでなんとも言えませんが、とりあえずぱっと見で目につくのは、「総称型(ジェネリックス)」「注釈(アノテーション)」「ボクシング・アンボクシング」等の、Java5からの機能に関する設定項目はかなりEclipseの方が多そうに見えます。その他は・・・うーん・・・単体で見れば微妙にEclipseの方が充実していそうな気がしないでもありませんが、checkstylefindbugsと組み合わせれば補えそうなので、特にNetBeansでも不自由しなさそうな気もします。

それにしても、世間一般的には「新機能への対応はNetBeansの方が早い」ようなことが言われているような気がするのですが、ことJava5周りに関しては微妙に対応が鈍い(ジェネリックス周りのコード補完が効くようになったのも最近だったような)気がするのは何故でしょう。

というか、その辺は微妙に従来NetBeansEclipseに比べて弱いと言われてきたコーディングアシスト機能的なところなので、仕方ないと言えば仕方ないか

・・・

いやいや、仕方なくは無いか

フォーマッタとかテンプレートとかも比較してみたかったのですが、疲れてきたのでまた次回以降にします。

EclipseでやっていたことをNetBeansでやるにはその2

そんな訳で、昨日の続きです。

どうでもいいですけど、このためにGanymedeをダウンロードしてPleiadesで日本語化してみました。3.3のときからそうでしたけど、うちの4年くらい前のPowerBook G4でPleiadesを使うともっすごい遅いです。

それはさておき。

やりたいこと Eclipseでやるには NetBeansでやるには
コードテンプレート メニューバーからEclipse→Preferencesで設定画面を開き*1Java→コード・スタイル→コード・テンプレートで設定 メニューバーからツール→テンプレートで設定可能だけど、Eclipseみたいにメソッドやらコメントやらをこと細かく設定するのはムリポかも
ソースのフォーマット 上記と同様に設定画面を開き、Java→コード・スタイル→フォーマッターで設定、メニューバー→ソース→フォーマット(Ctrl+Shif+F*2 )で実行 メニューバーからNetBeans→環境設定*3でオプション設定画面を開き、Javaコード→整形で設定。ただし、1行の文字数等の一部の設定はオプション設定画面のエディタ→インデント設定で設定。ソース→整形でフォーマット実行
コンパイラの準拠レベル(バイナリ、ソース) 上記と同様に設定画面を開き、Javaコンパイラで全体設定可能。メニューバーからプロジェクト→プロパティ→コンパイラで、プロジェクト固有の設定可能 プロジェクトを右クリックしてコンテキストメニューを表示し、プロパティ→ソースでプロジェクト固有の設定は可能。でも、Eclipseみたいにソースは1.4互換、バイナリは5.0互換とかは無理っぽい
JavaDocに関する設定 上記と同様に設定画面を開き、JavaコンパイラJavaDocで全体設定可能。メニューバーからプロジェクト→プロパティ→コンパイラJavaDocで、プロジェクト固有の設定可能 一応、オプション設定画面のJavaコード→ヒントにいくつか設定項目があるけど、「publicスコープ以上はJavaDoc必須」とかそういう設定は無さそう?
警告・エラーに関する設定 上記と同様に設定画面を開き、Javaコンパイラ→エラー/警告で全体設定可能。メニューバーからプロジェクト→プロパティ→コンパイラ→エラー/警告で、プロジェクト固有の設定可能 上述の、オプション設定画面のJavaコード→ヒントで設定可能。ただし、Eclipseみたいに各プロジェクトごとに固有の設定はムリぽ?

やっぱり、こういった細かいアシスト機能はこうやってちょっと並べてみただけでもムンムンとEclipseの方が気が利いてそうな気配が。まぁ、足りない部分はcheckstylefindbugsでなんとか補えそうな気はしますが。

次回はもう少し掘り下げて、実際にEclipseの警告/エラー機能とNetBeansのヒント機能で実際に設定できる項目とか、EclipseのフォーマッタとNetBeansの整形で実際に設定できる項目とかを比較してみたいと思います。

*1: WindowsLinuxだと多分、ウィンドウ→設定だと思われる

*2: Macだと多分リンゴマーク+Sift+F

*3: WindowsLinuxだと多分ツール → オプション

EclipseでやっていたことをNetBeansでやるには

だいぶ前の


この日の日記で「まとめ表を作ってみよう」なんて言って放置していましたが、ようやく思い至ったのでぱっと思いついた分をまとめてみようと思います。

プラグイン 対応するNetBeansの機能・プラグイン
WTP NetBeansではWeb開発機能はデフォルトバンドル。デフォルトはGlassfishだがTomcat6も問題なく使える
言語パック NetBeansEclipseと違って基本日本語版も英語版からそんなに間隔あけずにリリースされている模様*1
checkstyle プラグインとしてCheckstyle Beans、SQEと二種類あるが、Checkstyle Beans + antが現状は良さげ
findbugs プラグインとして一応SQEがあるけど、現状はantが良さげ
Subversive SubversionプラグインはNetBeans6.0からデフォルトバンドル
プロパティエディタ 基本、NetBeansはデフォルトでnative2ascii要らずでプロパティファイルを編集できる・・・ような、気がするのですが情報求む
djUnit Virtual Mock部分はjMockitで、カバレッジ部分はCobertura+ant or maven
  • 個人的にはあまり使ってなかったけどなんとなく押さえておきたいプラグイン
機能 Eclipseプラグイン NetBeansプラグイン
BTSとの連携、タスク管理 Mylyn 該当無し?
プロファイラ TPTPとか? 何やらデフォルトでついてはいる模様
メトリクス Eclipse Metrics Pluginとか? これもSQEに何やらついてはいる模様ですが・・・
  • Eclipseで常日頃よく行っていた操作
やりたいこと Eclipseでの操作 NetBeansでの操作
設定のインポート/エクスポート ファイルメニュー等々から実行可能 無さげ?
maven2プロジェクトの作成 mvnコマンドで作成してファイルメニューからインポート maven2プラグインを利用してIDE上で作成
maven2関連のコマンドの実行 antを通してmvnコマンドを実行 基本はmaven2プラグインで実行/mavenのant:antプラグインbuild.xmlを生成してant経由でコマンドを実行する局面もありそう
シリアルバージョンUIDの生成 デフォルトでIDE上から生成可能 プラグインをインストールすればIDE上で生成可能
型を開く Ctrl+Shift+T Ctrl+O
階層で型を開く Ctrl+Shift+H ALT + Shift + F12
リソースを開く Ctrl+Shift+R SHIFT + ALT + O
クイック型階層 Ctrl+T 無いかも?

以下も一気にまとめようと思ったのですが、なんとなく疲れたので明日にしようと思います。

地味に、設定のインポート/エクスポートが無さそうなのは大規模ではちょいとめんどくさそうなのですが、私が見落としているだけでしょうか。

*1: 余談ですが、結局Eclipse3.3の言語パックが出なかったのにはがっかりです。

今改めて考えてみるSpringとStrutsを連携させる方法

既に書籍とかJSUGメーリングリストとかブログ各所とかいろんな所で書かれているのであえてここで殊更に詳しくは書きませんが、大別してSpringとStrutsを連携させるには以下の三つの方法があると思います。

  1. ActionSupport系の機能を使う
  2. DelegatingActionProxy系の機能を使う
  3. DelegatingRequestProcessor系の機能を使う

1.の手法では、Springが提供するActionSupport系のクラスを継承してStrutsのActionを作成します。DispatchActionSupportとかMappingDispatchActionSupportとか、Strutsの各種Actionに対応する形でいくつかのActionSupportがあります。お手軽で、Actionの設定はstruts-config内で完結するので、3つの手法のうちで設定量が一番少なくてすむ反面、三つの手法のうち唯一、依存するクラス(サービス等)を注入されるのでは無く、依存するクラスを自ら取りに行くところが、やや微妙です。即ち、ありていに言えば、三つの手法で唯一

実はDIパターンになっていない

ところがミソです。Actionの管理がstruts-config内で完結している(SpringのBean定義ファイル上で管理されていない)ので、当然SpringのAOP対象外であるところも見逃せない微妙なところです。


2.の手法では、各機能ごとに実装者が作成する真の(?)ActionはSpringのBean定義ファイル上に定義し、struts-config上にはSpringが提供するDelegatingActionProxyを定義します。即ち、HTTPリクエストは一旦DelegatingActionProxyで受けて、その後DelegatingActionProxyからSpring管理の真のActionに処理が委譲される感じです。

設定イメージはこんな感じです。

 <action path="/sample" type="org.springframework.web.struts.DelegatingActionProxy" name="sampleForm">
     <forward name="success" path="sample.jsp" />
     (略)
 </action> 

(struts-config)

 <bean name="/sample" class="jp.co.(略).web.action.SampleAction">
     <property name="sampleService" ref="sampleService" />
     (略)
 </bean> 

(Bean定義ファイル)

1.の手法と違い、真のAction(例中のSampleAction)自体は「DIパターン」になっていて、ActionもSpring管理なのでAOPを適用できたり、Bean定義ファイルのいろんな設定機能(プロパティのインジェクションとか定数のインジェクションとか)を使えたり、色々機能豊富な反面、1つのActionにつき二個も設定があるのは結構面倒です。


3.の手法では、真のActionをSpring上で管理するところは2.と同じですが、struts-config上にはActionを用意せずに、RequestProcessorから直接Spring上のActionを呼び出すところが2.と違います。

ただし

struts-configにタグの設定をしなくて済むようになる訳ではありません。以下の設定イメージに示すように、

 <action path="/sample" name="sampleForm">
     <forward name="success" path="sample.jsp" />
     (略)
 </action> 

(struts-config)

 <bean name="/sample" class="jp.co.(略).web.action.SampleAction">
     <property name="sampleService" ref="sampleService" />
     (略)
 </bean> 

(Bean定義ファイル)

タグのtype属性を省略できるようになるだけであり、タグ等のStruts的な設定はやっぱりstruts-config上で設定しなければならないのは2.の手法と同様で、正味のところ設定量は2.も3.もそんなに変わりません。加えて、3.の手法の痛いところは、2.の手法や1.の手法と違って、Struts 1.3のComposableRequestProcessorの機能を使えないところです。ComposableRequestProcessorは、従来のStrutsと違って、RequestProcessorの挙動をカスタマイズしたくなったときはちょろっとAction Commandを足したり引いたり差し替えたりするだけで済むので従来と比べて個人的には随分楽になって重宝しているのですが、DelegatingRequestProcessorだとその恩恵が受けられません。

Spring2.0からは、似たようなRequestProcessor系のStruts-Spring連携機能としてAutowiringRequestProcessorが追加されたようですが、ComposableRequestProcessorの機能がつかえないのは相変わらずのようです。

Spring2.5で新しく何か追加されていないかとそれらしきクラスを探してみたのですが、私のみたところ、それらしきクラスはどうも無いようです。


即ち

結論から言うと、三つの手法はそれぞれ三者三様であり、それぞれいいところも悪いところもあって、どれが一番良いと言えないというか、好みの問題的な違いと言うか、まとめると多分こんな感じです。

手法 メリット デメリット
1 割とお手軽。設定量が少ない。 厳密に言うとDIではない。AOPとかも使えず、Springの機能は一番活かしづらい。
2 1.と違ってAOP等のSpringの機能も活かせ、3と違ってStruts1.3の機能も使える 設定量は一番多い。
3 1.と違ってAOP等のSpringの機能も活かせ、2よりも若干設定量は少ない。 Struts1.3の機能は使えない。


とても長い前フリでしたが、ようするに、私はこういう手法が欲しいと思う訳です。

  1. 設定量は手法1と同程度
  2. ActionはSpringのBean定義の管理下に置き、AOP等のSpring的な機能を活用できる
  3. Struts1.3の機能であるComposableRequestProcessorを活用できる

上記のうち2番目と3番目は、実のところ、Strutsの「org.apache.struts.chain.commands.servlet.CreateAction」を継承して、「DelegatingRequestProcessor」や「AutowiringRequestProcessor」と同様のAction生成ロジックを行うようにgetAction()メソッドをオーバーライドすれば、とりあえず手法3と同様の記述量で、かつStruts1.3の機能を利用できるようにはなります。

問題は、

  1. 設定量は手法1と同程度

これです。これを解決する手法は・・・

そう

アノテーション

です。正直なところ、私はSpringのアノテーションインジェクションについては若干懐疑的でした。設定が楽になるのはいいのですが、Spring管理下のサービスは、Spring自身にすら依存していないところが一つの謳い文句であったような気がしていたからです。ビジネスロジックにSpringが提供するアノテーションを付加して、XMLの記述が要らなくなる代わりに、ビジネスロジックがSpringに依存するようになってしまうのは正直どうかと思っていた訳です。

しかし

これがActionならば話は別です。Actionは当然ながら元々Strutsに依存しています。それが今更Springへの依存が増えたからといってどうだというのでしょう。というか、手法1でもそもそもActionがSpringに依存しているので、ビジネスロジックがSpringに依存してしまうことに比べれば、ActionがSpringに依存してしまうようになるのはたいした問題では無いというか場合によっては今まで通りです。

そんな訳で

私は第四の手法として、以下のようにStrutsとSpringを連携させるのがよいのではないだろうかという結論に達しました。

  • StrutsとSpringの連携は、「org.apache.struts.chain.commands.servlet.CreateAction」を継承してAction Commandを自作して行う。
    • Actionの生成ロジックは、「AutowiringRequestProcessor」と同じものが良さそうかな。
  • ActionのStruts的な設定はstruts-config上で行い、ActionのSpring的な設定はアノテーションで行う。
    • イメージ的にはこんな感じ。
package xxxx;

import javax.annotation.Resource;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.stereotype.Controller;

@Controller(value = "sampleAction")
public class SampleAction extends Action {
    private SampleService sampleService = null;
    
    @Resource(name = "sampleService")
    public void setSampleService(SampleService sampleService) {
        this.sampleService = sampleService;
    }
  
    (略)
}
    • 「value = "sampleAction"」はSampleAction自体のBean IDの定義であり、「name = "sampleService"」は注入するサービスのBean IDっぽい。

今までiBATISのことを誤解していました

結局Mercurial問題は解決しないもののOSを入れ替えてしまったので色々と環境の復元に追われている私がきましたよ。

JTerminalを入れなおしたり、finkを入れ直したり、Subversionを入れ直したり、NetBeansを設定しなおしたり、色々大変です。

全然関係無いですけど、10.4までは、起動中のアプリケーションはDoc内でなんか矢印がついていたような記憶があったのですが、10.5になってから印が消えたなーと思ったら、起動中のアプリケーションには矢印じゃなく青い光みたいのが陰っぽい感じでつくようになったんすね。ちょっぴりかっこいい。

それはさておき。

私は今までiBATISのことを誤解していました。それは、


この日の日記に書いているのですが、

  1. resultMapの記述が面倒くさい。
 
    1. これくらい一々定義しなくてもCoC的にオートでマッピングしてくれても良さそうなものなのだが。
    2. 動的SQLもやりすぎるとテストが大変そう。
  1. sqlMapConfig.xmlのresourceに一々sql-mapファイルを設定しないといけないのが面倒くさい。
    1. hoge.huga.PiyoDao用にhoge.huga.PiyoDao.xmlをおいとけばそこから自動的に読込んでくれるとうれしいのだが。

と、思っていた訳です。

http://ibatis.apache.org/javadownloads.cgi

ここのサイトの「Documentation」の「Japanese」のところを読んでみるに、

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE sqlMap 
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" 
    "http://ibatis.apache.org/dtd/sql-map-2.dtd"> 
<sqlMap namespace="Person"> 
      <select id="getPerson" resultClass="examples.domain.Person"> 
          SELECT 
              PER_ID as id, 
              PER_FIRST_NAME as firstName, 
              PER_LAST_NAME as lastName, 
              PER_BIRTH_DATE as birthDate, 
              PER_WEIGHT_KG as weightInKilograms, 
              PER_HEIGHT_M as heightInMeters 
          FROM
              PERSON 
          WHERE
              PER_ID = #value# 
      </select> 
</sqlMap> 

「上記の実例は、SQL Mapの最もシンプルな形を示しています。ResultSetのカラムとJavaBeansのプロパティ(もしくは、Mapキーなど)で名称が一致しているものを自動的にマップするSQL Mapsの機能を使っています。」

(; ̄Д ̄)

そんな機能があったのか・・・


このJavaDocからリンクはってある、


ここの解説からは、そんなことは読み取れなかったのだが・・・

ということはですね。

 

これくらい一々定義しなくても、

SELECT USER_ID as userId (略)

と、SQLを書けば、自動的にマッピングしてくれるという訳ですね!?

むむむ。

  1. sqlMapConfig.xmlのresourceに一々sql-mapファイルを設定しないといけないのが面倒くさい。
    1. hoge.huga.PiyoDao用にhoge.huga.PiyoDao.xmlをおいとけばそこから自動的に読込んでくれるとうれしいのだが。

これに関しても、Springと組み合わせれば、

  • SqlMapClientFactoryBeanを継承する
  • ApplicationContextAwareをimplementsする
  • afterPropertiesSet()をオーバーライドする
  • ApplicationContext#getBeanNamesForType()を実行し、SqlMapClientDaoSupportを継承しているクラスのBean-IDを取得する。
  • 取得したBean-IDを元にApplicationContext#getBean()を実行してインスタンスを取得する。
  • 取得したインスタンスのクラス名を取得する。
    • クラス名がhoge.huga.PiyoDaoだった場合、hoge.huga.PiyoDao.xmlsql-mapファイルと判断。
  • commons betwixtとPipedOutputStreamを利用し、PipedInputStreamに直接sqlMapConfigの内容を書き込む。
  • PipedInputStreamを元にInputStreamResourceを生成する。
  • 生成したInputStreamResourceを、SqlMapClientFactoryBeanのconfigLocationに設定する。

なんていうSqlMapClientFactoryBeanのサブクラスを作れば、物理的にsqlMapConfig.xmlを用意しなくても、アプリケーション起動時に動的にsqlMapConfig.xmlを生成できてメンテナンスが楽かも。

むむむ。

なんだか、急にSpring+iBATISで全然鉄板のような気がしてきました。

LeopardのNetBeansでMercurial

さて。MacNetBeansMercurialに挫折して久しい訳ですが、なんとなく

Mac 10.4だからだめだったのかも?

と、根拠もなく思い始めました。まぁ、期待する訳でもなかったのですが、10.5にあげるいい機会かなーとも思ったので、さっそくMac 10.5とバックアップ用の外付けハードディスクを買いにいった訳です。

特に期待していた訳でもなかったのですが、ひょっとしたら同じことで悩んでいる人もいるのかも?と思い、「Mac 10.4 Mercurial NetBeans」でぐぐってみました。

ぐぐって1番目および2番目に私のブログが出てくるあたり、なんだか非常にマイナーなことをしている気分になってきてさらに期待薄だった訳ですが、3番目にNetBeans6.1のリリースノートが出てきたので何の気なしに眺めていました。

現在、Mercurial 1.0 は、Mac 10.4 では使用できません。

と、思いっきり書いてあるじゃないですか・・・

そうですか、使えなかったんですね。

逆に言えば、Mac 10.5では使えるんですね?

そんなこんなで、wktkしながらMac10.5をインストールして、いの一番にNetBeansMercurialをダウンロードしてインストールしてみました。

・・・

10.4のときと全く同じ動作じゃないですか・・・

やっぱり、ローカルリポジトリへのコミットの段階で既にうまくいきません。そして、相変わらずコマンドラインから

hg commit -m "commit test"

とか実行するとうまくいきます。どうやら、別段10.4が悪かった訳ではないみたいです。

振り出しに戻ってしまいました。

相変わらずMercurialはお手上げです。

NetBeansでFindBugs

先日、nbcheckstyleに代わるcheckstyle beansがあることを発見したので、実はFindBugsにもそのような新しいNetBeans用のプラグインがあるのでは無いかともう一度探してみたところ。

こんなものがあるじゃありませんか。

FindbugsどころかcheckstyleもPMDもその他色々、これ一個でSoftware Qualityは万全ですってことらしい。

なんてこったい

実は、nbcheckstyleどころかcheckstyle beansもはずれで、このSQEが当たりだったということでしょうか。

そんな訳で、さっそくcheckstyle beansを一旦アンインストールして、以下のアップデートサイトからSQEをインストールしてみることにしました。

インストール対象のプラグインは、以下の三つみたいです。

  • SQE Update Center
  • SQE Java
  • SQE Platform

さっそくインストールして、念のためNetBeansを再起動してみたのですが・・・

さっぱり分かりません

なんだか分からないけど、Javaソースを開くたびに右下に道路標識の進入禁止みたいなアイコンがペコペコ点滅します。ダブルクリックしてみると、何やらSQEがらみのクラスが「ぬるぽ」をスローしている模様。メニューバーに現れた「Quality→Information」をクリックしても、同様に何やらヌルポを発生している模様。

なんだろう

ひょっとしてJava6以上じゃないと駄目だとかそういうことなのだろうか。それとも、

https://sqe.dev.java.net/

このサイトに「SQE is now built against NetBeans 6 RC1.」とか書いてあるように、NetBeans6.1ではまだ動作しないとかなのでしょうか。

それにもまして、「オプション→Quality」のところで、FindBugsとPMDには何やらオプション設定があることは分かったのですが、checkstyleのところには「No Configuration available yet」と表示されるのみで、何も設定項目が無いように見えるのですが。

ようするに

checkstyleのチェック内容をカスタムすることは現状できないということでしょうか。

むむむ・・・

FindBugsCheckStyle、PMD等々、品質関連のプラグインをSQE一つで全て提供というコンセプトは良いと思うのですが、チェック内容をカスタムできないというのはちょっと痛いです。

仕方が無いので、CheckStyle Beans同様今後に期待ということで、このプラグインはしばらく寝かせておいて当面の間やはりFindBugsはantかmavenでレポートを出して確認することにします。

品質関連のプラグインをオールインワンということで、ついでにJMockitやCode Coverage Pluginあたりもオールインワンされないかしら。

そういえば、品質関連といえば、NB JUnit IDE Integrationってインストールすると何ができるようになるのだろう?一応入れてみたものの、これも良くわかりません。