Jarファイルを作ってみたよ

# 概要
jarファイルの作成

# 手順
1. コーディング
1. クラスの作成
1. jarファイルの作成(階層注意)
1. おまけ　レジストリファイルを触ってみた

## コーディング
名前が実行当日になるファイルを作成するプログラム
```java
package pack;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class FileCreater {
    public static void main(String[] args) {
        FileCreater fileCreator = new FileCreater();
        fileCreator.createFileWithDateAndDayOfWeek();
    }

    public void createFileWithDateAndDayOfWeek() {
        // 今日の日付を取得
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        // ファイル名を作成するためのフォーマットを定義
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_E");
        String fileName = dateFormat.format(date) + ".txt";

        // 親ディレクトリのパスを取得
        String parentDirectoryPath = new File(".").getAbsoluteFile().getParent();

        // ファイルを作成
        try {
            File file = new File(parentDirectoryPath, fileName);
            if (file.createNewFile()) {
                System.out.println("ファイルが作成されました: " + file.getName());
            } else {
                System.out.println("ファイルが既に存在しています。");
            }
        } catch (IOException e) {
            System.out.println("エラーが発生しました。");
            e.printStackTrace();
        }
    }
}
```

## クラスの作成
今回のプログラム階層構造
```
User\FileCreator(名前は何でもいい)
|
|
|----jp
|    |----pack(パッケージ宣言するディレクトリ)
|    |     |---- FileCreator.java
|    |     |---- ここにクラスができる
|    |----ここの階層にjarファイルを作ってはいけない！
|----ここにjarファイルを作る(後述)
|----ここにjarファイルから解凍されたMETA-INF/MANIFEST.MFが置かれる(後述)
|----2024_03_08_月.txt(プログラムで作成されたファイル)
```
クラス作成。パッケージ宣言した場合の書き方
```console
javac pack/FileCreater.java
```
一旦挙動を確かめる。上で記述した階層に'FileCreator.class'が作成されてたら次へ
```console
cd jp
java pack.FileCreator
```

## jarファイルの作成
以下コマンドはFileCreatorディレクトリで行う
```console
jar cvf FileCreator.jar
```
コマンドの意味
**c** : 新しいアーカイブを作成することを指定します。
**v** : vオプションは、詳細な出力を表示することを指定します。詳細な情報には、アーカイブに含まれるファイルやディレクトリのリストなどが含まれます。
**f** : アーカイブファイルの名前を指定します。これに続く引数は、作成されるアーカイブファイルの名前です。
上の記述通りにFileCreator.jarが作成されたことを確認

以下コマンドでjarファイルの内容をリストで見ることができる
```console
 jar -tf FileCreator.jar
```
```console
//中身CreateDiaryFile.jar
├── META-INF/
  └── MANIFEST.MF
```

以下コマンドでjarファイルのMETA-INF/MANIFEST.MFを解凍し、編集できるようにする
```console
jar -xf CreateDiaryFile.jar META-INF/MANIFEST.MF
cat META-INF/MANIFEST.MF
```

任意のエディタでMANIFEST.MFを開きMain-Class属性を追加。これをすることでjarファイル実行時どのクラスを見るのかを指定できる。
```
//MANIFEST.MF
//パッケージ名.クラス名と記述する
Main-Class: pack.FileCreator 
```
メイン・マニフェスト属性の追加。ここではクラス作成時指定したパッケージ階層＝jarファイルで指定するメインクラスの階層として記述する
以下コマンドでアーカイブにメインマニフェスト属性を追加
```console
jar -uf CreateDiaryFile.jar META-INF/MANIFEST.MF
```
オプションの意味
**u** : ファイルが存在する場合にのみ更新します。つまり、JARファイルに指定されたファイルが既に存在する場合は、そのファイルを更新します。存在しない場合は新しく追加します。
**f** : 操作するJARファイルを指定します。次の引数（CreateDiaryFile.jar）がJARファイルの名前となります。

これで実行jarファイルを実行するとちゃんとプログラムが走るようになる。はず。

## おまけ
ダブルクリックでJarファイルを実行したい場合、クリックしたときにjava.exeが動くように「関連付け」を行わないといけない。一般的な操作だと「ファイル右クリック→プロパティ→全般」の「プログラム：詳細」クリックで関連付けを行うことができるらしいが、今回はレジストリエディターを編集してみた。検索すると編集方法が乗ってあるので興味があればやってみると勉強になる

## 参考資料
[jarファイル入門](https://qiita.com/hiwm0126/items/1b3c008c21463d78337a)
[Java：「メインクラスを検出およびロードできませんでした」の解決法](https://qiita.com/inahu_ono/items/ddd6985eb02ca694c58c)
[jarファイルyoutube](https://www.youtube.com/watch?v=1YXPMtu8yZY&t=2s)
[jarファイルが実行できない](https://qiita.com/TaikiTkwkbysh/questions/7a5d694b1d5ee9f376ed)