Javaプロジェクトを１から作る（FWなし）

# はじめに
Java に触り始めて早5年、そこそこの期間が経ったわけですが基本的に保守開発がメインであるため、新規にプロジェクトを作るなどはあまり行ってきませんでした。また、自己学習で多少手は動かしてきたものの、アウトプットをしてこなかったこともあり、久々になにか作ろうか、となっても、１から調べ直しながら進めています。

わからないことは調べて理解できるのであれば頭に残す必要はないと考えていまして、これまでもこれからもその価値観は変わらないと思うのですが、流石にここまで Java に触れてきて、インフラ周りはともかく java プロジェクトの立ち上げすらサクッとできないのはちょっとなぁと。

重い腰を上げて、１から調べたことをこちらにアウトプットしていけたらと。
※今回はプロジェクト作成記事の初回ということで、細かい用語も説明していけたらと。

## 環境

OS: macOS Catalina version10.15.7
メモリ: 8GB
Java Version: 11
IDE: eclipse 2020-12 M1（日本語化済み）

今回はフレームワーク(FW)は使用しない方向で。

# 本題

## プロジェクトの立ち上げ

ファイル > 新規 > Javaプロジェクト を選択
![スクリーンショット 2022-09-23 10.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/a1f7b5c7-2679-7819-2acc-76cd943666e3.png)

プロジェクト名には好きな名称を。命名規則がある場合はそれに従う
その他は画面の通りで良い。「完了」を押下
※「実行環境 JRE の使用：」については、パスの通っている Java がデフォルトで設定されているため、各々の環境によりデフォルト値が違うかも

![スクリーンショット 2022-09-23 10.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/1b778f9e-853b-25c7-9df0-d31288586b94.png)

「作成」を押下
※「module-info.java」は [Java9 から追加された機能](https://java-code.jp/1302)だとか。使ったことはないが、とりあえず作成しておく


![スクリーンショット 2022-09-23 10.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/175022d5-895a-c5e0-2214-7c7e3a8c77cd.png)

プロジェクトが出来上がる
![スクリーンショット 2022-09-23 10.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/811ae419-09e2-20aa-7adf-99b5c3159ac3.png)

## ディレクトリ構成

既に出来上がっているものばかり触ってきたのであまり考えてこなかったが、あるあるとその理由を調べていく

### フォルダ作成方法

フォルダ作成をしたい箇所を右クリック > 新規 > フォルダー
※src 配下のみパッケージを選択。理由は後述
![スクリーンショット 2022-09-23 11.15.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/ab157c41-de1d-20db-3325-8efa735b5e71.png)

フォルダ名を入力し、「完了」を押下
![スクリーンショット 2022-09-23 11.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/5e2f6926-1e7e-22ba-0516-201e57791a19.png)

![スクリーンショット 2022-09-23 11.23.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/0e6b5bed-486d-16d1-2c77-4d000ba96adb.png)

### project 配下のあるあるフォルダ

**・src**
プロジェクトを作ると最初からいるやつ
SourceCode の略
その名の通りソースコードはこちらの中に記載

**・lib**
library の略
library の jar ファイルを配置する

**・batch**
bat ファイルを配置する
バッチシステムでない場合は基本的に使われない
「bin」という名前で運用されることも

**・web**
web 系のファイル、つまり html や css、 images(画像ファイル)など
当然 web 系のシステムでなければ使われない

**・classes**
class ファイルを配置する
ただ経験上、明示的に作ることはなく、ビルド時に勝手に作られるものという印象
そもそも作っておいてもビルドしなければ配置するものもないので、多分この認識であっているはず

※他にもあると思うので、見かけたら追記

### パッケージ作成方法

誰もが気になる、パッケージとフォルダの違いとはなんぞや
[こちら](https://teratail.com/questions/191725)のベストアンサーが凄いスッキリした
>基本的にはパッケージとフォルダは、ほぼ同じという理解でよいです。
>eclipseでいうと、ソースディレクトリ配下にフォルダをつくれば、それはパッケージです。
>ソースフォルダでない場所のフォルダは、パッケージではありません（と理解してよいです）
>
>>Eclipse上、「新規→Java→パッケージ」を選べばいいのでしょうか。それとも「新規→一般→フォルダ」を選べばいいのでしょうか
>
>どちらでも同じです。
>作った場所により「フォルダでありパッケージ」、「フォルダ」の扱いになります。
>慣れていないなら「新規→Java→パッケージ」のほうが良いかと思います。

というわけで、src 配下についてはパッケージ作成で進めてみる
src を右クリックし、新規 > パッケージ

![スクリーンショット 2022-09-23 11.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/633df2ae-48ca-8af3-704f-77b107f59ad3.png)

「名前」部分にパッケージ名を記載して「完了」を押下
![スクリーンショット 2022-09-23 12.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/4d5c77aa-117b-cbbc-b005-cfd4826bbea4.png)

※一気に複数のパッケージを作ることも可能
![スクリーンショット 2022-09-23 12.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/59d467ed-edea-9f2b-a89f-82d6874cfea0.png)
![スクリーンショット 2022-09-23 12.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/16c90ed0-87af-6653-2e89-4ecb18bfdc29.png)

※パッと見少し分かりづらいので補足すると、これで複数階層のパッケージが出来上がっている
以下は src/main/java/jp/co の配下と、src/main/java/jp/co/service の配下にファイルを配置した際の表示
![スクリーンショット 2022-09-23 12.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/e5738b0a-54d3-9710-bcb3-b4d229616eb8.png)


### src 配下のあるある構成

例えばこんな感じ
![スクリーンショット 2022-09-23 13.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/86bdb053-64c6-2acc-ad38-ad75b3a10940.png)

それぞれどんな役割かをかんたんに解説

**・main**
名前通りメインとなるパッケージ
基本的にはこのパッケージ配下にソースコードを配置する

**・tst**
テストコードを配置する
main 配下のパッケージと同じ構成にし、テストしたいソースコードと同じ階層にテストクラスを配置する

**・properties**
例えば定数定義がされたファイルを配置したり、ログ設定ファイルを配置したり
設定に関わるものがここに配置される

**・resource**
ソースコード以外のテキストファイルや Excel ファイルなどを配置する

**・java**
言語名をディレクトリ名にする。
もし Java しか使用していないプロジェクトなのであれば特になくても問題ない

そして一番の謎だと思う、これ
**・/jp/co**

これの配下にある **service** や **bean** はファイルごとの役割に分けているというのは一目瞭然なのでわかるとして、そこに至るまでの階層ってどう決められているのかがずっと謎だった。
まず前提として、**システムがパッケージ名のせいで動かない**、みたいなものではないようです。
あくまでパッケージ名は自由です。

で、じゃあ **/jp/co** を始めとした、main(java) から service などに至るまでの階層ってどういうふうに決められているのかというと、**ドメイン名を逆から読んだもの**というのがあるあるの命名規則だそうです。

例えばこの **Qiita** で言えばドメイン名が「qiita.com」なので、これで Java 開発をするときのパッケージ階層としては **main/java/com/qiita** になるということ。

なぜドメイン名の逆読みなのか、というところは残念ながら特に見つからず…
結局はどんなパッケージ階層でも問題がないことは変わらないので、個人開発の際はあまり深いことは考えなくても良いのかなと。


## ライブラリの追加方法

ライブラリは開発をすすめる上で切っても切り離せないもの。見ていきましょう。
まずは前述の lib フォルダに何かしらのライブラリを入れましょう。
今回は **SLF4J** と呼ばれるログに関するライブラリを追加します。
![スクリーンショット 2022-09-25 17.52.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/0dc4a198-1c60-53ec-98be-1dc0a3bfb42d.png)

プロジェクトを右クリックし「プロパティ」を押下
![スクリーンショット 2022-09-25 17.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/707f86b4-7a8d-4770-fc5c-f9383122167d.png)

左枠の「Javaのビルド・パス」 > タブの「ライブラリー」 > 画面中央の「モジュールパス」 >
右枠の「JAR の追加」を押下
![スクリーンショット 2022-09-25 17.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/39422dd4-e7eb-fe60-97fd-d4206f275c6a.png)

lib フォルダの中の、先程格納した jar ファイルを選択し、「OK」を押下
![スクリーンショット 2022-09-25 17.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/7deac7a6-f91f-273a-abd9-fcf1cd85e181.png)

以下の画面に戻り、追加したライブラリの表記が追加されていればOK
画面右下の「適用して閉じる」を押下
![スクリーンショット 2022-09-25 18.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/4ea31323-2ef7-b7b0-b59b-06b8beffacdd.png)

プロジェクト直下に「参照ライブラリー」というものが追加されており、その直下に追加した jar ファイルがあればOK！
![スクリーンショット 2022-09-25 18.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/63b85066-d076-1b0c-a558-1c1aab247dd6.png)

### おまけ：JARファイルって何？

「**Java ARchive**」を略して **Jar** ファイルと呼びます。
ざっくり言えば Java の class ファイル（実行可能なファイル）を zip 化したものになります。
つまりライブラリというのは Java で出来たソースコードというわけですね（もちろん Java におけるライブラリは、という話で、python のライブラリは python で出来ています）
上記の作業はその jar ファイルを解凍し、通常の java ファイルから参照できるようにする手順というわけです。

また jar ファイルは全てライブラリなのかというとそうではありません。
【Java ライブラリ ≒ jar ファイル】のように見えるのは確かですが、【jar ファイル = ライブラリ】でないことは注意です。


## プロジェクトを固め、実行可能なファイルにする

今回は上記で作成したプロジェクトから「実行可能な jar ファイル」を作成しようと思います。
「パッケージ・エクスプローラー」の該当プロジェクトを左クリック > エクスポート を押下
![スクリーンショット 2022-09-28 10.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/5ed3bd71-cbbe-f720-5cfa-93e5015bb51c.png)

Java > 実行可能JARファイル を選択し、「次へ」を押下
![スクリーンショット 2022-09-28 10.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/a9bf0116-6909-2bf5-f5cc-61e6e329d829.png)

jar ファイル実行時にメインクラスとして動いてほしいクラスを「起動構成」に設定
「エクスポート先」はその名の通り、jar ファイルの出力先を指定（今回はデスクトップを指定）
ほかはそのままでOK、「完了」を押下
![スクリーンショット 2022-09-28 10.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/c11ac85d-32cf-710f-1250-f97e98a286b6.png)

先程指定したデスクトップに jar ファイルが生成されていることを確認
![スクリーンショット 2022-09-28 10.50.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/0e57fc30-5fd6-e045-53db-669d65a04eb0.png)

## 実行可能な jar ファイルの実行

せっかく作ったので、jar　ファイルを実行してみましょう。
コマンドとしては簡単で、以下でOK
```
java -jar ******.jar 
```
今回私が作ったプロジェクトは色々クラスを用意しましたが、メインクラスに指定したクラスは「Hello World」を出力する処理だけを持っています。実行すればコンソールに出力されるはず。
![スクリーンショット 2022-09-28 10.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269525/c815be6b-0a48-4554-1289-3990eaa8cd94.png)
大丈夫そうですね！


### おまけ：コンパイルやビルドって何？

**・コンパイル**
java ファイルから実行可能なバイナリファイルを作成すること。
バイナリファイルと呼ぶとよくわからないと感じるかもですが、要は class ファイルのこと

**・リンカ**
調べると以下の通り
>コンパイルしたオブジェクトファイルやライブラリを、アプリとして動作させるために関連付けを実施する
>作成したコードや各種ファイルをリンクして、システムを動かせるような実行ファイルを作成する

正直いまいちピンと来ていないのだが…
後述のビルドのことを考えると、class ファイルなどのバイナリファイルを jar ファイルなどに固める、というのが具体な動作例っぽい？

**・ビルド**
複数のオブジェクトファイル（javaファイル）を一つの実行ファイルにまとめる、だそう。
もっと細かくすると、オブジェクトファイルを実行可能な状態にし、さらにそれらを一つの実行ファイルにまとめる。
つまるところ **【コンパイル + リンカ】**  が **"ビルド"** という認識で良さそう。
また、ビルドすることで出来上がるものというのが前述の jar ファイルのようなものという感じっぽいか。

**・デプロイ**
ビルドされた実行ファイルをサーバー上に展開し、作成したプログラムを実際に利用できるようにする。
具体例で言えば、先程 jar ファイルを実行しましたね。これが **"デプロイ"** という認識でいいはず
 ```
java -jar ****.jar
```

**・リリース**
作成したアプリケーションを閲覧だったり、利用できるように公開すること
デプロイと混同されがちだが、これもビルドの表現に近く、
「アプリケーションを閲覧、利用できる要するための一連の作業」を **"リリース"** と呼称する。
つまり **"デプロイ"** も内包しているわけですね。そんなイメージでいいはず。



ただ、ここまで記載してきてなんですが、上記に記載した通りの意味でどのプロジェクトでも通じるかというとそんなことはなかったりします。特に保守開発においては。
何故なら、既に開発済みのプロジェクトにおいて保守開発をする場合、そうした知識がなくてもなんとかなったりします。
大体ビルドやリリースの手順というのはドキュメント化されていることが多いため[^1] 、割と意識しなくてもなんとかなるのですね（経験談）
そのため、新たに着任した現場ではその現場の表現だったりを理解することが重要です。
覚えた知識に固執しすぎず、柔軟に立ち回りましょう。



# 〆

次はどうしようか…FWを使用した際のプロジェクト作成手順か、ビルドツールについてとかかなぁ。
やっぱりアウトプットすると頭にスッと入ってきますね。今後も継続していきたい。
割とざっくり認識で記載していますが、明らかにここおかしいよ！というのがあればご指摘いただけると助かります。


[^1]: 悲しいかな、一部プロジェクトを除く…