Java Eclipseの動的 WebプロジェクトをWebサーバで公開までの道のり ビルドツールとか

Eclipse環境でしか、Javaを動かしたことがないですが(Java講座ではコマンドプロンプトでも動かした)、本番環境にはEclipseなどのような統合開発環境を入れない方が良いとなると、どうするの?

ということで、ビルドツールが必要になってくるようです。IDE統合開発環境)では独自のビルドツールがIDEに組み込まれているようです。

結論としては、ローカル環境のEclipseでwarファイルを作成し、本番環境のアプリケーションサーバー(ここではTomcatのある、/opt/tomcat/webapps)に配置すれば良いようです。

 

⇩  本番環境にデプロイするということについては下記サイトへ

Java製アプリを Eclipse から実行したことしかない新人に「ビルドツールとは?」を説明してみる…そして CI へ - Qiita

前回も載せさせてもらいましたが、今回も。

 

ビルドとは?

そもそも、ビルドツールって何なのさ?というか、Eclipseでも、「ビルドパスの構成」「自動ビルド」とか、ちまたにあふれてた「ビルド」って何なのさ? 

 

ビルド (ソフトウェア)

ソフトウェアビルドbuild)は、ソースコードファイルを独立したソフトウェア生成物に変換するコンピュータ上で実行されるプロセス、またはその結果を指す。

ビルドにおいて最も重要なのはコンパイルプロセスであり、ソースコードファイルを実行ファイルに変換する。

単純なプログラムでは、単一のファイルをコンパイルするだけで済むが、複雑なソフトウェアではソースコードは多数のファイルで構成されており、異なった組み合わせ方をすることで異なったバージョンを生成できる。

コンピュータプログラムのビルドは、一般にビルドツールと呼ばれるプログラムを使い、他のプログラムを制御・統合して行う。

ビルドツールの例としては、makeantmavenSConsなどがある。

ビルドユーティリティは、各種ファイル群を正しい順序でコンパイルリンクする必要がある。また、開発時には何度もビルドを繰り返すが、前回のビルドから何も変更されていないファイルはコンパイルする必要がない(ただし、ヘッダファイルなどの依存関係も考慮する必要がある)。

洗練されたビルドユーティリティは無駄な再コンパイルをしないようにして、ビルドに要する時間を短縮している。

Subversionなどのバージョン管理システムはビルドユーティリティの機能を内蔵している。

さらに複雑なプロセスになると、ビルド中に他のプログラムを使ってコードやデータを生成することもある。

ビルド (ソフトウェア) - Wikipedia

う~ん、とりあえず、Java単独でなく、MySQLとかも使ってる複合的なプロジェクトは、「コンパイル」だけじゃまずいから、「ビルド」 しとけってことですかね?

ビルドの歴史

Wikipediaさんの情報に頼り切ってますが、 

一般に、プログラムはソースファイルをコンパイルしリンクすることで、実行ファイルとなる。ソースファイルが1つしかないなら、それらの作業をコマンドラインから実行するのも簡単だが、ソースファイルが多数存在するプロジェクトでは、正しい順序とオプションで手作業するのは至難の業である。

この問題を解決する手段としてmakeのようなスクリプト言語が登場した。それにより、コンパイルやリンクを正しい順序で行うスクリプトを書くことができる。GNU Makeでは更にソースコードの依存関係を管理でき、変更された部分だけをコンパイルするインクリメンタルビルドが可能になった。

これがビルドの自動化の始まりである。その第一の目的はコンパイラやリンカの呼び出しを自動化することだった。

ビルドプロセスが複雑化するに従い、コンパイラ呼び出しの前後に様々な作業(バージョン管理システムからのチェックアウトや生成した実行ファイルのテスト環境への投入など)を追加するようになった。

ビルド (ソフトウェア) - Wikipedia

「ビルド」の当初の目的は、「コンパイラ」や「リンカ」の呼び出しを自動化することだったようですね。

さらに、ビルドツールは進化し、スクリプトMakefile)自体を生成するものが登場した。これらツールは、頻繁にビルドを行う継続的インテグレーションで特に便利である。

ビルド (ソフトウェア) - Wikipedia

とどまること知らない、時の流れ~、じゃないですが、便利になったようです。

「分散ビルド」なるものも出てきてますが、ビルドツールでも「分散ビルド」ができるものは限られてくるみたいですね。

高度なビルドツールは分散ビルドや分散処理が可能である。「分散ビルド」とは、実際のコンパイルやリンクをそれぞれ別々のマシン上で行い、ビルドを高速化する手法である。

一方、分散処理とは例えば、テスト用スクリプトを複数のマシンに配置し、新たな実行ファイルのテストを分散環境で自動的に行うことなどを指す。

分散ビルドを行うには、ソースコードの依存関係を自動的に把握することが必須である。

一部のビルドツールは依存関係を自動的に発見でき(Ratinal ClearMake、Electric Cloud ElectricAcceleratorなど)、別のビルドツールではユーザーが定義した依存関係のみを扱う(Platform LSF lsmakeなど)。

ソースコードの依存関係を把握できるビルドツールは、コンパイルおよびリンクを並行モードで実行するよう設定できる。すなわち、コンパイラやリンカを複数コアのマシン上でマルチスレッドモードで実行することができる。

全てのビルドツールが分散ビルドを実施できるわけではない。

分散ビルドの例として Xoreax の IncrediBuildがある。

ビルド (ソフトウェア) - Wikipedia

 

というわけで、世の中の流れ的には「ビルドツール」使っていこう、ということなんですかね? 

 

Javaで利用できるビルドツール

Javaで利用できるビルドツールには、

 など、様々なものがあるようです。

継続的インテグレーション

継続的インテグレーションCIcontinuous integration)とは、主にプログラマーアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。

エクストリーム・プログラミング (XP) のプラクティスの一つで、狭義にはビルドテストインスペクションなどを継続的に実行していくことを意味する

特に、1990年代後半以降の開発においては、継続的インテグレーションをサポートするソフトウェアを使用する傾向が強まってきた。

継続的インテグレーション - Wikipedia

「ビルド・テスト・デプロイ」などを自動化し、一日に何度も繰り返す手法のことみたいです。「エクストリーム・プログラミング」は、アジャイルソフトウェア開発の方法論の1つで、刻一刻と変化する顧客の要求に対応しつつ、変更コストが増大しないという前提で開発することらしいです。

エクストリーム・プログラミング」による開発をしている中で、「継続的インテグレーション」は生まれたようです。

Javaで利用できる継続的インテグレーションツール

継続的インテグレーションを実装してくれるツールには、

などがあるようですが、「Jenkins」の生みの親は、「川口耕介」さんという日本の方のようです。 

 

継続的インテグレーションに必要なもの

継続的インテグレーションツール以外にも必要なものがあり、一般的なシステム構成では、

  • フィードバック機能
  • レポート機能

の6つのツール + 2つの機能があると良いようです。 

ローカル環境を本番環境にデプロイするには?

実際には、ローカル環境のEclipseでプロジェクトのwarファイルを作成し、本番環境のTomcat(自分の場合だと、/opt/tomcat/webappsフォルダ)に配置すれば良いみたいです。

で、ローカルにあるwarファイルを本番環境のTomcatにアップするのも、EclipseRSE(Remote Server Explorer)プラグインを導入すれば簡単みたい。 

warファイルを Tomcat上で動作させる - ScalaのようでJavaだけど少しScalaなJSON API - ワルブリックス株式会社

Eclipseでwarファイルを作成し、Tomcatにデプロイする手順 | ITSakura

ローカル環境でプロジェクトをwarファイルに

ローカル環境でEclipseを立ち上げ、「プロジェクト・エクスプローラー」で本番環境にデプロイしたいプロジェクトを選択した状態で右クリックし、「エクスポート(X)」>「WAR ファイル」を選択。

f:id:ts0818:20170830075244j:plain

「宛先(D):」は適当に決めて、一応、「ターゲット・ランタイム(T)」を本番環境に近い「Apache Tomcat v9.0」にして、「完了(F)」を選択。

f:id:ts0818:20170830075245j:plain

「宛先(D):」で指定した先に、warファイルができます。

f:id:ts0818:20170830075246j:plain

 

ローカル環境のEclipseRSE(Remote Server Explorer)プラグインを導入...されてる?

本番環境へファイルをアップしたりするには、GUIツールでWindowsの場合、「ffftp」や「Win SCP」など でできるのですが(自分の体験だとPHPフレームワークとか使ってないのはいけた)、EclipseRSE(Remote Server Explorer)プラグインというものを導入することでもいけるみたいです。

Eclipseからサーバー環境に接続してファイルを直接編集する方法!FTPツール使うより捗りますよ

「ヘルプ(H)」>「新規ソフトウェアのインストール...」を選択。

f:id:ts0818:20170830075247j:plain

「すべての使用可能なサイト」を選択して、むちゃくちゃ待たせられるんですが、

f:id:ts0818:20170830075248j:plain

保留中...の時間が異常に長いでござる。にもかかわらず、

f:id:ts0818:20170830075251j:plain

表示結果のどこにも「Remote System Explorer」なんぞ、見つからんとなり、

f:id:ts0818:20170830075252j:plain

近いのは見つかるも、何か違う。

f:id:ts0818:20170830075253j:plain

 試しに「ヘルプ(H)」>「Eclipse マーケットプレイス(M)...」を選択。

f:id:ts0818:20170830075250j:plain

「検索(I):」で「Remote System Exploere」で検索すると、「インストール済み」となっています!インストールした覚えないよ!

f:id:ts0818:20170830075249j:plain

嫌な予感ですが、Eclipseにデフォルトでインストールされてるってことですかね、そんなん知らんし! 

「ウィンドウ」>「パースペクティブを開く」>「その他」

f:id:ts0818:20170830075254j:plain

 存在しているという!

⇩  こちらの方が記載してくれてました。見つけるのが遅れてハマってしまった

Eclipse でリモート接続をしてみる | DualBalance

f:id:ts0818:20170830075255j:plain

「リモート・システム」の「ローカル」を選択した状態で右クリックし、「新規(A)」>「接続(A)...」を選択。

f:id:ts0818:20170830075256j:plain

Linux」を選択し、「次へ(N)>」をクリック。

f:id:ts0818:20170830075257j:plain

「ホスト名:」にGCPGoogle Cloud Platform)のCompute Engineで作成したVMインスタンスの「外部IP」を指定。「接続名:」などは適当で。「次へ(N)>」をクリック。

f:id:ts0818:20170830173208j:plain

ssh.files」を選択し、「次へ(N)>」をクリック。

f:id:ts0818:20170830075259j:plain

「processes.shell.linux」を選択し、「次へ(N)>」をクリック。

f:id:ts0818:20170830173209j:plain

「sshshells」を選択し、「完了(F)」をクリック。

f:id:ts0818:20170830173210j:plain

 

 

Remote Server Explorer接続設定のためにsshキーの作成

これまで、gcloudというGoogleが用意してくれていたコマンドでssh接続していたわけですが、外部アプリ(Tera Termなど)でssh接続するには、それ用のsshキーを作る必要があります。

Linux インスタンスへの接続  |  Compute Engine ドキュメント

 

というわけで、Windowsの場合は、https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html にアクセスします。

f:id:ts0818:20170830173211j:plain

下の方にスクロールすると、「Alternative binary files」という項目の中に、「puttygem.exe」というリンクがあるので、お使いのPCに合わせ他方を選んでクリックします。(だいたい64bitになるかと)

f:id:ts0818:20170830173212j:plain

ダウンロードされたexeファイルをダブルクリックすると、「PuTTY Key Generator」が起動するので、「Generate」をクリック。

f:id:ts0818:20170830173213j:plain

「Key Comment」のところに、GCPVMインスタンスでgcloudでssh接続していたときに表示されていたユーザー名(「ユーザー名@VMインスタンス名」のところのユーザー名)を入力します。「Key passphrase」はパスワードみたいな感じだと思われますが、適当に入力しておきます。そうしたら、「Save private Key」をクリックして「秘密鍵」を生成します。

f:id:ts0818:20170830173214j:plain

ファイル名は適当に、「ファイルの種類(T):」は、拡張子が「.ppk」にしておきます。保存場所は、「C:¥Users¥ユーザー名¥.ssh」フォルダに保存するのが一般的みたいです。「.ssh」フォルダがない場合は作成しときましょう。

f:id:ts0818:20170830173215j:plain

続いて、「Save public key」をクリックで「公開鍵」を保存します。

f:id:ts0818:20170830173216j:plain

といっても、「公開鍵」は、 GCP側に登録することになるので、とりあえず、テキストで保存しておく感じですかね。

f:id:ts0818:20170830173217j:plain

そしたら、GCPのダッシュボードに戻り、「メタデータ」を選択します。

f:id:ts0818:20170830173218j:plain

SSH 認証鍵」を選択します。

f:id:ts0818:20170830173219j:plain

「編集」を選択します。

f:id:ts0818:20170830173222j:plain

「+ 項目を追加」をクリック。 新しいテキストエリア(「認証鍵全体を入力」)が表示されるので、

f:id:ts0818:20170830173220j:plain

Putty Key Generator」の「Public key for pasting in to OpenSSH authorized_keys file:」という欄の文字列をすべて選択コピーし、

f:id:ts0818:20170830173216j:plain

GCPの、「認証鍵全体を入力」というところに張り付けます。「保存」を選択。

f:id:ts0818:20170830173221j:plain

 

EclipseのRemote Server Explorerで接続...できない

GCP仮想マシンは再起動しといたほうが良いかもです。

Eclipseのリモート接続を試してみる。

f:id:ts0818:20170830173231j:plain

 「ユーザーID:(I)」にGCPVMインスタンスのユーザー名を指定し、「OK」。

f:id:ts0818:20170830173229j:plain

うん、接続できない。

f:id:ts0818:20170830173230j:plain

 

 

EGit(EclipseのGit)のSSH設定 - ひしだまの変更履歴

[Eclipse] Can't sftp to remote server via SSH using RSE in eclipse while on VPN(Cisco AnyConnect) - CodExample

⇧  なんか、Java 8に対応できてないらしい...衝撃。

 

putty.exeで接続できるか試してみます。

 https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html にアクセスします。「putty.exe」のリンクを選択。(64bitで。)

f:id:ts0818:20170830173223j:plain

「Host Name(or IP address)」には、VMインスタンスの「外部IP」だけでいけました。(Google Cloud Platformの公式のチュートリアルだとユーザー名を前に付けるってなってるけど。) 

f:id:ts0818:20170830173232j:plain

「Connection」>「SSH」>「Auth」 で「Private Key file for authentication」で「秘密鍵」を選択します。

f:id:ts0818:20170830173226j:plain

 さっき、「Putty Key Generator」で作成したやつを指定して、「Open」。

f:id:ts0818:20170830173225j:plain

初回のみ警告が出ますが、「はい(Y)」を選択します。

f:id:ts0818:20170901100348j:plain

「login as:」と聞かれるので、「Putty Key Generator」の「Key comment」で入力したもの(GCPVMインスタンスの「ユーザー名」)を入力し、Enter。

その後、「Passphrase for key」と聞かれたら、「Putty Key Generator」の「Key passphrase」を入力し、Enter。すると、GCPVMインスタンス仮想マシン)にログインできます。

f:id:ts0818:20170901100340j:plain

 

接続できたけど、CUIなんですよね。

ちょっと、想像以上にハマってしまったので、次回に持ち越しで。

次回は、Win SCPでGCPVMインスタンスと接続を試みます。もう、GUI接続の希望の星は、それ以外残されてなさそうです。

warファイルはできたんで、あとは本番環境にアップするだけと信じたいです。

それにしても、散々苦労して見つけたEclipseのRemote Server Explorerが使えないとは、超絶ショックですね。便利さを体験したかったんですが。