Java SEアプリケーション開発環境構築 bravo¶
alfaを流用して修正中 |
想定プロジェクト¶
Java SE 8でアプリケーションソフトウェアを開発するプロジェクト「bravo」を想定し、そのbravoプロジェクトにおける開発環境を構築します。
対象となるアプリケーションソフトウェアの主な機能は次とします。
- プロセス間通信(別ノード上のプロセスを含む)
- ファイルI/O
- データベース
同一ノード(計算機)上の別ソフトウェア(Java及び他の言語で作られている)及びネットワークで他のマシンのソフトウェアとデータ交換を行い、ファイル入出力処理を行い、データベース(アプリケーション固有に使うクライアントサイドDB)を持つとします。このソフトウェアは、クローズなネットワーク上で使用されインターネット接続環境にはないものとし、また、実行にあたりサーバーとの常時接続もないとします。
開発者は数人が関わるとし、その人数に対応できるインフラ(ビルド、構成管理、不具合管理)を持つとします。
基本方針¶
開発者それぞれが自分用に占有できる開発マシンを持ちます。開発は主に統合開発環境(IDE)を使用します。
プロジェクト資産は共有のサーバーで管理します。
開発者が作成したソースコードは開発者自身のマシン上だけでなく、共有のビルドサーバー上でビルド可能とします。
開発者間で共有する設計情報(APIなど)は構成管理対象とします。具体的にはAPIのJavadocドキュメント、補足ドキュメントはリリース番号を付与して共有サーバーで公開するものとします。
使用するサードパーティ製ライブラリとのその参照設定を一貫させるため、ライブラリと設定を配布します。
ソースコードの書式を開発者間で一貫させるため、開発ツールの設定(ソースコード整形設定、ファイル先頭コメント、プロジェクトで共通化するコードスニペットなど)を作成・管理・配布します。
静的検証ツールは開発者の環境にインストールし、適用するルールセットを作成・管理・配布します。ルールセットはビルドサーバーでも使用し結果をレポートします。
サーバーのビルド環境は、CI(継続的インテグレーション)を指向します。
基本方針におけるポイント、メモ¶
統合開発環境の選定¶
開発者の使用する統合開発環境に対してプロジェクト共通の各種設定、ツールの組込みを行います。Javaにおいては、統合開発環境が複数製品存在するため、プロジェクト推奨統合開発環境を一つ定め、各種設定・ツールの組込みは推奨統合開発環境について提供します。本来は推奨ではなくマストにしてもいいと思っていますが、そうすると統合開発環境戦争が勃発し不幸な歴史を繰り返すことになるので、推奨以外の使用を禁止することはしません。ただし、自己責任において環境構築を行ってもらいます(推奨統合開発環境用に配布した設定を取り込んでもらう、配布したプラグイン相当のことは手作業でもしてもらう、ソースコードは推奨統合開発環境用のプロジェクトとしてコミットしてもらう、など)。自分が使いたいツールを使う環境を整えることで、これを機にツールマスターが育つのもうれしいことです。
Java SE標準ライブラリ以外に、サードパーティ製ライブラリを使う場合、ライブラリの配置場所、クラスパスの指定方法が個人の環境依存にならないよう考慮した設定をする必要があります。
ビルドツールの選定¶
開発者各自の統合開発環境上でビルドするほか、共通のビルドサーバーで自動ビルドするので、コマンドラインからもビルドできるAnt、Maven、Gradleなどを使います。それぞれ得手不得手があるので、インターネット接続可否、使用する統合開発環境との整合性などの状況に応じて選択します。
また、ビルドした後、実機への展開(デプロイ)を検討し、インストーラが必要であればインストーライメージの作成までできるようにします。「bravo」プロジェクトでは、実機はスタンドアロンのPCを想定しているので、実行するPCのOSのネイティブ形式インストーラを作成します。
静的検証ツールの利用¶
プログラムを仕上げてから静的検証ツールをかけて、指摘箇所の対応をするのはロスが大きいので(再帰テスト実施、時には設計変更)、プログラムを書き始めた当初から適用します。そのため、開発者個人の統合開発環境に自動で指摘を知らせるよう性的検証ツールと適用ルールセットを組み込んでもらいます。また、同じルールセットでビルドサーバー側で定期的に検証します。サーバー側の検証では状況をレポートできるよう可視化まで作りこみます。可視化しておくことで随時プロジェクトの問題状況を把握できるようになります。
テストツール¶
テストツール選択は、プロジェクトのテスト計画(テスト戦略)によって変わってしまうので、最初にテスト計画を考える必要があります。
Java言語は強い型付けの言語なのでコンパイラでの検証が強力ですが、それでもコンパイラが通ったからといって終わりにしてしまうとバグが多数後逸してしまいます。バグの対処は早期発見早期治療が肝なので、後逸すればするほどプロジェクト全体のロスを増やします。本プロジェクトは、ネットワーク、ファイルなどプログラム外のイベントやデータに基づき動作するため、テストが不十分だと運用に入ってから「想定外1」の事象によりエラーとなって慌てることになりかねません。そこで、ユニットテスト段階でテストを厚く実施するテスト計画(戦略)を採ることにします。特に外界との境界を担う部分に注力します。逆に、単純なロジック(Beanに値をセット/ゲットする的なもの)はテスト効果が薄いので手を抜きます。
テストツールとして、ビジネスロジック中心のコード(処理へのインプットとアウトプットがプログラム内で閉じる機能)であれば、JUnit等のユニットテストツールでテストが可能ですが、UI、ネットワーク、ファイルI/O、データベースなどプログラムの境界の内外を通した処理になるのでユニットテストの敷居が高くなります。JUnit等の基本的なユニットテストツールだけでは不十分なので、JMockitなどのモックライブラリを使ったネットワーク・ファイル・データベース等のI/Oのテストを行います。
1 「想定外」:十分に検討していれば「想定内の事象に対する対処(エラー処理コード等)」をしていたはずなのに、設計時に正常系にちょこっと異常系を加えただけのユースケースしか考えず、ユニットテストレベルでも異常データ(境界条件)を扱わず、結合テストでは設計時に考慮したちょこっと異常系のテストしかしないと、「想定外」と言い訳する羽目になります。
開発ツールチェインの作成¶
標準ツールチェイン¶
種類 | ツール名 | 配置場所 | 備考 | |
---|---|---|---|---|
開発者PC | ビルドサーバー | |||
Java開発キット | Red Hat Enterpsise Linux OpenJDK 1.8.0 | ∨ | ∨ | |
統合開発環境 | Oracle NetBeans IDE 8.2 | ∨ | ー | |
ビルドツール | Apache Ant (NetBeans搭載v1.9.7) | ∨ | ー | |
Apache Ant 1.9.7 | ー | ∨ | ||
データベース | SQLite 3 | ∨ | ∨ | |
ライブラリ(JPA) | 調査中 | ∨ | ∨ | |
ライブラリ(CORBA) | JacORB 3.9 | ∨ | ∨ | |
C.I.ツール | Jenkins | ー | ∨ | |
WiX | ー | ∨ | Windows OSが動くビルドサーバー | |
静的検証ツール | NetBeans CheckStyleプラグイン | ∨ | ー | Checkstyle Beans 4.1.0(Checkstyle 6.15) |
NetBeans PMDプラグイン | ∨ | ー | EasyPMD 10.0(PMD 5.5.2) | |
NetBeans FindBugsプラグイン | ∨ | ー | FindBugs Integration 1.32(FindBugs 3.0.0) | |
CheckStyle 6.15 | ー | ∨ | ||
Jenkins CheckStyleプラグイン | ー | ∨ | ||
PMD | ー | ∨ | ||
Jenkins PMDプラグイン | ー | ∨ | ||
FindBugs | ー | ∨ | ||
Jenkins FindBugsプラグイン | ー | ∨ | ||
ユニットテスト | NetBeans JUnitプラグイン | ∨ | ー | |
JUnit 4.11 | ー | ∨ | ||
JMockit 1.49 | ∨ | ∨ | ||
動的検証ツール | NetBeans JaCoCoプラグイン | ∨ | ー | |
Jenkins JaCoCoプラグイン | ー | ∨ | ||
JaCoCo | ー | ∨ | ||
NetBeansプロファイラ | ∨ | ー | ||
構成管理 | Git(NetBeans搭載) | ∨ | ー | |
Git | ー | ∨ | Red Hat Software Collectionsより | |
不具合・課題・情報共有 | Redmine 3.3 | ー | ∨ | |
Chrome または Firefox | ∨ | ー | RedmineのAttach image from clipboardプラグイン動作条件 |
オプションツール¶
ソフトウェア開発にあると効率がよいツール、幾つか代替ツールがあるので好みのものを使えばよいツール、全員は必要ないので作業をする場合に使えばよいツールなどをオプションツールとして列挙します。
- Cygwin
Unixエミュレーションとその上で動くUnix系各種ツールの集まりです。bash, find, grep, awk, sedほか - 7zip
zip, tar等のアーカイブ形式, gzip, bzip2, 7zip等の圧縮形式に対応したツール - NetBeans JPA Modelerプラグイン
- FreeMind
マインドマップツール - WinMerge
ファイル・ディレクトリの比較ツールで、3wayマージ機能を持つのでバージョン管理ツールから外部マージツールとして呼び出すようにすると快適 - SourceTree/ Fork などのGit GUIツール
構築手順¶
開発者PCへの開発環境構築手順¶
開発者用PC(Linux OS 64bit版)とし、インストール作業はインターネット接続ができる状況で実施します。
Java SE Development Kit 8のインストール¶
- JDK 8セットアップ のWindows 64bit用に沿ってインストールします。
NetBeans IDEのインストール¶
NetBeans IDE 8.2のインストール手順(公式、日本語) に沿ってインストールします。
インストールにあたっての補足事項を次に示します。
- 「インストーラのダウンロードオプション」は、"Java SE"とします(ダウンロードファイル名:netbeans-8.2-javase-windows.exe)。
- インストール途中で、JUnitをインストールするかどうか問われるのでインストールするを選択します。
ソースファイルの文字コード、インデント設定、自動整形設定などのNetBeansの設定については、別途プロジェクト共通設定として配布します。
NetBeans Checkstyleプラグイン(Checkstyle Beans)¶
- NetBeans Checkstyleに沿ってインストールします。
Checkstyleに設定するルールは、別途プロジェクト共通設定として配布します。
NetBeans PMDプラグイン(EasyPMD)¶
- NetBeans PMDに沿ってインストールします。
PMDに設定するルールは、別途プロジェクト共通設定として配布します。
NetBeans FindBugsプラグイン(FindBugs Integration)¶
- NetBeans FindBugsに沿ってインストールします。
FindBugsに設定するルールは、別途プロジェクト共通設定として配布します。
NetBeans JaCoCoプラグイン¶
- NetBeans JaCoCoに沿ってインストールします。
SQLite3のインストール¶
T.B.D.
JMockitのインストール¶
Windows MSI形式のインストーラを実行してインストールします。
- attachment:"jmockit-1.8-x64.msi"
NetBeansのライブラリ設定は、別途プロジェクト共通設定として配布します。
Webブラウザ¶
Redmine利用時に、画像をクリップボードから直接添付ファイルとして貼り付ける機能をRedmineに用意していますが、対応ブラウザがFirefoxかChromeに限られます。そこで、FirefoxかChromeをインストールします。