
プロジェクトにおいては環境の制約上、開発環境が古いもので固定されているケースもあるかと思います。
今回はそんな環境下で経験した事象となります。
1.環境
2.発生した現象
3.起きていたこと
4.原因の特定
5.修正
6.なぜ今までは動いていた?
7.最後に
環境
- eclipse上にて稼働するMavenプロジェクト
- ローカルサーバーはapache+tomcatで稼働
- プロジェクトの関係上、ミドルウェアは指定バージョンで固定。最新化は不可
環境構築は知見のない者でも構築できるよう、手順書に従い共用サーバーに用意されたアーカイブを解凍、インストールして構築していく仕組みで個別に独自の設定を入れることは禁止。
発生した現象
諸事情で環境を1から作り直す必要が出たため、手順書に基づき
- 共有サーバーに保管されているアーカイブを手元にコピー&解凍
- eclipse、Mavenといった基礎環境を展開
- eclipseを起動しレポジトリより指定のプロジェクトをチェックアウトしインポート
…という作業を行っていたのですが、最後の工程にてtomcatサーバーの追加でチェックアウト、動的Webアプリケーションとしてインポートしたプロジェクトが表示されず、ローカル環境が作れない状態となってしまいました。
最初は手順書作業の漏れかな?と思い手順書を見直しながら1から再構築を行うも状況は変わらず。
環境を作り直す直前までプロジェクトは同様の手順で正常にビルド・稼働していたため何が原因があるか分からず「何もしてないのに壊れた」状態だと悩むも、発生している事象から考えられることを1つずつ探っていくこととなりました。

起きていたこと
tomcatサーバーにてプロジェクトが検出されないのは何故か?という点よりディレクトリを確認したところプロジェクトインポート後、ビルドされているはずのファイル群がないことに気付きました。
通常、ビルドが走ることで
カレントディレクトリ
┝.classpath
┝.project
└.settings
といったファイル群が生成され、eclipseは.settings配下の内容(ファセット)より追加できるプロジェクトを認識します。
しかし、これらが生成されていないためMavenのビルドで何かが発生しているのではないか?という仮説を立て、深堀りを進めました。
原因の特定
深堀りを進めた結果、Mavenのビルドで参照される「pom.xml」で設定されていたURLのいくつかにエラーが出ていました。
エラーの内容は単純で「Mavenのビルド時に参照していたURLがhttpプロトコルによる通信を受け付けてない (※) 」というものでした。
※Maven 3.8.1よりhttpによる接続を拒絶するようになったとのことです
参考:https://maven.apache.org/security.html
修正
本来ならApache-Mavenのバージョンを最新化したいところですが、制約上そうもいかないため、対症療法として「pom.xml」に対し以下の修正を実施しました。
- httpによるURL指定を全てhttpsに修正
- 証明書エラーを起こしていたMaven2レポジトリ
http://insecure.repo1.maven.org/maven2
の参照先を
https://repo1.maven.org/maven2
に変更
この設定にてプロジェクトの再ビルドを行ったところ、ファイル群が生成されてプロジェクトが認識できるようになり、復旧に至りました。
なぜ今までは動いていた?
復旧後、
Mavenのhttps化はかなり以前に行われているにも関わらず環境の再構築まで問題が出なかったのはなぜ・・・?
という疑問が残ったのですが、調べてみると
通信が厳格化したタイミング以降、Mavenのビルドそのものは失敗していたが、失敗以前に生成されていた古い「.settings」、「.project」、「.classpath」はクリーニングされずに残る仕様であり、eclipseはたまたま残ったままとなっていた古いファイルを参照し続けることでプロジェクトを認識し、ビルドが行われていた。
という何とも言えないオチでした。
最後に
今回、経験したのは古い環境で固定された状況下でゆえに直面した思わぬ落とし穴でした。
古い環境はこのような問題のみならず数々の脆弱性やバグを伴いますので、最新とは言わずとも開発環境を問題の解消されたバージョンまで更新できるのが理想とは考えます。
ただ、現場によってはアップデートがどうしても出来ない環境制約があるケースもあるので、自分が使用している環境の仕組みの基礎を理解しておく、有事の際に基礎知識を用いて追いかけるスキルの重要性を再認識した出来事でした。
