[Java全般]SDKMAN（旧gvm）でJavaやGrvoovyをインストール

#生まれ変わったgvm
今まではgvmというツールを使ってGrails、Groovyなどのプロダクトをインストール管理できましたが、コレが **SDKMAN** というプロダクトに生まれ変わりました。

[SDKMAN](http://sdkman.io/)
[SDKMAN（Github）](https://github.com/sdkman/sdkman-cli)

今までgvmでは、Groovyファミリーのプロダクトを扱っていましたが、SDKMANでは、その垣根を飛び越え、JVMファミリーなプロダクトを簡単にインストール、管理できるようになりました。

**2016/12/14追記**
**SDKMANでJDK（OracleJava）のインストールも出来るようになりました!**
現在、以下の25プロダクトがSDKMANからインストール、管理できます。

|Name|最新バージョン(on SDKMAN)|公式|
|-----|----------------------|---|
|Activator|1.3.10||
|Ant|1.9.7|https://ant.apache.org/|
|AsciidoctorJ|1.5.4.1|http://asciidoctor.org/|
|Ceylon|1.3.1|http://ceylon-lang.org/|
|CRaSH|1.3.0|http://www.crashub.org/|
|Gaiden|1.1|http://kobo.github.io/gaiden/|
|Glide|0.9.2|http://glide-gae.appspot.com/|
|Gradle|3.2.1|http://gradle.org/|
|Grails|3.2.3|https://grails.org/|
|Griffon|1.5.0|http://griffon-framework.org/|
|Groovy|2.4.7|http://www.groovy-lang.org/|
|GroovyServ|1.1.0|https://kobo.github.io/groovyserv/|
|Java|8u111|http://www.oracle.com/technetwork/java/javase|
|JBake|2.5.0|http://jbake.org/|
|JBossForge|2.17.0.Final|http://forge.jboss.org/|
|Kobalt|0.720|http://beust.com/kobalt|
|Kotlin|1.0.5-2|https://kotlinlang.org/|
|Lazybones|0.8.3|https://github.com/pledbrook/lazybones/|
|Leiningen|2.7.1|http://leiningen.org/|
|Maven|3.3.9|https://maven.apache.org/|
|sbt|0.13.13|http://www.scala-sbt.org/|
|Scala|2.12.0|http://www.scala-lang.org/|
|SpringBoot|1.4.2.RELEASE|http://projects.spring.io/spring-boot/|
|Sshoogr|0.9.25|https://github.com/aestasit/sshoogr|
|Vert.x|3.3.3|http://vertx.io/|


見て分かるとおり、プログラミング言語としてScalaやCeylon、Javaな人にはお馴染みのSpring BootやMavenなどもインストールできます。
これらをSDKMANでインストールすれば、バージョンも簡単に切り替えられますし、パスもわざわざ自分で通す必要がありません。
全てのファイルは`$HOME/.sdkman`とうディレクトリに格納されるので、システム環境を汚すこともありません。


各プロダクトで新しいバージョンが出るとかなり早めにSDKMANから利用できるようになります。（というかだいたい即日）

#インストール
先ほどのGithubのREADMEに有ります。
2015年12月22日現在では`curl -s api.sdkman.io | bash`というコマンドを実行すればOKです。
インストールが終わったら、ターミナルの再起動か、`source .sdkman/bin/sdkman-init.sh`を実行するだけです。
まぁ`curl -s api.sdkman.io | bash`でインストールしたらターミナルを再起動、分からなければOS自体を再起動するだけでOKですね。

もしすでにgvmをインストールしている場合、`gvm --help`などを実行すればアップグレードするかどうかを聞いてくれます。
(以下の例を見てもらえればわかりますが、gvmに`--help`というコマンドはありません。。。何でもいいので、gvmを動かせばアップデートの確認をして、sdkmanがリリースされてるよ！と教えてくれるわけですね。優しい！）

**注意。**
sdkmanをgvmからアップグレードする`~/.gvm`ディレクトリが **消されます。**
基本的には`~/.sdkman`というディレクトリに引っ越しするだけですので問題はありませんが、不安な場合はバックアップをとっておいたほうがいいかもしれません。
なお、.gvmディレクトリが消えるのでもしIntelliJ等の統合開発環境からそのディレクトリの中のGrailsやGroovy等を参照している場合は~/.sdkman経由に変更する必要が有ります。環境変数も然り。

以下が私がsdkmanにアップグレードした時のログです。

```console
kkuwana% gvm --help
==== BROADCAST =================================================================
* 14/09/15: Grails 3.0.7 has been released on GVM. #grailsfw
* 14/09/15: Grails 3.1.0.M1 has been released on GVM. #grailsfw
* 14/09/15: Gradle 2.7 has been released on GVM. #gradle
================================================================================
Invalid command: --help

Usage: gvm <command> <candidate> [version]
       gvm offline <enable|disable>

   commands:
       install   or i    <candidate> [version]
       uninstall or rm   <candidate> <version>
       list      or ls   <candidate>
       use       or u    <candidate> [version]
       default   or d    <candidate> [version]
       current   or c    [candidate]
       outdated  or o    [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           <enable|disable>
       selfupdate        [force]
       flush             <candidates|broadcast|archives|temp>

   candidate  :  asciidoctorj, crash, gaiden, glide, gradle, grails, griffon, groovy, groovyserv, jbake, lazybones, springboot, vertx
   version    :  where optional, defaults to latest stable if not provided

eg: gvm install groovy


ATTENTION: A new version of GVM is available...

The current version is 3.0.0, but you have 2.4.1.

Would you like to upgrade now? (Y/n)Y

GVM has been detected on your system...

This update will upgrade GVM to SDKMAN!

Do you want to continue with the upgrade? (Y/n)Y

                                                               		         
Thanks for upgrading to...                                       		         
                                                               		         
                                                               		         
     SSSSSSSSSSSSSSS DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK                  
   SS:::::::::::::::SD::::::::::::DDD    K:::::::K    K:::::K                  
  S:::::SSSSSS::::::SD:::::::::::::::DD  K:::::::K    K:::::K                  
  S:::::S     SSSSSSSDDD:::::DDDDD:::::D K:::::::K   K::::::K                  
  S:::::S              D:::::D    D:::::DKK::::::K  K:::::KKK                  
  S:::::S              D:::::D     D:::::D K:::::K K:::::K                     
   S::::SSSS           D:::::D     D:::::D K::::::K:::::K                      
    SS::::::SSSSS      D:::::D     D:::::D K:::::::::::K                       
      SSS::::::::SS    D:::::D     D:::::D K:::::::::::K                       
         SSSSSS::::S   D:::::D     D:::::D K::::::K:::::K                      
              S:::::S  D:::::D     D:::::D K:::::K K:::::K                     
              S:::::S  D:::::D    D:::::DKK::::::K  K:::::KKK                  
  SSSSSSS     S:::::SDDD:::::DDDDD:::::D K:::::::K   K::::::K                  
  S::::::SSSSSS:::::SD:::::::::::::::DD  K:::::::K    K:::::K                  
  S:::::::::::::::SS D::::::::::::DDD    K:::::::K    K:::::K                  
   SSSSSSSSSSSSSSS   DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK                  
                                                                               
                                                                               
                      mmmmmmm    mmmmmmm     aaaaaaaaaaaaa  nnnn  nnnnnnnn     
                    mm:::::::m  m:::::::mm   a::::::::::::a n:::nn::::::::nn   
                   m::::::::::mm::::::::::m  aaaaaaaaa:::::an::::::::::::::nn  
                   m::::::::::::::::::::::m           a::::ann:::::::::::::::n 
                   m:::::mmm::::::mmm:::::m    aaaaaaa:::::a  n:::::nnnn:::::n 
                   m::::m   m::::m   m::::m  aa::::::::::::a  n::::n    n::::n 
                   m::::m   m::::m   m::::m a::::aaaa::::::a  n::::n    n::::n 
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n 
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n 
                   m::::m   m::::m   m::::ma:::::aaaa::::::a  n::::n    n::::n 
                   m::::m   m::::m   m::::m a::::::::::aa:::a n::::n    n::::n 
                   mmmmmm   mmmmmm   mmmmmm  aaaaaaaaaa  aaaa nnnnnn    nnnnnn 
            								                                     
                                                                               

Updating SDKMAN...


Successfully upgraded SDKMAN.

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

    export SDKMAN_DIR="/home/k-kuwana/.sdkman" && source "/home/k-kuwana/.sdkman/bin/sdkman-init.sh"


touch: `/home/k-kuwana/.gvm/var/delay_upgrade' に touch できません: そのようなファイルやディレクトリはありません
kkuwana% 

```

なんかエラーが出ていますがとりあえず無視。。。
で、メッセージにあるとおりexportを実行します。

```console
kkuwana% export SDKMAN_DIR="/home/k-kuwana/.sdkman" && source "/home/k-kuwana/.sdkman/bin/sdkman-init.sh"
```

#使ってみる
`sdk`という思いっきりなんか別のコマンドとバッティングしないのコレという名前でコマンドが使えるようになっています。

とりあえずhelpを出します。

```console
kkuwana% sdk help

Usage: sdk <command> <candidate> [version]
       sdk offline <enable|disable>

   commands:
       install   or i    <candidate> [version]
       uninstall or rm   <candidate> <version>
       list      or ls   <candidate>
       use       or u    <candidate> [version]
       default   or d    <candidate> [version]
       current   or c    [candidate]
       outdated  or o    [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           <enable|disable>
       selfupdate        [force]
       flush             <candidates|broadcast|archives|temp>

   candidate  :  asciidoctorj, crash, gaiden, glide, gradle, grails, griffon, groovy, groovyserv, jbake, jbossforge, lazybones, springboot, vertx
   version    :  where optional, defaults to latest stable if not provided

eg: sdk install groovy
kkuwana% 

```

gvmと同じっぽいです。
利用可能なGroovyのリストを出してみます。

```console
kkuwana% sdk list groovy

================================================================================
Available Groovy Versions
================================================================================
     2.4.4                2.3.1                2.0.8                1.8.3          
     2.4.3                2.3.0                2.0.7                1.8.2          
     2.4.2              * 2.2.2                2.0.6                1.8.1          
     2.4.1                2.2.1                2.0.5                1.8.0          
   * 2.4.0                2.2.0                2.0.4                1.7.9          
     2.3.9                2.1.9                2.0.3                1.7.8          
     2.3.8                2.1.8                2.0.2                1.7.7          
   * 2.3.7                2.1.7                2.0.1                1.7.6          
     2.3.6                2.1.6                2.0.0                1.7.5          
     2.3.5                2.1.5                1.8.9                1.7.4          
     2.3.4                2.1.4                1.8.8                1.7.3          
   * 2.3.3                2.1.3                1.8.7                1.7.2          
     2.3.2                2.1.2                1.8.6                1.7.11         
     2.3.11               2.1.1                1.8.5                1.7.10         
     2.3.10               2.1.0                1.8.4                1.7.1          

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
kkuwana% 
```

すでにgvm経由で入れていたGroovyも大丈夫っぽいですね。
一応インストール済みのものでバージョンを切り替えてみます。
コマンドは`sdk use {プロダクト名} {バージョン}`です。
まずは今のGroovyのバージョンを確認してみます。

```console
kkuwana% groovy -v
zsh: command not found: groovy
kkuwana% 
```

...さっき出ていたエラーの正体がコレっぽいですね。上のバージョン一覧を見ても分かるとおり、デフォルトで利用するプロダクトの情報が失われてしまっています。
テストも含めてバージョンを指定してみます。

```console
kkuwana% sdk use groovy 2.4.0

Using groovy version 2.4.0 in this shell.
kkuwana% groovy -v
Groovy Version: 2.4.0 JVM: 1.8.0_25 Vendor: Oracle Corporation OS: Linux
kkuwana% 
kkuwana% groovy -v
Groovy Version: 2.3.7 JVM: 1.8.0_25 Vendor: Oracle Corporation OS: Linux
kkuwana% 
```
大丈夫ですね。
もう一度利用可能なGroovyの一覧を見てみます。

```console
kkuwana% sdk list groovy

================================================================================
Available Groovy Versions
================================================================================
     2.4.4                2.3.1                2.0.8                1.8.3          
     2.4.3                2.3.0                2.0.7                1.8.2          
     2.4.2              * 2.2.2                2.0.6                1.8.1          
     2.4.1                2.2.1                2.0.5                1.8.0          
 > * 2.4.0                2.2.0                2.0.4                1.7.9          
     2.3.9                2.1.9                2.0.3                1.7.8          
     2.3.8                2.1.8                2.0.2                1.7.7          
   * 2.3.7                2.1.7                2.0.1                1.7.6          
     2.3.6                2.1.6                2.0.0                1.7.5          
     2.3.5                2.1.5                1.8.9                1.7.4          
     2.3.4                2.1.4                1.8.8                1.7.3          
   * 2.3.3                2.1.3                1.8.7                1.7.2          
     2.3.2                2.1.2                1.8.6                1.7.11         
     2.3.11               2.1.1                1.8.5                1.7.10         
     2.3.10               2.1.0                1.8.4                1.7.1          

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
```
2.4.0に`>`がついて現在利用中にちゃんとなっています。
インストールも試してみます。

```groovy
kkuwana% sdk list groovy

================================================================================
Available Groovy Versions
================================================================================
     2.4.4                2.3.1                2.0.8                1.8.3          
     2.4.3                2.3.0                2.0.7                1.8.2          
     2.4.2              * 2.2.2                2.0.6                1.8.1          
     2.4.1                2.2.1                2.0.5                1.8.0          
 > * 2.4.0                2.2.0                2.0.4                1.7.9          
     2.3.9                2.1.9                2.0.3                1.7.8          
     2.3.8                2.1.8                2.0.2                1.7.7          
   * 2.3.7                2.1.7                2.0.1                1.7.6          
     2.3.6                2.1.6                2.0.0                1.7.5          
     2.3.5                2.1.5                1.8.9                1.7.4          
     2.3.4                2.1.4                1.8.8                1.7.3          
   * 2.3.3                2.1.3                1.8.7                1.7.2          
     2.3.2                2.1.2                1.8.6                1.7.11         
     2.3.11               2.1.1                1.8.5                1.7.10         
     2.3.10               2.1.0                1.8.4                1.7.1          

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
kkuwana% sdk install groovy 2.4.4

Downloading: groovy 2.4.4

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 30.9M  100 30.9M    0     0   983k      0  0:00:32  0:00:32 --:--:--  1092

Installing: groovy 2.4.4
Done installing!

Do you want groovy 2.4.4 to be set as default? (Y/n): Y

Setting groovy 2.4.4 as default.
```

できました。
ではGroovyのバージョンを見てみましょう。

```console
kkuwana% groovy -v
Groovy Version: 2.4.0 JVM: 1.8.0_25 Vendor: Oracle Corporation OS: Linux
kkuwana% 
```
デフォルトでバージョンが変わっていません。

*追記*
*Twitterで指摘していただきました。これは恐らくこのシェル内ですでにuseでバージョンを指定している事が原因のようです。シェルを別途起動すればOKなはずです。*

もう一度リストを見てみましょう。。

```console
kkuwana% sdk list groovy

================================================================================
Available Groovy Versions
================================================================================
   * 2.4.4                2.3.1                2.0.8                1.8.3          
     2.4.3                2.3.0                2.0.7                1.8.2          
     2.4.2              * 2.2.2                2.0.6                1.8.1          
     2.4.1                2.2.1                2.0.5                1.8.0          
 > * 2.4.0                2.2.0                2.0.4                1.7.9          
     2.3.9                2.1.9                2.0.3                1.7.8          
     2.3.8                2.1.8                2.0.2                1.7.7          
   * 2.3.7                2.1.7                2.0.1                1.7.6          
     2.3.6                2.1.6                2.0.0                1.7.5          
     2.3.5                2.1.5                1.8.9                1.7.4          
     2.3.4                2.1.4                1.8.8                1.7.3          
   * 2.3.3                2.1.3                1.8.7                1.7.2          
     2.3.2                2.1.2                1.8.6                1.7.11         
     2.3.11               2.1.1                1.8.5                1.7.10         
     2.3.10               2.1.0                1.8.4                1.7.1          

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================
kkuwana% 
```

インストールは問題ないっぽいですね。
ではまた手動でバージョンを切り替えてみます。

```console
kkuwana% sdk use groovy 2.4.4

Using groovy version 2.4.4 in this shell.
kkuwana% groovy -v
Groovy Version: 2.4.4 JVM: 1.8.0_25 Vendor: Oracle Corporation OS: Linux
kkuwana% 
kkuwana% 
kkuwana% 
kkuwana% sdk use groovy 2.4.0

Using groovy version 2.4.0 in this shell.
kkuwana% 
```

切り替えられました。
まだまだ公開されて間もない（はず）ですので、この辺りも含めてドンドン洗練されていくと思われます。