AtCoderで使用するJavaのMakefileテンプレート(Windows)

##AtCoderで使用するJavaのMakefileテンプレート(Windows)

Atcoder用なのでデフォルトパッケージです。
環境は、Windows OS
AIでひな形を作成し修正しました。

テストの方法
```
oj test -c "java.exe -classpath .\release Main" -d ./test
```


テストの方法は、javaファイルを直接実行する方法もあります。
```
oj test -c "java.exe Main.java" -d ./test
```

提出方法
```
acc submit Main.java -- -l 5005
```
5005 (Java (OpenJDK 17))
5009 (JavaScript (Node.js 18.16.1))
5010 (JavaScript (Deno 1.35.1))


###Makefile
デバッグビルド用の出力ディレクトリ   .\debug
リリースビルド用の出力ディレクトリ   .\release
となっています。

```
# Java用Makefile（Windows環境用）

# コンパイラ
JC = javac.exe
# Java実行環境
JVM = java.exe
# Javaデバッガ
JDB = jdb.exe

# javac コンパイルオプション
DEBUG_FLAGS = -g -encoding utf-8
DEBUG_FLAGS += -Xlint -deprecation -parameters
DEBUG_FLAGS += -verbose
#DEBUG_FLAGS += --enable-preview --source 21

RELEASE_FLAGS = -encoding utf-8
RELEASE_FLAGS += -Xlint -deprecation -parameters
#RELEASE_FLAGS += -verbose
#RELEASE_FLAGS += --enable-preview --source 21

# java 実行時オプション
DEBUG_EXE_FLAGS = -Dfile.encoding=utf-8 -showversion -verbose:gc -enableassertions 
#DEBUG_EXE_FLAGS += --enable-preview

RELEASE_EXE_FLAGS = -Dfile.encoding=utf-8 -showversion -verbose:gc
#RELEASE_EXE_FLAGS += --enable-preview

# ソースファイルのディレクトリ
SRCDIR = .
#SRCDIR = src
# クラスファイルの出力ディレクトリ
BINDIR = .
#BINDIR = bin
# デバッグビルド用の出力ディレクトリ
DEBUGDIR = $(BINDIR)\debug
# リリースビルド用の出力ディレクトリ
RELEASEDIR = $(BINDIR)\release

# メインクラス（実行するクラス）
MAIN = Main
# パッケージ名（必要に応じて変更）
PACKAGE = 

# ソースファイル
SOURCES = $(wildcard $(SRCDIR)/*.java)
# クラスファイル（デバッグ用）
DEBUG_CLASSES = $(patsubst $(SRCDIR)/%.java,$(DEBUGDIR)/%.class,$(SOURCES))
# クラスファイル（リリース用）
RELEASE_CLASSES = $(patsubst $(SRCDIR)/%.java,$(RELEASEDIR)/%.class,$(SOURCES))

# JARファイル名
JARFILE = $(MAIN).jar

# デフォルトターゲット
all: version release checkstyle

# デバッグビルド
debug: $(DEBUG_CLASSES)

# リリースビルド
release: $(RELEASE_CLASSES)

# デバッグ用クラスファイルのコンパイルルール
$(DEBUGDIR)/%.class: $(SRCDIR)/%.java
	@if not exist $(DEBUGDIR) mkdir $(DEBUGDIR)
	$(JC) $(DEBUG_FLAGS) -d $(DEBUGDIR) $<

# リリース用クラスファイルのコンパイルルール
$(RELEASEDIR)/%.class: $(SRCDIR)/%.java
	@if not exist $(RELEASEDIR) mkdir $(RELEASEDIR)
	$(JC) $(RELEASE_FLAGS) -d $(RELEASEDIR) $<

# プログラムの実行（デバッグビルド）
run-debug: $(DEBUG_CLASSES)
	$(JVM) $(DEBUG_EXE_FLAGS) -cp $(DEBUGDIR) $(if $(PACKAGE),$(PACKAGE).)$(MAIN)

# プログラムの実行（リリースビルド）
run-release: $(RELEASE_CLASSES)
	$(JVM) $(RELEASE_EXE_FLAGS) -cp $(RELEASEDIR) $(if $(PACKAGE),$(PACKAGE).)$(MAIN)

# デバッグモードでプログラムを実行
debug-mode: $(DEBUG_CLASSES)
	$(JDB) -sourcepath $(SRCDIR) -classpath $(DEBUGDIR) $(if $(PACKAGE),$(PACKAGE).)$(MAIN)

# JARファイルの作成（リリースビルド）
jar: $(RELEASE_CLASSES)
	@echo Main-Class: $(if $(PACKAGE),$(PACKAGE).)$(MAIN) > manifest.txt
	jar.exe cvfm $(JARFILE) manifest.txt -C $(RELEASEDIR) .
	@del manifest.txt

# JARファイルの実行
runjar: jar
	$(JVM) -jar $(JARFILE)

# クリーンアップ
clean:
	@if exist $(DEBUGDIR) ( \
		rmdir /s /q $(DEBUGDIR) && \
		echo $(DEBUGDIR) directory removed. \
	) else ( \
		echo $(DEBUGDIR) directory does not exist. \
	)
	@if exist $(RELEASEDIR) ( \
		rmdir /s /q $(RELEASEDIR) && \
		echo $(RELEASEDIR) directory removed. \
	) else ( \
		echo $(RELEASEDIR) directory does not exist. \
	)
	@if exist $(JARFILE) ( \
		del $(JARFILE) && \
		echo $(JARFILE) removed. \
	) else ( \
		echo $(JARFILE) does not exist. \
	)
	del out-google.txt
	del out-sun.txt
	del out.txt

#Checkstyle コードのスタイルと品質をチェックするツール
checkstyle:
	-$(JVM) -jar C:\Users\etsuk\bin\checkstyle-10.18.1-all.jar -c /google_checks.xml -o out-google.txt $(MAIN).java
	-$(JVM) -jar C:\Users\etsuk\bin\checkstyle-10.18.1-all.jar -c /sun_checks.xml -o out-sun.txt $(MAIN).java
	-$(JVM) -jar C:\Users\etsuk\bin\checkstyle-10.18.1-all.jar -c C:\Users\etsuk\bin\MyJavaCheckStyle.xml -o out.txt $(MAIN).java

# バージョン情報の表示
version:
	@$(JC) -version
	@$(JVM) -version
	@$(JDB) -version

# ヘルプ
help:
	@echo Available targets:
	@echo   all          : Compile all Java source files in release mode (default)
	@echo   debug        : Compile all Java source files in debug mode
	@echo   release      : Compile all Java source files in release mode
	@echo   run          : Run the compiled Java program (release build)(default)
	@echo   run-debug    : Run the compiled Java program (debug build)
	@echo   run-release  : Run the compiled Java program (release build)
	@echo   debug-mode   : Run the program in debug mode using JDB
	@echo   jar          : Create a JAR file (using release build)
	@echo   runjar       : Run the program from the JAR file
	@echo   clean        : Remove compiled files and JAR
	@echo   version      : Display Java compiler, runtime, and debugger versions
	@echo   help         : Display this help message

# PHONYターゲット
.PHONY: all debug release run-debug run-release debug-mode jar runjar clean version help

# runターゲット（run-releaseのエイリアス）
run: run-release
```