java

Javaを知らない俺がモダンなJava開発をめざす

古い情報も多いので意外と情報収集が難しい

選択肢ありすぎワロタ

さすがにHello Worldくらい一瞬でいけると思っていたが、最初の環境選定の時点で選択肢が多すぎて、どの資料を信じればいいのか路頭に迷ってしまった。

2020年に投稿されたYouTube動画を見ても「今でもMakeで根性のビルドを行っているプロジェクトも少なくはない」的なコメントに出会ったりなど、歴史が長いだけあって一言にJavaといっても、その言葉が指す内容は広範だ。

とはいえ、SIerに所属している身として、さすがに「Javaナニモワカラナイ」というのは通用しなさそうなので、重い腰を上げてモダンなJava開発について調べることにした。

JDK、JRE、JVMってなに

Javaを始めようとするとJDKとか意味わからん単語が出てくる。

それぞれ、以下の略。

  • Java Development Kit:Javaの開発環境、JREを含む
  • Java Runtime Environment:Javaの実行環境、JVMを含む
  • Java Virtual Machine:Java仮想マシン

Javaでは、元になるソースコードをJavaバイナリにコンパイルする。このバイナリはプラットフォームに依存せず、JVM上で動作する。JVMは、これらJavaバイナリを各プラットフォームが解釈可能なネイティブコードに変換する役目を担う。

なにはともあれ、Javaで開発したいなら、とりあえずJDKをインストールすればOK。

JDKのバージョン

有象無象の種類があるが、Oracle由来のOpenJDKがメジャーらしい。

サポート方式の違いから、大きくはJava 8とそれ以降に分かれる。

最新はJava 17だが、多くのソフトウェアがJava 8のまま。 Java 8以降はLTSのバージョンが移り変わるため、一度作って長く使いたいタイプのソフトウェアはJava 8を使わざるを得ない状況らしい(間違ってるかも)。

一度作ったらそれ以上のお金はもうかけたくない、継続的かつインクリメンタルな開発など考えられないというケースではLTSのバージョンが切り替わっては困るというワケ。

事業会社の社内システムなんかは大半が外注だろうし、無理もないという感じだ。だからこそDXだ、内製化だ、と叫ばれているいまがある。

中にはJava 8以前のものも少なくないらしいが、モダンなJava開発を志す趣旨から大きく逸れるので、そっちはほとんど調べていない。

Java 8とは言うけれど

これがまた分かりにくいのだが、Java 8はJDKでいうと1.8を指すようだ。

知らねーよ、という感じだがJava 8で書きたいならOpenJDK 1.8をインストールしよう。

今回はモダンを目指すのでインストールするのは最新のOpenJDK 17といきたいところだが、私は競技プログラミングをするのでせっかく学ぶならAtCoderで使えるバージョンが使いたい。

調べると、AtCoderで使えるのはJava 8もしくはJava 11のみのようだ。残念だが、ここはJava 11を使うことにする。

JDKのインストール

仕事ではWindows、プライベートではMacを使うのだが、往々にしてWindowsのほうが環境構築は複雑になるので、Windowsについて記載していく。

さすがにWindowsホスト上で開発をする気にはならないので、JavaそのものはWSL2にインストールすることにする。

JDKはaptで入れることもできるが、私はHomebrewを使用した。

brew install openjdk@11

Homebrewでインストールすると、パスを通すように言われるので通しておく。

私の環境では/home/linuxbrew/.linuxbrew/opt/openjdk@11/binに通した。

IDEいろいろありすぎ

次にIDEの選定だ。

  • Eclipse
  • IntelliJ IDEA
  • NetBeans
  • VSCode

などがあるようで、古いプロジェクトではEclipseが多数派だが、モダンなデファクトはIntelliJらしい。

VimmerとしてはVSCodeNeoVimすらない環境で文字入力ができるのか不安な気持ちがあったが、郷に入っては郷に従えでIntelliJをチョイスした。

ちょっと使ってみたが、アノテーションを書くと勝手にimport文を書いてくれたりしてスゲー便利な感じ。

IntelliJの設定

プロジェクトを開いたら、File > Project Structure > Project Settings > Project > Project SDKでWSL上のJDKを指定しておく。今回だと11 (WSL)を選ぶことになる。

※私の場合は選択肢に11 (WSL)がなかったので、Add JDKから\\wsl$\Ubuntu-20.04\home\linuxbrew\.linuxbrew\Cellar\openjdk@11\11.0.12\libexecを追加した。

さらに、File > Settings > Build, Execution, Deployment > Build Tools > GradleからGradle JVM11 (WSL)を設定する。

ビルドツールの選定

さらっとGradleを設定したが、ビルドツールのデファクトはMavenらしい。

ただし、Gradleのほうが新しく、機能面でも優れており、だんだんと人気が増しているとのことなので今回はGradleをチョイスした。

ちなみに、大昔はMakeで、一昔前はAntというのがデファクトだったらしい。Antというのは聞いたこともなかったが、これから触れる意味はあまりなさそうなので今回はスルーした。

アノテーションまみれで長ったらしいコード

Javaが好きな人に言ったら怒られるかもしれないが、Javaのコードを見ると、とにかく長ったらしくてゴチャゴチャしているし、そこら中によくわからないアノテーションが付きまくっていて、プロジェクトのディレクトリも無駄に深かったりと、面倒そうな印象がある。

まあ、そんなこと言ったら、PythonもRustもHaskellも初見ではクソ意味わからない見た目をしているので、単純にJavaを知らなさすぎるというだけなんだろう。

さて、このまま書いてもいいが、いかんせん長くなってきたので、実際のコーディングについては記事を分けようと思う。

とりあえず、環境構築はこんなところで。