Java
Maven
Eclipse
ワンドロ開発
privateMessenger

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

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

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

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

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

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

Java Projectの新規作成

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

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

ってことでサクッと調査

Mavenとは

参考:Wikipedia -Maven

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

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

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

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

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

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

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

・・・

・・・

・・・・・・

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

ので、mavenの開発元であるApacheで見てきました。
以下胡散臭い和訳。本文参照したい方はこちら(英文)

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
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

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

息つく暇もなくWarningが\コンニチワ/してくる。
なんかビルドパスが通ってないとかなんとか。

2018y06m11d_233946076.jpg
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

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

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

調べてみたところ、pom.xmlのpropertiesアイテムに以下の2つの記述をJREのバージョンと一緒に追加してやればいいらしい。
公式はこちら

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

  2. [Properties]-[Create]をクリックし、入力ダイアログを呼び出す。
    2018y06m12d_012758918.jpg

  3. Name欄にElement名(maven.compiler.sourceにあたるもの)、Value欄に値を設定する。

  4. 反映されたのを確認する。
    2018y06m12d_015329080.jpg

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

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

  1. ProjectExplorerからpom.xmlをダブルクリックし、OverViewを表示させる。
    2018y06m12d_012406231.jpg

  2. window下部の[pom.xml]タブをクリックし、表示を切り替える。
    2018y06m12d_010813521.jpg

  3. propertiesブロックを探し、maven.compiler.sourceとmaven.compiler.targetエレメントを追記する。
    2018y06m12d_015923512.jpg

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

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

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

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

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

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

2018y06m12d_022410249.jpg
画面右側の[Edit]ボタンを押すと・・・

2018y06m12d_022517590.jpg
詳細な設定画面に遷移する。

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

2018y06m12d_023103090.jpg

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

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

無事にエントリーポイントを変更することが出来た。
2018y06m12d_023344212.jpg

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

設定の実体はどこにあるんだろう?と思って色々調べたが中々見つからない。
と思ったらここに記述があった。
どうやらandroidと同じようなマニフェストが存在するようだ。

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


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