LAN内通信アプリを作ろう　その１ Mavenを使ったプロジェクトの新規作成とJavaのエントリーポイント

さて、そんなこんなで開発開始。

今回はLAN内で利用するテキスト送受信アプリケーション。

設計･･･と言いたいとこだけど、今回はざっくりユースケースだけでいいかな？

通信と言ってもsocket通信だし、サンプルもたくさんあるでしょ。
大丈夫大丈夫。なんとかなるって（ポジティブ）

今回は言語はJava、通信はTCP/IPで実装予定。
環境はEclipse Oxigen 4.7.3a使っていきます。PCに入れた後ほったらかしてたやつ。
参照ポートは･･まぁ適当にサイコロでも振って決めましょ。


# Java Projectの新規作成

って思ったけどJavaプログラムのスクラッチ開発は初めてだったね。
ま、どんな言語でも癖がちょっと違うだけだし、どうするか調べればなんとかなるなる。


とか思ってたら早速調べ物が。
なんか"Javaのプログラムを作成するときはMavenを使ってプロジェクトを作成するのが一般的"だそうな。
Eclipse君にもしれっと入ってるね、君。
Maven、聞いたことはあるんだけど、これなんじゃろ？

ってことでサクッと調査

## Mavenとは

参考：[Wikipedia -Maven](https://ja.wikipedia.org/wiki/Apache_Maven)

何でもMavenはJava用のプロジェクト管理ツールだそうな。
確かにプロジェクト管理ツールとしてRedMineに並んで名前が挙がってたのは聞いたことがある。
Apache Antの後継ってのは知らなかったけど。っていうかAntってなんかビルドに使ってたイメージしかない。

どうやらそのイメージが完全に違うということは無いらしく、
ビルドツール　兼　ライブラリ管理ツール　兼　Javaプロジェクトの開発テンプレート　兼　テストツール　兼･･･
と、いろんな機能が詰まってる統合開発サポートツールって感じらしい。（Java専門の）

個人的にはJenkinsと連動しやすいって点がすごい気になる。後で調べておこう。

## 概要は分かったから新規作成を･･･

ざっくり分かったから後は都度調べよう。
まずはMavenを利用したプロジェクトの新規作成して･･･


とか思ったらarchetypeを選択しろときた。
Mavenのarchtype…察するにテンプレートみたいなもんかしら？
と思いながら調査継続。

どうやら考え方自体は間違ってないっぽい。
ほほぅ。するってぇと、今回はどれを選べばいいんでぃ？（江戸っ子）

・・・

・・・

・・・・・・

あれ？アーキタイプの日本語の説明が見当たらない。

ので、mavenの開発元であるApacheで見てきました。
以下胡散臭い和訳。本文参照したい方は[こちら(英文)](https://maven.apache.org/guides/introduction/introduction-to-archetypes.html)


|Group ID| Artifact ID | 説明 |
|:-:|:-:|:--|
| org.apache.maven.archtypes | maven-archetype-archetype  | archetypeサンプルのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-j2ee-simple  | 簡素化したJ2EE（エンタープライズ向け）サンプルのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-mojo  | Mavenプラグインサンプルのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-plugin  | Mavenプラグインのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-plugin-site  | Mavenプラグインサイトのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-portlet  | JSR-268規格のポートレットサンプルのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-quickstart  | Mavenプロジェクトサンプルのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-simple  | シンプルなMavenプロジェクトのアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-site  | APT、XDoc、FMLなどの形式をサポートしていて、君のサイトをi18n(多言語対応)する方法をデモンストレートするアーキタイプを生成するよ  |
| org.apache.maven.archtypes| maven-archetype-site-simple  |  Mavenサイトサンプルのアーキタイプを生成するよ |
| org.apache.maven.archtypes| maven-archetype-webapp  | MavenウェブAppサンプルのアーキタイプを生成するよ  |

ふむ。なんかWeb向けのものがやたら多い気がする。
面白そうなので今後ちょっと考えるとして、今回はmaven-archetype-simpleを選択
･･･とか思ったらEclipseに初期登録されてなかった。仕方ないのでmaven-quickstartを選択。
マシン上で動くアプリケーションだからね。サーバは宅内にあるから考えてみてもいいかも。

## 作ったら今度はこれ

で、作ってみたものの
いきなりエラーが出ている。

![2018y06m11d_232932824.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/8594384d-b6d3-d97a-3de0-59a4a7b8f35d.jpeg)
Project configuration is not up-to-date with pom.xml. Select: Maven->Update Project... from the project context menu or use Quick Fix.

### トラブルシューティング Maven Error : Project configuration is not up-to-date

調べてみると、「設定変更などが反映されていない場合に出てくる」とのこと。
”Select: Maven->Update Project... from the project context menu or use Quick Fix.”って言われてもどこ指してるのやら･･･

プロジェクト全体の設定ってことはプロジェクトのルートかな？とか思ってコンテキストメニューを開くとそれっぽい項目が。
[プロジェクトのルートのコンテキストメニュー（右クリック）]-[Maven]-[update Project]を選択するとこんな画面に。
(ショートカットキーがAlt + F5に設定されてたので、せっかちさんはショートカットキーでGO!)

![2018y06m11d_233748877.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/7a8d40bc-a152-5b33-1956-8856acc6efdf.jpeg)

ここでOKを押すと問題なく更新がされました。

息つく暇もなくWarningが\ｺﾝﾆﾁﾜ/してくる。
なんかビルドパスが通ってないとかなんとか。

![2018y06m11d_233946076.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/b33b0be6-0703-72ee-92de-249e1320dfaf.jpeg)
Build path specifies execution environment J2SE-1.5. There are no JREs installed in the workspace that are strictly compatible with this environment. 


### トラブルシューティング Maven warning : build path specifies execution environment 

どうやらjre1.5が指定されていることが問題の様子。
Mavenの初期設定だとjre1.5だものね。
ちなみに自分はjre1.8使ってたので

[JRE System Libraryのコンテキストメニュー（右クリック）]-[Properties]-[System library]の設定を
"Workspace default JRE(jre1.8.0_171)"とすることで無事警告を消すことができました。

![2018y06m11d_235447310.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/eddd95ea-c084-6c8f-0813-f52f29ea3441.jpeg)

警告を消すことは出来たものの、現在の状態ではプロジェクトの更新を書けると再度警告が表示されてしまう状態。
これは若干気持ち悪いので、他の方法も調べてみることに。

要は利用するJavaのバージョンを設定ファイル：pom.xmlに書いてやればいいのよね。

調べてみたところ、pom.xmlのpropertiesアイテムに以下の２つの記述をJREのバージョンと一緒に追加してやればいいらしい。
[公式はこちら](http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html)


| Element | 説明 |
|:-:|:-:|
| maven.compiler.source  | Java compilerのsource引数に設定される値。String型  |
| maven.compiler.target  | Java compilerのtarget引数に設定される値。String型  |

多分javacの-sourceオプションと-targetオプションに相当するんだろう。
(とか思ったら公式のcompilerIdにjavacが指定されてた。)
ちなみに公式の当該項目の値に書いてあるけど、デフォルトは1.5。



ってことで変更手順

#### EclipseのOverViewから変更する方法

1. ProjectExplorerからpom.xmlをダブルクリックし、OverViewを表示させる。
![2018y06m12d_012406231.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/b6121708-bac0-44b7-9e95-29152095aad5.jpeg)

1. [Properties]-[Create]をクリックし、入力ダイアログを呼び出す。
![2018y06m12d_012758918.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/5dd4c278-2be0-221d-6e76-6395f3e8f528.jpeg)

1. Name欄にElement名(maven.compiler.sourceにあたるもの)、Value欄に値を設定する。
1. 反映されたのを確認する。
![2018y06m12d_015329080.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/0c2ab7b1-02ac-6464-3dc3-31003f796c9d.jpeg)

ちなみに自分が使ってるEclipse Oxigen 4.7.3aだと特にオートコンプリート機能とかはなしで手打ちでした。


#### xmlファイルを直接変更する方法

1. ProjectExplorerからpom.xmlをダブルクリックし、OverViewを表示させる。
![2018y06m12d_012406231.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/b6121708-bac0-44b7-9e95-29152095aad5.jpeg)

1. window下部の[pom.xml]タブをクリックし、表示を切り替える。
![2018y06m12d_010813521.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/6f2a065a-c8cf-465e-73af-fc7a1789d28d.jpeg)

1. propertiesブロックを探し、maven.compiler.sourceとmaven.compiler.targetエレメントを追記する。
![2018y06m12d_015923512.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/2166e5da-99c8-4c34-9a51-17b013aec9aa.jpeg)

正直今の状態だと直接書き換えでいい気がする。

## 環境構築は終わったものの･･･エントリーポイントってどうなってるの？

後はゴリゴリ作っていくだけ！･･･なんだけど、気になったのでちょっと調査。
Javaアプリケーションのエントリーポイントってmain()でいいんだっけ？
main()はともかくとして、クラスってどう設定するんだろう？

とか思ったので追加調査。

調べてみると、エントリーポイントがmain()なのは間違いない。
んだけど、クラスを指定する方法が特に記述なし。

大抵こういうのはプロジェクトのプロパティにあるもんよ！とアタリをつけてプロジェクトルートのプロパティを表示。
[Run/Debug Setting]-[Edit]を押すことでアプリの設定画面を開くことが出来る。

![2018y06m12d_022410249.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/3b841910-95f0-1658-58ad-a76ca9900f59.jpeg)
画面右側の[Edit]ボタンを押すと･･･


![2018y06m12d_022517590.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/72956eaa-7277-a65c-c50e-f58164dc4ab9.jpeg)
詳細な設定画面に遷移する。

で、ここのMain classがエントリーポイントの保持クラスを指定してるっぽい。
そこで別のmainメソッドを作って実験してみる。

![2018y06m12d_023103090.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/b82a33cc-dad9-3c28-50af-e887026bbb07.jpeg)

Appに対し、Ppa
Appに存在していたmain()がハローワールドだったので、メッセージを変更。さよならは寂しいのでお休みで。

で、件の設定を変更して実行

無事にエントリーポイントを変更することが出来た。
![2018y06m12d_023344212.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/a9a69df4-05a1-3571-2123-6c18b68c2794.jpeg)

本来mainメソッドを複数書くことは想定していないものの
さっきのRun/Debug Settings、Editはともかく、NewボタンとDuplicateボタンがあったのが気にかかる。
と、思ったら、ここで複数の起動条件を保存しておくことが出来るだけっぽいので割愛。

設定の実体はどこにあるんだろう？と思って色々調べたが中々見つからない。
と思ったら[ここ](https://netbeans.org/kb/docs/java/javase-deploy_ja.html)に記述があった。
どうやらandroidと同じようなマニフェストが存在するようだ。

どうしても気になっちゃったので調査継続。
コンパイルした.classファイルをまとめたjarの中にMETA-INF/MANIFEST.MFが存在していて、そこのMain-Class要素に設定すればいいと。
参考：[とほほのJava入門](http://www.tohoho-web.com/java/other.htm)様、*jarファイルを作る*の項目

---

明日からは製作に入っていく予定。
本日の作業時間は05:15:44也。