サポート #8
完了NetBeans 8でソースコード静的検証
100%
説明
Javaでは静的検証ツールとしてCheckstyle、PMD、FindBugsが使われている。
NetBeansでもプラグインとしてこれらを統合して使用することができる。
しかし、プラグインのため、NetBeans本体のバージョンアップに対して追従が遅れることがある。
今回、NetBeans 8(本チケット作成時点では正式版未リリースでRC1が利用可能)ではCheckstyle、PMDのプラグインがデフォルトでは利用できない。また、FindBugsについてはJava SE 8対応が微妙である。
そこで、NetBeans 8におけるCheckstyle、PMD、FindBugsのプラグインの組み込み手順、利用方法、動作検証を行う。
ファイル
高橋 徹 さんが10年以上前に更新
- ステータス を 新規 から 進行中 に変更
- 進捗率 を 0 から 50 に変更
NetBeans 8 RC1版で標準で設定されているプラグインアップデートサイトを[ツール]メニュー > [プラグイン] > [設定]タブでアップデートセンターの構成欄で調べると次のとおりである。
- プラグインポータル
http://plugins.netbeans.org/nbpluginportal/updates/8.0/catalog.xml.gz - 認定プラグイン
http://updates.netbeans.org/netbeans/updates/8.0/uc/final/certified/catalog.xml.gz - 配布用NetBeans
http://updates.netbeans.org/netbeans/updates/8.0/uc/final/distribution/catalog_ja.xml.gz
この3つのアップデートセンターから標準で入手できるのはFindBugs Integrationプラグイン(1.27)である。
プラグインポータルサイト(http://plugins.netbeans.org)にWebブラウザでアクセスし、プラグイン一覧からCheckstyle、PMD、FindBugs関連を探すと次のプラグインがあった。
プラグイン名 | 対応NetBeansバージョン | 最終更新日 | 評価候補 |
---|---|---|---|
Checkstyle Beans | 6.0 - 7.3 | 2011-10-21 | ○ |
Checkstyle-Task List Integration | 6.9 - 7.0 | 2011-04-08 | ー |
Checkstyle 4.3 | 6.0 | 2007-04-01 | ー |
nbCheckstyle_Update | 6.0 | 2007-12-03 | ー |
EasyPmd 3 | 7.3 - 7.4 | 2013-11-02 | ー |
PMD's Copy/Paste Detector | 6.0, 6.9 | 2012-03-26 | ー |
nb-pmd-rulesets | 6.9 | 2012-03-26 | ー |
EasyPmd 4 | 7.4 | 2014-01-03 | ○ |
EasyPmd 2.8 | 7.0 - 7.1 | 2012-07-23 | ー |
PMD | 7.1 - 7.4 | 2013-09-24 | |
EasyPmd | 6.8 | 2012-07-23 | ー |
PMD - for NetBeans | 6.0 | 2009-07-07 | ー |
FindBugs - Plugin | 6.1 | 2012-03-21 | ー |
高橋 徹 さんが10年以上前に更新
認定プラグインサイトよりFindBugs Integrationプラグイン(Ver.1.27)をインストールした。
手順は、NetBeans 7.4用に記載したNetBeans FindBugsプラグインページを参照した。
[ソース]メニュー > [検査]で、構成にFindBugsを選び、[検査]ボタンを押しましたが、何も起きません。
NetBeansのログを見てみると、次のエラーメッセージが記録されていました。
ぐぐるとこれは、FindBugsがJava SE 8のクラスファイルを解析できないために生じるエラーとのこと。
FindBugsの次のバージョン(3.0.0)ではJava SE 8に対応する予定で、現在その3.0.0のスナップショット版が公開されている。
http://comments.gmane.org/gmane.comp.java.findbugs.general/3427
FindBugsの本体と依存ファイルは、%USERPROFILE%\AppData\Roaming\NetBeans\8.0rc1\modules\ext\ ディレクトリ下に展開されている。
これを、3.0.0スナップショット版と差し替えてみるが、ファイル名が違う(例:commons-lang-2.4.jarとcommons-lang-2.6.jar)のでファイルが見つからないとエラーになった。ext下のJARファイルを参照しているのは、%USERPROFILE%\AppData\Roaming\NetBeans\8.0rc1\modules\org-netbeans-libs-findbugs.jar のマニフェストファイルであった。
Class-Path: ext/asm-3.3.jar ext/asm-commons-3.3.jar ext/asm-tree-3.3.j ar ext/commons-lang-2.4.jar ext/dom4j-1.6.1.jar ext/bcel-2.0.0.jar ex t/findbugs-2.0.0.jar ext/jaxen-1.1.1.jar ext/jFormatString-2.0.0.jar ext/jsr305-2.0.0.jar
高橋 徹 さんが10年以上前に更新
- ファイル picture253-1.png を追加
FindBugsプラグインのライブラリをFindBugs 3.0.0スナップショット版に差し替えてみる。
%USERPROFILE%\AppData\Roaming\NetBeans\8.0rc1\modules\ext\ 以下の次のファイルを一時除去asm-3.3.jar commons-lang-2.4.jar jFormatString-2.0.0.jar asm-commons-3.3.jar dom4j-1.6.1.jar jsr305-2.0.0.jar asm-tree-3.3.jar findbugs-2.0.0.jar bcel-2.0.0.jar jaxen-1.1.1.jarFindBugs 3.0.0スナップショット版に差し替えてみる。
http://sourceforge.net/projects/findbugs/files/findbugs/3.0.0/
から、findbugs-3.0.0-dev-20131204-e3cbbd5.zip をダウンロードし、以下のファイルを%USERPROFILE%\AppData\Roaming\NetBeans\8.0rc1\modules\ext\ にコピーする。
asm-debug-all-5.0_BETA.jar dom4j-1.6.1.jar jFormatString.jar bcel-6.0-SNAPSHOT.jar findbugs.jar jsr305.jar commons-lang-2.6.jar jaxen-1.1.6.jar
%USERPROFILE%\AppData\Roaming\NetBeans\8.0rc1\modules\org-netbeans-libs-findbugs.jar を作業ディレクトリに展開し、マニフェストファイルを修正する。
- 修正前のMANIFEST.MFのClass-Path:項
Class-Path: ext/asm-3.3.jar ext/asm-commons-3.3.jar ext/asm-tree-3.3.j ar ext/commons-lang-2.4.jar ext/dom4j-1.6.1.jar ext/bcel-2.0.0.jar ex t/findbugs-2.0.0.jar ext/jaxen-1.1.1.jar ext/jFormatString-2.0.0.jar ext/jsr305-2.0.0.jar
- 修正後のMANIFEST.MFのClass-Path:項
Class-Path: ext/asm-debug-all-5.0_BETA.jar ext/commons-lang-2.6.jar ex t/dom4j-1.6.1.jar ext/bcel-6.0-SNAPSHOT.jar ext/findbugs.jar ext/jaxe n-1.1.6.jar ext/jFormatString.jar ext/jsr305.jar
- JARの作成
$ jar cfm org-netbeans-libs-findbugs.jar MANIFEST.MF org
これで一応動くようになった。
高橋 徹 さんが10年以上前に更新
Checkstyle Beansプラグインを次のURLからダウンロード
http://www.sickboy.cz/checkstyle/download.html
$ tar xjf netbeans-checkstyle-3.3.0-bin.tar.bz2
- netbeans-checkstyle-library-3.5.6.nbm
- netbeans-checkstyle-plugin-3.3.0.nbm
[ツール]メニュー > [プラグイン]で、[ダウンロード済]タブを選択、[プラグインの追加]ボタンを押し、
展開した2つのnbmファイルを複数選択し、インストールした。
インストール後、エディタ画面がかなりにぎやかなことになります(checkstyleで警告が出まくり状況)。
高橋 徹 さんが10年以上前に更新
EasyPmdプラグインを次のURLからダウンロード
http://gianlucacosta.info/software/easypmd/
[ツール]メニュー > [プラグイン]で、[ダウンロード済]タブを選択、[プラグインの追加]ボタンを押し、ダウンロードしたファイルeasypmd-4.0.nbmを選択し、インストールした。
高橋 徹 さんが10年以上前に更新
ラムダ式を使用したソースコードを含むプロジェクトを開き、EasyPMD4をインストール後、アクション項目を開くと、次のエラーが表示された。
Error while parsing C:\Users\...\RangeValidator.java
EasyPMDが内蔵するPMDのバージョンを調べてみると、5.0.5であった。
EasyPMDによってインストールされるライブラリは次のとおり。
%APPDATA%\NetBeans\8.0\modules\ext\info.gianlucacosta.easypmd.easypmd +-- asm | +-- asm.jar +-- com-beust | +-- jcommander.jar +-- commons-io | +-- commons-io.jar +-- dom4j | +-- dom4j.jar +-- info-gianlucacosta-helios | +-- helios-core.jar +-- jaxen | +-- jaxen.jar +-- jdom | +-- jdom.jar +-- junit | +-- junit.jar +-- net-java-dev-javacc | +-- javacc.jar +-- net-sourceforge-pmd | +-- pmd.jar +-- net-sourceforge-saxon | +-- saxon-dom.jar +-- org-apache-ant | +-- ant-launcher.jar | +-- ant-testutil.jar | +-- ant.jar +-- org-apache-commons | +-- commons-lang3.jar +-- org-mozilla | +-- rhino.jar +-- org-slf4j | +-- slf4j-api.jar +-- xerces | +-- xmlParserAPIs.jar +-- xml-apis | +-- xml-apis.jar +-- xom +--xom.jar
ここを見てもライブラリのバージョンは分からないが、この中のpmd.jarを開いて、中に含まれるpom.xmlを見ると依存ライブラリとバージョンが判明する。
pom.xmlから抽出した依存ライブラリとそのバージョンは次のとおり。
ライブラリ | EasyPMDに含まれるバージョン | PMD-5.1.0に含まれるバージョン |
---|---|---|
asm | 3.2 | 5.0_BETA |
jcommander | 1.27 | |
commons-io | 2.2 | |
jaxen | 1.1.1 | |
junit | 4.4 | |
javacc | 4.1 | 5.0 |
saxon | 9.1.0.8 | |
ant-testutil | 1.7.1 | |
ant | 1.8.1 | |
commons-lang | 3.3.1 |
ライブラリ | 差換対象 |
---|---|
helios-core.jar | |
slf4j-api.jar | |
commons-lang3.jar | |
pmd.jar | ∨ |
ant.jar | |
ant-launcher.jar | |
ant-testutil.jar | |
jaxen.jar | |
dom4j.jar | |
jdom.jar | |
xml-apis.jar | |
xom.jar | |
xmlParserAPIs.jar | |
jcommander.jar | |
asm.jar | ∨ |
saxon.jar | |
saxon-dom.jar | |
rhino.jar | |
junit.jar | |
javacc-jar | ∨ |
commons-io.jar |
高橋 徹 さんが10年以上前に更新
EasyPMD 4.2の確認¶
PMD 5.1.0を内蔵するEasyPMD 4.2がリリースされました。NetBeans 8の更新サイトにもアップされています。早速インストール、しかし(やはり?)、ラムダ式を記述したソースファイルはパースエラーが発生してしまいました。
NetBeansの[ツール]メニュー > [オプション] > [EasyPMD]ボタン > [General]タブを選択し、
TargetJava version:欄に"1.8"を記入し[Verify settings]ボタンを押すと、エラーとなります。
The current EasyPmd options appear to be incorrect.
java.lang.IllegalArgumentException: Unsupported target Java version
そこで、easypmd 4.2のソースをダウンロードし、エラー箇所を探し(IllegalArgumentExceptionをスローしている箇所)、調べてみると
info/gianlucacosta/easypmd4/pmdscanner/DefaultLanguageVersionParser.javaで、
public LanguageVersion parse(String languageVersionString) {
switch (languageVersionString) {
case "1.3":
return LanguageVersion.JAVA_13;
case "1.4":
return LanguageVersion.JAVA_14;
case "1.5":
return LanguageVersion.JAVA_15;
case "1.6":
return LanguageVersion.JAVA_16;
case "1.7":
return LanguageVersion.JAVA_17;
}
throw new IllegalArgumentException("Unsupported target Java version");
}
と、Javaのバージョンが1.7までしか対応していません。
PMD 5.1.0のクラスnet.sourceforge.pmd.lang.LanguageVersionを調べると、JAVA_18を定義しているので、上述のswitch文に追加すればいい感じです。
そこで、
case "1.8":
return LanguageVersion.JAVA_18;
を追加し、コンパイルします。コンパイルには、PMDのJARとNetBeansのJARが必要です。とりあえず次の2つのJARをeasypmdソース展開場所へコピーしコンパイルしました。
- pmd.jar (PMD 5.1.0の中)
- org-openide-util-lookup.jar (NetBeansのplatform/libディレクトリ下)
work$ javac -cp ./pmd.jar:./org-openide-util-lookup.jar:. info/gianlucacosta/easypmd4/pmdscanner/DefaultLanguageVersionParser.java
- NetBeansのプラグインインストール場所($APPDATA/NetBeans/8.0/modules)にあるinfo-gianlucacosta-easypmd-easypmd.jarのDefaultLanguageVersionParser.classを上でコンパイルしたものに差し替えます。
これで、Java SE 8のラムダ式を使ったソースファイルでエラーにはならなくなりました。
easypmd-4.2.nbmの中のinfo-gianlucacosta-easypmd-easypmd.jarを差し替えるとよさそうですが、試してみるとプラグインのインストールがいつまでも終わらず、NetBeansのログを見るとエラーとなっています。
SEVERE [org.openide.util.Exceptions] java.lang.SecurityException: SHA-256 digest error for netbeans/modules/info-gianlucacosta-easypmd-easypmd.jar at sun.security.util.ManifestEntryVerifier.verify(ManifestEntryVerifier.java:218)
easypmd-4.2.nbmを展開してみるとMETA-INF/MANIFEST.MFに、各ファイルとそのSHA-256-Digestが記載されています。
Name: netbeans/modules/info-gianlucacosta-easypmd-easypmd.jar SHA-256-Digest: Rw174wPD58OsSxa5H7ck2zy/3CSYOCjaxZ1F9qAK6Pk=
ファイルを差し替えるときは、ハッシュコードも変える必要があります。
MANIFEST.MFでSHA-256-Digestを載せるときは、Base64形式でという仕様です。しかしsha256sumをbase64すると、上述よりも長いテキストが得られます。
調べてみると、sha256sumはバイナリではなくテキストを出すが、本当はバイナリのbase64を取る必要があるから。
work$ openssl sha256 -binary info-gianlucacosta-easypmd-easypmd.jar | base64 SWf3L63Bk2uomwB3kq2B6S1+tneX+1QpecHN+No8QlU=
となりました。
しかし、MANIFESTファイルを差し替えるのがうまくいかない・・・
高橋 徹 さんが10年以上前に更新
Checkstyleの確認¶
2014-04-01付けでCheckstyle Beans 3.4.0がリリースされていたのでNetBeans 8.0にインストールして試す。変更点は、Checkstyle 5.7を含むようにしたことです。
結果:ラムダ式内で、"Got an exception - expecting EOF, found 'HogeWord'"とエラーが発生し、そのソースファイルはその行以降チェックが走らない(指摘が上がらない)状況です。
Checkstyleの開発サイトでチケット"Add suport for the Java 8 Syntax"
https://github.com/checkstyle/checkstyle/issues/10
が登録されているけど未解決(Open)です。
原因は、ソースコードをパースするのに使っているANTLRライブラリがJava 8対応していないため。
ANTLRのJava 8対応は、2014年の夏季Googleインターンシップ(?)で取り扱われるらしい。
http://www.google-melange.com/gsoc/org2/google/gsoc2014/checkstyle
高橋 徹 さんが10年以上前に更新
Findbugsのリポジトリから最新ソースを入手しビルドし、それをFindbugs integrationで使用する試み。
~$ mkdir findwork ~$ cd findwork findwork$ git clone https://code.google.com/p/findbugs/ : findwork$ cd findbugs/findbugs findbugs$ ant : findbugs$ ls lib annotations.jar commons-lang-2.6.jar jFormatString.jar ant.jar dom4j-1.6.1.jar jsr305.jar AppleJavaExtensions.jar findbugs.jar junit.jar asm-debug-all-5.0.2.jar findbugs-ant.jar LICENSE_AppleJavaExtensions.txt bcel-6.0-SNAPSHOT.jar jaxen-1.1.6.jar yjp-controller-api-redist.jar buggy.icns jcip-annotations.jar bug-logo.icns jdepend-2.9.jar findbugs$
NetBeans IDE 8.0にFindbugs Integrationプラグインをインストールしたマシンから次のファイルを取得します。%APPDATA%\NetBeans\8.0\modules\org-netbeans-libs-findbugs.jar
このファイルを作業用ディレクトリで展開します。
~$ mkdir /tmp/nbfind ~$ cd /tmp/nbfind nbfind$ jar xf $APPDATA/NetBeans/8.0/modules/org-netbeans-libs-findbugs.jar nbfind$
META-INF/MANIFEST.MF
のClass-path属性に記載の依存JARファイル名を、最新findbugsに含まれるファイル名に修正します。
Class-Path: ext/asm-debug-all-5.0.2.jar ext/commons-lang-2.6.jar ex t/dom4j-1.6.1.jar ext/bcel-6.0-SNAPSHOT.jar ext/findbugs.jar ext/jaxe n-1.1.6.jar ext/jFormatString.jar ext/jsr305.jar
MANIFEST.MFを一つ上のディレクトリに移し、JARファイルを生成し直します。
nbfind$ mv META-INF/MANIFEST.MF .. nbfind$ jar cfm org-netbeans-libs-findbugs.jar MANIFEST.MF org
修正した org-netbeans-libs-findbugs.jar
ファイルを所定の場所に戻します。
nbfind$ cp org-netbeans-libs-findbugs.jar $APPDATA/NetBeans/8.0/modules/
findbugs.jar、およびMANIFEST.MFのClass-path属性に記載された依存JARファイルを所定の場所にコピーします。
nbfind$ cd ~/findwork/findbugs/findbugs findbugs$ cd lib lib$ cp asm-debug-all-5.0.2.jar commons-lang-2.6.jar dom4j-1.6.1.jar bcel-6.0-SNAPSHOT.jar \ findbugs.jar jaxen-1.1.6.jar jFormatString.jar jsr305.jar \ $APPDATA/NetBeans/8.0/modules/ext
高橋 徹 さんが約10年前に更新
CheckstyleのJava 8対応¶
checkstyleリポジトリを試す¶
- ソース一式をclone
git clone https://github.com/checkstyle/checkstyle.git
- mavenでビルド実施
mvn clean verify mvn -Pdistro clean package
- 実行
C:\work\HelloLambda> java -cp C:\work\checkstyle\target\checkstyle-5.8-SNAPSHOT-all.jar com.puppycrawl.tools.checkstyle.Main -c C:\work\checkstyle\sun_checks.xml -r src C:\work\HelloLambda\src\hellolambda\Hello.java:19:47: expecting RPAREN, found ':' C:\work\HelloLambda\src\hellolambda\HelloLambda.java:23:22: unexpected token: ) Starting audit... C:\work\lambda\HelloLambda\src\hellolambda\Hello.java:0: Missing package-info.java file. C:\work\lambda\HelloLambda\src\hellolambda\Hello.java:20:5: Got an exception - expecting EOF, found '}' :
解析開始(Starting audit... が表示される)前にエラーが発生しています。また、解析中にも「got an exception」とエラーが発生しています。ラムダ式等Java SE 8の新文法を認識できていません。
gsoc(Google Summer of Code)リポジトリ¶
checkstyleのJava SE 8対応は、gsocの一貫で実施されています(もう終わった?)。
リポジトリはどこか探したらここらしい
https://github.com/sabaka/checkstyle/tree/gsoc
- ソース一式をclone
git clone -b gsoc https://github.com/sabaka/checkstyle.git checktyle.gsoc
- mavenでビルド実施
mvn clean verify mvn -Pdistro clean package
- 実行
C:\work\HelloLambda> java -cp C:\work\checkstyle.gsoc\target\checkstyle-5.8-SNAPSHOT-all.jar com.puppycrawl.tools.checkstyle.Main -c C:\work\checkstyle.gsoc\sun_checks.xml -r src Starting audit... C:\work\HelloLambda\src\hellolambda\Hello.java:0: Missing package-info.java file. :
エラーなく実行できています。
高橋 徹 さんが約10年前に更新
Checkstyle Beanの構成¶
2つのnbmファイルから構成されています。- netbeans-checkstyle-library-3.5.7.nbm
- netbeans-checkstyle-plugin-3.4.0.nbm
checkstyleのライブラリが入っているのは前者です。
netbeans-checkstle-library-3.5.7.nbm¶
jarで展開すると次のようになります。
+-- Info | +-- info.xml +-- META-INF | +-- MANIFEST.MF +-- netbeans +-- config | +-- Modules | +-- cz-sickboy-netbeans-libs-checkstyle.xml +-- modules +-- autoload +-- cz-sickboy-netbeans-libs-checkstyle.jar +-- ext +-- antlr-2.7.7.jar +-- checkstyle-5.7.jar +-- commons-beanutils-core-1.8.3.jar +-- commons-logging-1.1.1.jar +-- guava-jdk5-14.0.1.jar
netbeans-checkstle-library-3.5.7.nbm
の中のnetbeans/modules/autoload/cz-sickboy-netbeans-libs-checkstyle.jar
に含まれるMANIFEST.MFに依存ライブラリの記述があります。
- cz-sickboy-netbeans-libs-checkstyle.jar のMETA-INF/MANIFEST.MFの記述(抜粋)
Class-Path: ext/checkstyle-5.7.jar ext/commons-beanutils-core-1.8.3.ja r ext/antlr-2.7.7.jar ext/commons-logging-1.1.1.jar ext/guava-jdk5-14 .0.1.jar
gsocリポジトリの依存ライブラリは次のとおり
- antlr-2.7.7
- commons-beanutils-1.8.3
- commons-cli-1.2
- guava-jdk5-14.0.1
- ant-1.7.0
ビルド¶
mvn clean install package assembly:attached nbm:autoupdate
エラーになってしまった
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.2-beta-5:single (make-assembly) on project netbeans-checkstyle: Failed to create assembly: Error creating assembly archive bin: You must set at least one file. -> [Help 1]
ビルドはあきらめて差し替え¶
Checkstyle BeansプラグインをNetBeansにインストールし、その後インストールした中のcheckstyleを差し替える手を講じてみる。
APPDATA\NetBeans\8.0\modules\autoload\ext に、次のファイルがある- antlr-2.7.7.jar
- checkstyle-5.7.jar
- commons-beanutils-core-1.8.3.jar
- commons-logging-1.1.1.jar
- guava-jdk5-14.0.1.jar
gsocのcheckstyle-5.8-SNAPSHOT.jarを、checkstyle-5.7.jar の名前で上記に置くといい感じです。