Java のパッケージングの調査
プログラミング言語 Java のパッケージングを調査する。
環境はオペレーティングシステムが macOS でシェルが Fishである。
Java は初め、Sun Microsystems によって 1995 年に公開されたプログラミング言語かつ計算プラットフォームである。
Sun Microsystems は 2010 年に Oracle に買収された。
Java 周辺の用語は名称がコロコロ変わったりして分かりにくいので頑張ってまとめて把握を試みる。
Oracle によれば、Java SE とは Java Platform, Standard Edition である。他に Java Platform, Enterprise Edition と Java Platform, Micro Edition がある。
Wikipedia によれば、Jakarta EE とは Java Platform, Enterprise Edition (Java EE) や Java 2 Platform, Enterprise Edition (J2EE) と過去に呼ばれていたものである。
Wikipedia によれば、OpenJDK は Java Platform, Standard Edition (Java SE) の自由かつオープンソースの実装である。
Red Hat によれば、JDK は Java Platform, Standard Edition Development Kit であり、プログラミング言語 Java を使ってアプリケーションを開発するための開発環境である。また、OpenJDK と Oracle JDK はそれぞれ Java Development Kit として知られるソフトウェアかつ仕様の集合である。また OpenJDK はオープンソースであるが、Oracle JDK はプロプライエタリーである。
The Java® Language Specification, Java SE 23 Edition の第1章によると、Java programming language は言語であるが、Java がなんであるかについては言及していない。
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 である。
とりあえず、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)
Spring Boot の公式サイトの初心者向けの初め方のサイトを見たら、Gradle を使っていたので、Gradle から始める。
Gradle を使うには Java JDK version 8 以降が必要であると書いてある。インストールする方法には
- パッケージマネージャーを使う
- SDKMAN!
- Homebrew
- 手動
があるようだ。パッケージマネージャーを使いたいが SDKMAN! と Homebrew のどっちがいいのか分からない。
SDKMAN! の方が上に書いてあるからそっちの方がおすすめなんだろうということで、そっちを試す。
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 に対応してなさそう。
Bash と Zsh しか対応してないらしい。
頑張っていじったら Fish でも使えるようになりそうだが面倒くさそうなのでやめる。SDKMAN! をアンインストールした。
Homebrew で入れることにする。
brew install gradle
プロジェクトを作る。
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 用の実行ファイルのようだ。
ビルドする。
$ ./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
なんか色々コマンドを実行してみる。
$ ./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
Gradle プロジェクトの名前は lowercase でハイフンで繋ぐことが推奨されている。そのプロジェクト名は settings.gradle.kts
の rootProject.name
に設定する。app/build.gradle.kts
の application
の mainClass
に実行するメインクラスを設定する。app/src/main/java
以下に Java の命名規則に従ってディレクトリーとソースファイルを配置する。