プロジェクト

全般

プロフィール

サポート #8

完了

NetBeans 8でソースコード静的検証

高橋 徹 さんがほぼ9年前に追加. 約7年前に更新.

ステータス:
終了
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
-
開始日:
2014/03/16
期日:
進捗率:

100%

予定工数:

説明

Javaでは静的検証ツールとしてCheckstyle、PMD、FindBugsが使われている。
NetBeansでもプラグインとしてこれらを統合して使用することができる。

しかし、プラグインのため、NetBeans本体のバージョンアップに対して追従が遅れることがある。
今回、NetBeans 8(本チケット作成時点では正式版未リリースでRC1が利用可能)ではCheckstyle、PMDのプラグインがデフォルトでは利用できない。また、FindBugsについてはJava SE 8対応が微妙である。

そこで、NetBeans 8におけるCheckstyle、PMD、FindBugsのプラグインの組み込み手順、利用方法、動作検証を行う。


ファイル

org-netbeans-libs-findbugs.jar (1.7 KB) org-netbeans-libs-findbugs.jar FindBugsマニフェストファイル修正版 高橋 徹, 2014/03/16 16:59
info-gianlucacosta-easypmd-easypmd.jar (167 KB) info-gianlucacosta-easypmd-easypmd.jar DefaultLanguageVersionParserを差し替えたもの 高橋 徹, 2014/04/22 03:35

関連するチケット 1 (1件未完了0件完了)

関連している 調査 #72: NetBeansのFindBugs IntegrationプラグインをSpotbugsに入れ替えできるか調査するフィードバック高橋 徹2017/06/25

操作

高橋 徹 さんがほぼ9年前に更新

  • ステータス新規 から 進行中 に変更
  • 進捗率0 から 50 に変更

NetBeans 8 RC1版で標準で設定されているプラグインアップデートサイトを[ツール]メニュー > [プラグイン] > [設定]タブでアップデートセンターの構成欄で調べると次のとおりである。

この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

高橋 徹 さんがほぼ9年前に更新

認定プラグインサイトより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

高橋 徹 さんがほぼ9年前に更新

  • ファイル 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.jar
FindBugs 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

これで一応動くようになった。

高橋 徹 さんがほぼ9年前に更新

  • ファイル を削除 (picture253-1.png)

高橋 徹 さんがほぼ9年前に更新

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で警告が出まくり状況)。

高橋 徹 さんがほぼ9年前に更新

EasyPmdプラグインを次のURLからダウンロード
http://gianlucacosta.info/software/easypmd/

[ツール]メニュー > [プラグイン]で、[ダウンロード済]タブを選択、[プラグインの追加]ボタンを押し、ダウンロードしたファイルeasypmd-4.0.nbmを選択し、インストールした。

高橋 徹 さんがほぼ9年前に更新

ラムダ式を使用したソースコードを含むプロジェクトを開き、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
%APPDATA%\NetBeans\8.0\modules\info-gianlucacosta-easypmd-easypmd.jarに含まれるMANIFEST.MFのClass-Path属性に記述されているライブラリは次のとおり。
ライブラリ 差換対象
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

高橋 徹 さんがほぼ9年前に更新

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ファイルを差し替えるのがうまくいかない・・・

高橋 徹 さんがほぼ9年前に更新

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

高橋 徹 さんがほぼ9年前に更新

EasyPMD 4.4のリリース

NetBeansの[ツール]メニュー > [オプション] > [EasyPMD]ボタン > [General]タブを選択し、
TargetJava version:欄に"1.8"を記入し[Verify settings]ボタンを押すと、エラーとなります。

EasyPMD 4.4でこれがOKとなりました。

高橋 徹 さんが8年以上前に更新

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

高橋 徹 さんが8年以上前に更新

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.
     :
    

    エラーなく実行できています。

高橋 徹 さんが8年以上前に更新

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 の名前で上記に置くといい感じです。

高橋 徹 さんが約7年前に更新

  • ステータス進行中 から 終了 に変更
  • 進捗率50 から 100 に変更

テーマが発散気味なので、いったんクローズとします。

高橋 徹 さんが5年以上前に更新

  • 関連している 調査 #72: NetBeansのFindBugs IntegrationプラグインをSpotbugsに入れ替えできるか調査する を追加

他の形式にエクスポート: Atom PDF