発生した事象
4,5年前に立ち上げ時期だけ参加していたプロジェクトがありました。そのプロジェクトはもうクローズしていますが、その資産を引き継ぎ新たに開始したプロジェクトがあり、Javaに詳しい開発者がいないとうことで、そのプロジェクトを(本業に差し支えのない範囲で)支援することになりました。
支援先の開発環境が、NetBeans IDE 8.2(とOpenJDK 1.8.0)を使っているので、 それに合わせて開発環境の確認をするため、開発で使用するプラグインをNetBeans IDEに順次入れて動作確認をしている中で、FindBugs Integrationプラグインのインストール時にエラーが発生してしまいました。
以前インストールしたときは問題なかったのですが・・・
ということで、どうしてエラーになったのか原因を調べてみました。
FindBugs Integration プラグインの構成
NetBeans IDEのプラグインでFindBugs Integrationを選択すると、次の2つのプラグインをインストールしようとします。
ここで、FindBugs Library Wrapper は、FindBugsが依存するライブラリ(ASM、BCEL、Commons Lang、DOM4J、FindBugs、JAXEN、jFormatString、JSR305)をインストールするのですが、これらはプラグインのファイルには含まれておらず、インストールを実施するときに外部(mavenリポジトリ)からダウンロードする仕組みとなっています。
ここで、mavenリポジトリから依存するライブラリをダウンロードする際のURLが、ASMの場合次の様に記載されています。
CRC:3011554661 SIZE:380313 URL:http://repo1.maven.org/maven2/org/ow2/asm/asm-debug-all/5.0.2/asm-debug-all-5.0.2.jar URL:m2:/org:ow2:asm:asm-debug-all:5.0.2:jar
試しにこのURLをWebブラウザで指定してアクセスしてみました。すると、
501 HTTPS Required. Use https://repo1.maven.org/maven2/ More information at https://links.sonatype.com/central/501-https-required
とエラーになっています。
mavenリポジトリにアクセスできなくなったのは?
上述でWebブラウザからURLにアクセスしたときのエラーメッセージにある"More information"を見てみます。
- 2020年1月15日から、The Central Repositoryは、素のHTTPは受け付けず、HTTPSでアクセスする必要がある
- URLのhttpをhttpsに書き換える
- どうしてもHTTPでアクセスする必要がある場合、http://insecure.repo1.maven.org/maven2/ へアクセスする
mavenリポジトリがHTTPを受け付けなくなった背景は次に述べられています。
mavenリポジトリに依存したビルドが、2020年1月15日を境に壊れるという事象が発生しているところがあちらこちらにありそうです。
FindBugs Integrationプラグインをインストールするにはどうすればよいか
理想は、FindBugs IntegrationプラグインがHTTPSを使って依存ライブラリをダウンロードするように設定を変更することです。
しかし、アプリケーション開発者の制御範囲外のことですから、プラグイン側が対応するまでの間、回避策が必要です。
回避策1 URLを変更する
まず、FindBugs Integrationプラグインのファイル(nbm: NetBeans Moduleファイル)をダウンロードします。本日時点でNetBeans 8.2でインストールする場合のnbmファイルのURLは次です。
- https://updates.netbeans.org/netbeans/updates/8.2/uc/final/certified/82/extra/org-netbeans-libs-findbugs.nbm
- https://updates.netbeans.org/netbeans/updates/8.2/uc/final/certified/82/extra/org-netbeans-modules-findbugs.nbm
このURLの導出方法を知りたい方は、以前NetBeans 8.0のときに以下のWikiに記載しましたので参照ください。 www.torutk.com
次に、ダウンロードしたorg-netbeans-libs-findbugs.nbmをzipで開き、次のファイルを取り出します。
+-- Info +-- META-INF +-- netbeans +-- config +-- modules +-- ext | +-- asm-debug-all-5.0.2.jar.external | +-- bcel-6.0-SNAPSHOT.jar.external | +-- commons-lang-2.6.jar.external | +-- dom4j-1.6.1.jar.external | +-- findbugs.jar.external | +-- jaxen-1.1.6.jar.external | +-- jFormatString.jar.external | +-- jsr305.jar.external
この、externalで終わるファイル名には、jarファイルをmavenリポジトリからダウンロードするURLが記述されています。このURLを、httpからhttpsに書き換えます。
例えば、asm-debug-all-5.0.2.jar.externalは次のテキストが記述されたファイルです。
CRC:3011554661 SIZE:380313 URL:http://repo1.maven.org/maven2/org/ow2/asm/asm-debug-all/5.0.2/asm-debug-all-5.0.2.jar URL:m2:/org:ow2:asm:asm-debug-all:5.0.2:jar
これを次の様に書き換えます。
CRC:3011554661 SIZE:380313 URL:https://repo1.maven.org/maven2/org/ow2/asm/asm-debug-all/5.0.2/asm-debug-all-5.0.2.jar URL:m2:/org:ow2:asm:asm-debug-all:5.0.2:jar
同じ要領で、残りのファイル(名前がexternalで終わるもの)についてもhttpをhttpsに書き換えます。
Windows上で7zipツールを使う場合、org-netbeans-libs-findbugs.nbmを7zipで開き、netbeans\modules\extディレクトリを開き、ファイル名がexternalで終わるファイルを右クリックし、[編集]を選択、開いたメモ帳でhttpをhttpsに変更して保存、アーカイブを更新していきます。
次に、このorg-netbeans-libs-findbugs.nbmは署名付きJARファイルとなっているので、内容を変更した結果署名と合わなくなりエラーとなってしまいます。そこで、META-INFの下にある次の署名ファイルを削除します。
+-- META-INF +-- ORACLE_C.SF +-- ORACLE_C.RSA
すべてのexternalファイルの変更と、署名ファイルの削除が終わったら、NetBeans IDE 8.2上で、[ツール]メニュー > [プラグイン]で「プラグイン」画面を開き、[ダウンロード済]タブを選択し、[プラグインの追加]ボタンを押し、「プラグインの追加」ファイル選択ダイアログが表示されるので修正済みのorg-netbeans-libs-findbugs.nbmと、ダウンロードしたorg-netbeans-modules-findbugs.nbmの2つを選択して[開く]をクリック、「プラグイン」画面に戻るので[インストール]ボタンをクリックしてインストールします。
回避策2 externalを実体に差し替える
org-netbeans-libs-findbugs.nbmの中のexternalファイルを、実際のJARファイルに置き換えます。 NetBeans 8.0のときの作業を先のWikiページに記載しているので、それに倣って対応します(結果は未確認)。
教訓
mavenは一見便利ですが、mavenリポジトリという外部組織が管理するサイトに依存することになるため、ビルドはいつ壊れるか分かりません。
特に、長期間保守をするシステムでは、安易に外部のmavenリポジトリを利用するのではなく、外部組織のサイト管理を常にウォッチしその変更に迅速に対応できる体制を構築して維持するとか(多分無理)、組織内に利用するライブラリ群を保持するmavenミラーリポジトリを用意して管理するとか、依存ライブラリをビルド環境に保持しローカル参照するようなビルドにするといったことが必要です。