JavaファイルやJSPファイルなどのソースファイルの中に、エラーや警告などの問題がある場合は、その部分にマーカが設定されます。そのため、問題は、エディタのルーラー上のアイコンやソースが強調表示されることで確認できます。また、問題ビューにも一覧表示されます。マーカの情報として問題の内容が表示されているので、必要に応じて修正してください。
エラーや警告などの問題は、さまざまな機能で検出されます。問題を検出する機能を以下に示します。
Javaコンパイラ
Javaの仕様に違反しているコーディングミスだけでなく、Javaの仕様として問題は無いがトラブルの原因になる可能性がある記述をチェックすることができます。
検証
ファイルやアプリケーション単位に規約などに準拠しているかをチェックします。
Interstage Java EE検証
Java EE アプリケーションとしての妥当性を検査します。
FindBugs
バグの存在する可能性があるコードを指摘します。
Javaの仕様に違反しているコーディングミスだけでなく、Javaの仕様として問題は無いがトラブルの原因になる可能性がある記述をチェックすることができます。
以下にチェックする項目の概要を示します。
コードスタイル
潜在的なプログラミングの問題
名前のシャドーイングおよび競合
使用すべきではない制限されたAPI
不要なコード
総称型
注釈
上記のカテゴリに属する細かいチェック項目があり、そのチェックレベルをカスタマイズすることができます。カスタマイズは、設定ページの[Java] > [コンパイラ]、またはその配下の設定ページから行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[Javaコンパイラ]で行います。)
以下のようにファイルやアプリケーションの妥当性を検証するバリデータが提供されており、ファイル単位やプロジェクト単位にチェックすることができます。
バリデータ | チェック内容 |
---|---|
HTML構文バリデータ | HTMLファイルの基本構文をチェックします。 |
JavaScript 構文検証 | HTML/JSPファイルに記述したJavaScriptの構文をチェックします。 |
JPAバリデータ | JPAアプリケーションとしての妥当性をチェックします。 |
JSP構文バリデータ | JSPファイルをJavaコードに変換してから、そのJavaコードにコンパイルエラーが無いかを検査することでJSPファイルの構文をチェックします。 |
JSP内容バリデータ | JSPのELやディレクティブなどをチェックします。 |
XMLバリデータ | XMLファイルが整形式であること、および妥当であることをチェックします。 |
バリデータは以下を契機に動作します。
ファイルの保存時
自動ビルドがONの場合にビルダとして実行されます。
エディタの編集時
ファイル単位にチェック可能なバリデータは、エディタで編集中にもチェックを行います。
メニューからの実行時
リソース(ファイルやプロジェクトなど)を選択して、コンテキストメニューから[検証]を選択すると実行されます。
検証の設定
検証の動作をカスタマイズすることができます。カスタマイズは、設定ページの[検証]で行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[検証]で行います。)
カスタマイズは以下を参考に行ってください。
すべてのバリデータを中断
すべてのバリデータを一時的に実行しない場合に指定します。
手操作/ビルド
メニューから実行する場合(手操作)と、ビルドの場合に有効にするバリデータを指定することができます。
以下のように、Java EE アプリケーションとしての妥当性をアーカイブファイル単位に検証することができます。
配備前(デフォルト)
動作確認などのために、Interstage StudioからInterstage Application Serverに配備する前に妥当性をチェックします。
メニューからの実行
プロジェクトを選択して、コンテキストメニューから[Interstage Java EE検証] > [実行]を選択することで妥当性をチェックします。アプリケーションの作成途中などにチェックしたい場合に利用してください。
ビルド
ビルド時にInterstage Java EE検証機能を実行することができます。ただし、自動ビルドがONの場合にはファイルの保存のたびに、Java EE アプリケーションとしてアーカイブファイル全体のチェックが行われてしまい効率的ではありません。
そのため、個々のJava EEモジュールの開発時に開発者が利用することはお勧めしません。アプリケーションを一括してビルドするなどの際に、まとめて検証も実行するために利用してください。
ポイント
エンタープライズアプリケーションプロジェクトをチェックすると中身のモジュールまでチェックされてしまいます。ワークスペースでエンタープライズアプリケーションとその中身のモジュールを両方作成しており、ビルド時にチェックする場合には、どちらかのみを選択してチェックが重複しないようにしてください。
Interstage Java EE検証の設定
Interstage Java EE検証の動作をカスタマイズすることができます。カスタマイズは、設定ページの[Interstage Java EE検証]で行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[Interstage Java EE 検証]で行います。)
カスタマイズは以下を参考に行ってください。
JSPをチェックする
検証のバリデータと重複し、検証バリデータの方が問題箇所を特定しやすいためデフォルトではチェックを行っていません。ただ、Java EEアプリケーションの検証では、Interstage Application ServerのJSPコンパイラを使ってチェックするため、Interstage Application Serverで動作するアプリケーションを厳密にチェックしたい場合には、HTML/JSP構文バリデータの代わりに使用することもできます。
配備前にチェックする
サーバビューから配備する前に妥当性をチェックします。アプリケーションとしての構成がほぼ決定し、実装部分の障害修正のみの段階に入った場合など、動作確認前に妥当性を検査する必要性が低くなってきた場合にはチェックをはずしてください。
差分ビルドではチェックしない
ビルド時にチェックを行う場合には、デフォルトでは差分ビルド時はチェックしないようになっています。差分ビルド時にも、アーカイブファイル単位にチェックが毎回動作してもいいという場合にはチェックをはずしてください。
以下のように、バグの存在する可能性があるコードを指摘するFindBugsを使用することができます。
メニューからの実行
リソース(プロジェクトやファイル)を選択して、コンテキストメニューから[FindBugs] > [バグをスキャン]を選択することでFindBugsを実行します。
ビルド
ビルド時にFindBugsを実行することができます。(デフォルトではビルド時にFindBugsを実行する設定になっていません。)
ポイント
複数プロジェクトを選択して、コンテキストメニューから[FindBugs] > ["自動的に実行"を設定]を選択することで、まとめてビルダとして実行するように設定することもできます。
検出された問題は、以下の形式で問題ビューに表示されます。
<警告優先度> <バグカテゴリ> <バグパターン> : <メッセージ>
警告優先度
High、Medium、Lowの頭文字で表されます。[レポートする最小の優先度]で、検出レベルをカスタマイズすることもできます。
バグカテゴリ
バグカテゴリの省略形(一文字の英字)で表されます。チェックするかをバグカテゴリ単位に指定することができます。バグカテゴリと省略形の対応付けについては、"チェック内容"を参照してください。
バグパターン
バグパターンの省略形(数文字の英数字)で表されます。フィルタファイルに記載することでチェックの動作をカスタマイズすることができます。
また、以下のように、FindBugsで検出された問題を表示するためのビューやパースペクティブも用意されています。
FindBugsパースペクティブ
検出されたバグになる可能性があるコードを修正するためのパースペクティブです。バグ詳細ビュー、バグツリー ビュー、バグのユーザ注釈ビューなどで構成されています。
バグ詳細ビュー
検出された問題の詳細情報を表示します。
詳細情報としては、警告優先度、バグカテゴリ、問題箇所のクラス、メソッド名、フィールド、ソースファイル名および行番号、問題の概要と詳細内容が表示されます。
バグツリー ビュー
検出された問題をツリー形式で表示します。
バグツリー ビューでは、プロジェクト単位にタブが割り当てられており、検出された問題は、バグパターン単位にタブの中にツリー形式で表示されます。バグツリー ビュー上で選択した問題の詳細が、バグ詳細ビューに表示されます。また、バグツリー ビューの問題をダブルクリックすると、問題ビューと同様に問題が発生している箇所をエディタ領域に表示します。
バグのユーザ注釈ビュー
FindBugsで検出された個々の問題について、ユーザ注釈を記述することができます。
注釈としては、分類の選択、任意のコメントを指定できます。また、問題が検出された日時もビューに表示されます。
チェック内容
FindBugsでは、以下のようなチェックを行っています。
バグカテゴリ | 省略形 | 概要 |
---|---|---|
実行効率 | P | 必ずしも間違いではないが、実行効率が悪くなる可能性のあるもの。例えば、以下のようなものを検出します。
|
正確性 | C | 明らかなコーディングミスによって、開発者の意図しないコードになっているもの。例えば、以下のようなものを検出します。
|
国際化 | I | 国際化、ロケールの扱いに対するコードに欠陥があるもの。例えば、以下のようなものを検出します。
|
マルチスレッド環境での正確性 | M | スレッド、ロック、volatileの扱いに対するコードに欠陥があるもの。 |
良くない習慣 | B | 推奨される、あるいは本質的なコーディング規範から逸脱しているもの。例えば、以下のようなものを検出します。
|
脆弱性を持つコード | V | 信頼されていないコードからの攻撃に対して脆弱性を持つコード。例えば、以下のようなものを検出します。
|
回避可能 | D | 誤解を与え易いコード、変則的、間違いを招き易いコード。例えば、以下のようなものを検出します。
|
上記のバグカテゴリ単位にチェックする/しないをカスタマイズすることができます。
FindBugsの設定
FindBugsの動作をカスタマイズすることができます。カスタマイズは、設定ページの[FindBugs]で行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[FindBugs]で行います。)
カスタマイズは以下を参考に行ってください。
レポートする最小の優先度
指定した検出レベル以上の問題が検出されます。
除外フィルタファイル
追加したフィルタファイルの設定でバグ検出を除外します。
プロジェクト固有の設定項目については、以下を参考に行ってください。
FindBugsを自動的に実行
ビルド時にFindBugsを実行する場合に指定します。
ポイント
複数プロジェクトを選択して、コンテキストメニューから[FindBugs] > ["自動的に実行"を設定]を選択することで、まとめてビルダとして実行するように設定することもできます。
FindBugsのフィルタファイルの書式
FindBugsでは、チェックした内容を問題として扱うかをフィルタファイルで制御することができます。例えば、FindBugsによって問題として検出されたが、コードを確認したところ問題ないことが判明した場合には、除外フィルタファイルを設定することで、以降に問題として検出されないようにすることができます。
以下にフィルタファイルで使用するタグについて説明します。
タグ | 属性 | 説明 |
---|---|---|
FindBugsFilter | - | フィルタファイルのトップレベルの要素です。 |
Match | - | クラスを特定するための要素です。 |
class | クラス名を指定します。 | |
classregx | クラス名を正規表現で指定します。 | |
BugCode | - | バグパターンの省略形を指定するための要素です。バグパターンの省略形は問題メッセージの3番目に表示されるアルファベットの組合せです。 |
name | バグパターンの省略形をコンマで区切って指定します。 | |
Priority | - | 優先度を指定するための要素です。 |
value | 以下の値を1つ指定します。 | |
Method | - | メソッドを指定するための要素です。params属性とreturns属性は必須ではありませんが、指定する場合は両方指定する必要があります。 |
name | メソッド名を指定します。 | |
params | 引数の型の完全修飾名をコンマで区切って指定します。 | |
returns | 復帰値の型の完全修飾名をコンマで区切って指定します。 | |
Or | - | OR論理演算子の役目をする要素です。 |
実際の除外フィルタファイルの例を示します。
<?xml version="1.0" encoding="UTF-8"?> <FindBugsFilter> <!-- ClassNotToBeAnalyzedクラスに関する問題を検出しないようにします --> <Match class="com.foobar.ClassNotToBeAnalyzed" /> <!-- ClassWithSomeBugsMatchedクラスに関する以下の問題を検出しないようにします DE : 例外を見落としている、または無視しています。 UrF: 参照しないフィールドがあります。 --> <Match class="com.foobar.ClassWithSomeBugsMatched"> <BugCode name="DE,UrF" /> </Match> <!-- すべてのクラスに対してSQLの問題を検出しないようにします --> <Match classregex=".*" > <BugCode name="SQL" /> </Match> <!-- AnotherClassクラスのnonOverloadedMethod, frob, blatメソッドに対してフィールドの二重チェックの問題を検出しないようにします --> <Match class="com.foobar.AnotherClass"> <Or> <Method name="nonOverloadedMethod" /> <Method name="frob" params="int,java.lang.String" returns="void" /> <Method name="blat" params="" returns="boolean" /> </Or> <BugCode name="DC" /> </Match> <!-- MyClassクラスのsomeMethodに対して優先度2(普通)の意味の無いローカル変数への代入の問題を検出しないようにします --> <Match class="com.foobar.MyClass"> <Method name="someMethod"/> <BugCode name="DLS "/> <Priority value="2"/> </Match> </FindBugsFilter>