プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

jbangがJavaの初学者にめっちゃ便利な件について

 jbangという、Java をスクリプト言語のように実行できるツールを知りました。

 これ、プログラミング初心者が Java を学び始めるのにとても有用だと思います。

  • JDKのインストールが不要
    • 準備が大体コピペだけですむ
  • コンパイルせずに、.javaファイルを直接実行可能
  • Gradle (ANT, Maven) が無くても外部依存関係を解決できる

 とても良い感じです。

 初心者にいきなりコンパイル→実行をさせたり、もしくはIDEを使わせるというのは、結構ハードルが高いと思います。 たださえ、意味の分からないことをやらされているのに、いきなり意味不明なコンパイルを挟まないと実行できないとか、大量のボタンと画面が殴りかかってくる恐怖のIDEとか、乗り越えるのも嫌になるでしょう。

 我々からすれば「その程度のこと」ですが、割と「その程度のこと」で躓く物です。

 JShellは初心者にとても良いと思いますが、 外部依存関係は解決できません。 jbangはその点が非常に優れていると思います。

 

何も準備せずに Hello World を動かしてみた

 Javaの入っていない Windows 10 環境を用意しました。java も javac も入っていません。

f:id:nodamushi:20201012214910p:plain:w320

 作業ディレクトリとして、デスクトップに jbang を配置。

f:id:nodamushi:20201012220113p:plain:w320

 次に PowerShellを起動します。

 なお、PowerShellを開く/触るという行為は、初心者には拒絶されるレベルで、ハードルが高いです。みなさん、頑張って下さい。

 「Shift + 右クリック」をすると 「PowerShell ウィンドウをここで開く」が出るのでこれをクリックします。

  f:id:nodamushi:20201012220243p:plain:w320

 

 PowerShellが開いたら、以下をおもむろにコピーして、PowerShellに貼り付けます。

 なお、Scoopがすでに入ってる場合は、3行目からでOK。gitがすでに入っている場合は、3行目はスキップ可能。

Set-ExecutionPolicy RemoteSigned -scope CurrentUser
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
scoop install git
scoop bucket add jbangdev https://github.com/jbangdev/scoop-bucket
scoop install jbang

Note: 現在は以下のコマンドでインストールできるみたいです。

iex "& { $(iwr -useb https://ps.jbang.dev) } app setup"

 PowerShell はGUIじゃないので、かなりハードルが高いですが、コピペだけでインストールがすむので、まだ何とかなるのではないでしょうか。

 

 次に、メモ帳(もしくはさくらエディタ)を開いてもらいます。初心者でも、何故か、さくらエディタを使ってる確率が高い気がします。

 そして、次の内容をエディタで入力してもらい、「Hello.java」として保存します。

 なお、jbang init Hello.java を使えばメモ帳不要ですが、個人的には手を動かしてみる体験は重要だと思うので、ここはメモ帳を起動した方が良いと思います。

public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}

1行目の「///usr/bin/env jbang "$0" "$@" ; exit $?」は Windowsでは不要  

f:id:nodamushi:20201012221108p:plain:w320

 

 富士山の頂上から、麓まで飛び降りるレベルの崖っぷちとして、「Hello.java.txt」として保存してしまうことがあげられます(上記画像)。何とか上手く突破させてあげてください。

 後はおもむろに jbang Hello.java と PowerShell で実行するだけで、勝手に JDK のダウロードをしてから、実行してくれます。(環境変数 JAVA_HOME がある場合は、そちらを使います)

f:id:nodamushi:20201012221535p:plain

 無事、Java を何も入れていない環境で、あっさりハロワが完了しました!

 なお、jbangがコンパイルした結果や、ダウンロードしたJDKは、ユーザーホームディレクトリの .jbang/cache にあります。  

 次に、jbang のサンプルにもあるように、jfiglet ライブラリを使ったプログラムを実行してみましょう。

//DEPS com.github.lalyos:jfiglet:0.0.8

import com.github.lalyos.jfiglet.FigletFont;

public class Hello {
  public static void main(String[] args) throws Exception{
    System.out.println(FigletFont.convertOneLine("Hello World"));
  }
}

  f:id:nodamushi:20201012225254p:plain

 //DEPS com.github.lalyos:jfiglet:0.0.8 を読み取り、勝手に依存を解決して実行してくれます。

 外部の依存するライブラリを使う為にビルドスクリプトや、ダウンロードを手動ですること無しに簡単にできました。

 今後Gradleなどを教える際の、敷居が少し下がるのでは無いでしょうか。

 

まとめ

 jbangを使えばJDKをインストールしなくて良いというのは、非常に初学者に優しいと思います。

 JShellとならんで、初学者の助けになるツールになるポテンシャルを感じました。

 jbangからJShellが起動できるともっと良いかな。※追記

追記: jbangからJShellを操作する

 どうやら、 jshファイルを --interactive を付けて実行すると、JShellを操作できるようです。

f:id:nodamushi:20201013003207p:plain