Open23

Java のパッケージングの調査

PaalonPaalon

Java 周辺の用語は名称がコロコロ変わったりして分かりにくいので頑張ってまとめて把握を試みる。

PaalonPaalon

Wikipedia によれば、Jakarta EE とは Java Platform, Enterprise Edition (Java EE) や Java 2 Platform, Enterprise Edition (J2EE) と過去に呼ばれていたものである。

  1. Wikipedia, Jakarta EE
PaalonPaalon

Wikipedia によれば、OpenJDK は Java Platform, Standard Edition (Java SE) の自由かつオープンソースの実装である。

  1. Wikipedia, OpenJDK
PaalonPaalon

Red Hat によれば、JDK は Java Platform, Standard Edition Development Kit であり、プログラミング言語 Java を使ってアプリケーションを開発するための開発環境である。また、OpenJDK と Oracle JDK はそれぞれ Java Development Kit として知られるソフトウェアかつ仕様の集合である。また OpenJDK はオープンソースであるが、Oracle JDK はプロプライエタリーである。

  1. Red Hat, OpenJDK vs. Oracle JDK
PaalonPaalon

Oracle によると、Java Platform, Standard Edition 8 は Java プラットフォームの名前で、その短縮形は Java SE 8 である。Java SE 8 の実装が Java SE Development Kit 8 であり、その短縮形が JDK 8 である。同じく Java SE 8 の実装が Java SE Runtime Environment 8 であり、その短縮形が JRE8 である。

  1. Java Platform, Standard Edition 8の名前とバージョン
PaalonPaalon

とりあえず、Homebrew で OpenJDK はインストールした。

$ java --version
openjdk 23 2024-09-17
OpenJDK Runtime Environment Homebrew (build 23)
OpenJDK 64-Bit Server VM Homebrew (build 23, mixed mode, sharing)
PaalonPaalon

Spring Boot の公式サイトの初心者向けの初め方のサイトを見たら、Gradle を使っていたので、Gradle から始める。

PaalonPaalon

Gradle を使うには Java JDK version 8 以降が必要であると書いてある。インストールする方法には

  • パッケージマネージャーを使う
    • SDKMAN!
    • Homebrew
  • 手動

があるようだ。パッケージマネージャーを使いたいが SDKMAN! と Homebrew のどっちがいいのか分からない。

  1. Gradle Build Tool, Installation
PaalonPaalon

SDKMAN! の方が上に書いてあるからそっちの方がおすすめなんだろうということで、そっちを試す。

PaalonPaalon

SDKMAN! の公式ページのトップ画面に書かれているワンライナーを実行する。

curl -s "https://get.sdkman.io" | bash
Set version to 5.18.2 ...
Set native version to 0.4.6 ...
Attempt update of login bash profile on OSX...
Added sdkman init snippet to /Users/paalon/.bash_profile
Attempt update of zsh profile...
Updated existing /Users/paalon/.zshrc



All done!


You are subscribed to the STABLE channel.

Please open a new terminal, or run the following in the existing one:

    source "/Users/paalon/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!

なんか表示された内容的に Fish に対応してなさそう。

PaalonPaalon

頑張っていじったら Fish でも使えるようになりそうだが面倒くさそうなのでやめる。SDKMAN! をアンインストールした。

PaalonPaalon

Homebrew で入れることにする。

brew install gradle
PaalonPaalon

プロジェクトを作る。

mkdir gradle-tutorial
cd gradle-tutorial

設定ファイルは Groovy ベースか Kotlin ベースの二択のようだ。デフォルトだと Groovy だが Kotlin の方が読み書きした経験が多いので Kotlin にしておく。なんか色々聞かれるが全部デフォルトで。

$ gradle init --type java-application  --dsl kotlin

Enter target Java version (min: 7, default: 21):

Project name (default: gradle-tutorial):

Select application structure:
  1: Single application project
  2: Application and library project
Enter selection (default: Single application project) [1..2]

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]


> Task :init
Learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.10.2/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 2m 35s
1 actionable task: 1 executed

こんな感じ。

$ tree .
.
├── app
│   ├── build.gradle.kts
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── org
│       │   │       └── example
│       │   │           └── App.java
│       │   └── resources
│       └── test
│           ├── java
│           │   └── org
│           │       └── example
│           │           └── AppTest.java
│           └── resources
├── gradle
│   ├── libs.versions.toml
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts

15 directories, 9 files

Gradle wrapper を実行することでビルドの環境依存性を小さくする策のようだ。./gradlew が macOS と Linux 用の実行ファイルで、./gradlew.bat が Windows 用の実行ファイルのようだ。

PaalonPaalon

ビルドする。

$ ./gradlew build
Downloading https://services.gradle.org/distributions/gradle-8.10.2-bin.zip
.............10%.............20%.............30%.............40%.............50%.............60%.............70%.............80%.............90%.............100%

BUILD SUCCESSFUL in 2m 16s
7 actionable tasks: 7 executed
$ tree .
.
├── app
│   ├── build
│   │   ├── classes
│   │   │   └── java
│   │   │       ├── main
│   │   │       │   └── org
│   │   │       │       └── example
│   │   │       │           └── App.class
│   │   │       └── test
│   │   │           └── org
│   │   │               └── example
│   │   │                   └── AppTest.class
│   │   ├── distributions
│   │   │   ├── app.tar
│   │   │   └── app.zip
│   │   ├── generated
│   │   │   └── sources
│   │   │       ├── annotationProcessor
│   │   │       │   └── java
│   │   │       │       ├── main
│   │   │       │       └── test
│   │   │       └── headers
│   │   │           └── java
│   │   │               ├── main
│   │   │               └── test
│   │   ├── libs
│   │   │   └── app.jar
│   │   ├── reports
│   │   │   └── tests
│   │   │       └── test
│   │   │           ├── classes
│   │   │           │   └── org.example.AppTest.html
│   │   │           ├── css
│   │   │           │   ├── base-style.css
│   │   │           │   └── style.css
│   │   │           ├── index.html
│   │   │           ├── js
│   │   │           │   └── report.js
│   │   │           └── packages
│   │   │               └── org.example.html
│   │   ├── scripts
│   │   │   ├── app
│   │   │   └── app.bat
│   │   ├── test-results
│   │   │   └── test
│   │   │       ├── TEST-org.example.AppTest.xml
│   │   │       └── binary
│   │   │           ├── output.bin
│   │   │           ├── output.bin.idx
│   │   │           └── results.bin
│   │   └── tmp
│   │       ├── compileJava
│   │       │   └── previous-compilation-data.bin
│   │       ├── compileTestJava
│   │       │   └── previous-compilation-data.bin
│   │       ├── jar
│   │       │   └── MANIFEST.MF
│   │       └── test
│   ├── build.gradle.kts
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── org
│       │   │       └── example
│       │   │           └── App.java
│       │   └── resources
│       └── test
│           ├── java
│           │   └── org
│           │       └── example
│           │           └── AppTest.java
│           └── resources
├── gradle
│   ├── libs.versions.toml
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts

52 directories, 29 files
PaalonPaalon

なんか色々コマンドを実行してみる。

$ ./gradlew tasks

> Task :tasks

------------------------------------------------------------
Tasks runnable from root project 'gradle-tutorial'
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the classes of the 'main' feature.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
updateDaemonJvm - Generates or updates the Gradle Daemon JVM criteria.
wrapper - Generates Gradle wrapper files.

Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the 'main' feature.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle-tutorial'.
dependencies - Displays all dependencies declared in root project 'gradle-tutorial'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle-tutorial'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
kotlinDslAccessorsReport - Prints the Kotlin code for accessing the currently available project extensions and conventions.
outgoingVariants - Displays the outgoing variants of root project 'gradle-tutorial'.
projects - Displays the sub-projects of root project 'gradle-tutorial'.
properties - Displays the properties of root project 'gradle-tutorial'.
resolvableConfigurations - Displays the configurations that can be resolved in root project 'gradle-tutorial'.
tasks - Displays the tasks runnable from root project 'gradle-tutorial' (some of the displayed tasks may belong to subprojects).

Verification tasks
------------------
check - Runs all checks.
test - Runs the test suite.

To see all tasks and more detail, run gradlew tasks --all

To see more detail about a task, run gradlew help --task <task>

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
$ ./gradlew jar

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 up-to-date
$ ./gradlew run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date
PaalonPaalon

Gradle プロジェクトの名前は lowercase でハイフンで繋ぐことが推奨されている。そのプロジェクト名は settings.gradle.ktsrootProject.name に設定する。app/build.gradle.ktsapplicationmainClass に実行するメインクラスを設定する。app/src/main/java 以下に Java の命名規則に従ってディレクトリーとソースファイルを配置する。