Java 9 no Docker – Java Playground com REPL

A abordagem adotada aqui, com uso de contêiner Docker, foi motivada pela preservação do ambiente Java existente no computador Host já que instalar uma versão Java 9 onde já existe outra versão do Java, tal como o Java8, pode deixar o ambiente instável, criando problemas para o Desenvolvedor ou SysAdmin.

Criando ou Obtendo a imagem Docker

Criando

cd ~/Desktop/Development
git clone git@github.com:joao-parana/java-jdk9.git
cd java-jdk9
docker build -t parana/java-jdk9 .

Obtendo

Senão NÃO desejar fazer o build você poderá baixar direto a imagem do Docker Hub

docker pull parana/java-jdk9

Sessão do JShell

Para termos a disposição uma sessão do JShell, basta executar o Contêiner e invocar a JShell

docker run -i -t --rm parana/java-jdk9
jshell

Você verá uma mensagem parecida com esta abaixo

Jan 01, 2016 12:28:09 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 9-internal
|  Type /help for help

E um prompt assim:

-> 

Agora podemos digitar código Java diretamente na console. Não exibirei o prompt abaixo para simplificar o uso dos comandos. Em vez disso colocarei o código Java e os comandos JShell em fonte de tamanho fixo.

import java.util.stream.*
IntStream.range(0, 10).map(x->x*x).forEach(System.out::println)
/save script-01.repl 
/exit

Voltamos a Bash e podemos listar os arquivos e exibir o conteudo de script-01.repl

ls
script-01.repl
cat script-01.repl 
import java.util.stream.*;
IntStream.range(0, 10).map(x->x*x).forEach(System.out::println)

Voltamos a invocar a JShell e digitar comandos Java ou comandos JShell (estes que são precedidos pelo caracter / )

Experimentemos os comandos /?, /vars e /methods

jshell
System.out.println("Agora interativamente")
/open script-01.repl 
/?
/methods

O método printf já vem definido para facilitar o uso da console REPL

printf("Oi %s", "Mundo")
int pi = 3.1416
float pi = 3.1416
float pi = 3.1416f
/vars

Experimentando os comandos /imports, /vars e /reset

/imports
/vars
/reset

Usando o comando /list para listar o código Java no contexto atual

/list

Obtendo o Histórico de comandos digitados até o momento

/history

É possível modificar o nível de LOG na console REPL do JShell com o comando /feedback

-> /feedback ?
|  Follow /feedback with of the following:
|    off       (errors and critical output only)
|    concise
|    normal
|    verbose
|    default
|  You may also use just the first letter, for example: /f c
|  In interactive mode 'default' is the same as 'normal', from a file it is the same as 'off'

O conteúdo mostrado pelo comando /? lista todas as possibilidaes de uso do JShell. Veja abaixo

Type a Java language expression, statement, or declaration.
Or type one of the following commands:

/list [all]                      -- list the source you have typed
/seteditor           -- set the external editor command to use
/edit                -- edit a source entry referenced by name or id
/drop                -- delete a source entry referenced by name or id
/save [all|history|start]  -- save:  - current source;
                                          all - source including overwritten, failed, and start-up code;
                                          history - editing history;
                                          start - default start-up definitions
/open                      -- open a file as source input
/vars                            -- list the declared variables and their values
/methods                         -- list the declared methods and their signatures
/classes                         -- list the declared classes
/imports                         -- list the imported items
/exit                            -- exit the REPL
/reset                           -- reset everything in the REPL
/feedback                 -- feedback information: off, concise, normal, verbose, default, or ?
/prompt                          -- toggle display of a prompt
/classpath                 -- add a path to the classpath
/history                         -- history of what you have typed
/setstart                  -- read file and set as the new start-up definitions
/help                            -- this help message
/?                               -- this help message
/!                               -- re-run last snippet
/                            -- re-run snippet by id
/-                            -- re-run n-th previous snippet

Supported shortcuts include:
       -- show possible completions for the current text
Shift- -- for current method or constructor invocation, show a synopsis of the method/constructor

Deixe seu nome e e-mail para que eu possa enviar cupons de desconto para o curso sobre Docker