Tempo para a primeira aula. Essa aula é extremamente simples e serve somente para apresentar os conceitos básicos. Sem mais preâmbulos, vamos trabalhar.

O que você vai aprender

  1. Como as aulas funcionam.
  2. Como rodar o Maven.
  3. Como escrever seu primeiro programa Java.
  4. O processo de programar: teste, código, teste, código, até todos os testes passarem.
  5. Como imprimir coisas no console usando Java.

Passo 1 – Iniciar uma Máquina Virtual

Lembre que você tem que estar em um diretório JavaClasses quando você chamar a máquina virtual.

Vá para o estado "clean" e inicie a VM. Se você estiver usando o Linux como sistema operacional host (aquele que hospeda a VM), ir para o estado "clean" já liga a VM. Então executar vagrant up pode não ser necessário. +--- user@host:~$ cd JavaClasses user@host:~/JavaClasses$ vagrant snapshot go clean user@host:~/JavaClasses$ vagrant up +---

Passo 2 – Logar em uma máquina virtual

user@host:~/JavaClasses$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-32:~$

A partir de agora nós trabalharemos somente na máquina virtual.

Passo 3 – Obter os arquivos das aulas

Durante a preparação do setup nós instalaremos um script chamado 02j-get-lesson. Rodando esse script com o número da aula você automaticamente baixará a aula na máquina virtual:

vagrant@vagrant-ubuntu-trusty-32:~$ 02j-get-lesson 1

Passo 4 – Ir para o diretório da aula

Então vá para o diretório da aula usando o comando cd. Você também pode invocar os três comandos para listar a estrutura do diretório lesson1:

vagrant@vagrant-ubuntu-trusty-32:~$ cd lesson-1
vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ tree
.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── org
    │           └── aamm
    │               └── z2java
    │                   └── lesson1
    │                       └── App.java
    └── test
        └── java
            └── org
                └── aamm
                    └── z2java
                        └── lesson1
                            ├── GuidanceTest.java
                            └── MockPrintStream.java

13 directories, 4 files

Você não precisa entender completamente o que cada parte faz. O que você precisa saber é que:

  • pom.xml - O arquivo de configuração para Maven. Isso diz ao Maven o que fazer. Nós rodaremos o Maven em pouco minutos, então você o verá em ação.
  • src/main/java - Aqui é onde o principal código fonte deve ser armazenado. Quando nós programamos, o que tentamos criar é o código fonte principal. Nosso trabalho é criar arquivos dentro de cada diretório. Mais tarde, nós abordaremos o significado de org/aamm/z2java/lesson1.
  • src/test/java - Aqui é onde os testes são armazenados. Quando nós programamos, é uma boa prática criar testes que verifiquem se nosso programa está funcionando adequadamente. Nessas aulas, os testes são fornecidos, então tudo o que você precisa fazer é fazê-los passar.

Passo 5 – Rodar o Maven pela primeira vez

Você precisa simplesmente rodar o comando mvn e toda a mágica acontecerá diante de seus olhos.

vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ mvn
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building lesson1 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ lesson1 ---
[INFO] Deleting /home/vagrant/lesson-1/target
[INFO] 
[INFO] --- maven-resources-plugin:2.3:resources (default-resources) @ lesson1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/vagrant/lesson-1/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ lesson1 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /home/vagrant/lesson-1/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.3:testResources (default-testResources) @ lesson1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/vagrant/lesson-1/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.0:testCompile (default-testCompile) @ lesson1 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/vagrant/lesson-1/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.10:test (default-test) @ lesson1 ---
[INFO] Surefire report directory: /home/vagrant/lesson-1/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.aamm.z2java.lesson1.GuidanceTest
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec <<< FAILURE!

Results :

Failed tests:   test(org.aamm.z2java.lesson1.GuidanceTest): The main method should call the method System.out.println(String) to print "Hello World"

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.935s
[INFO] Finished at: Sun Nov 02 15:08:53 UTC 2014
[INFO] Final Memory: 9M/22M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-test) on project lesson1: There are test failures.
[ERROR] 
[ERROR] Please refer to /home/vagrant/lesson-1/target/surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

Como você pode ver, algo está errado. Nós precisamos ver isso! Isso significa que há um teste que não passou. Vamos dar uma olhada na mensagem de erro:

The main method should call the method System.out.println(String) to print "Hello World"

Essa mensagem está nos dizendo que algo deu errado. Nós podemos escrever testes, assim eles imprimem essas mensagens para sugerir a causa do erro.

Há algo mais a ser notado. Vamos verificar os conteúdos do diretório mais uma vez:

vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ ls
pom.xml  src  target

Maven criou um novo diretório chamado target. Foi neste diretório que o Maven colocou todos os arquivos compilados. Nós não tivemos que compilar nada manualmente, nem rodar nenhum teste. Maven fez todo o trabalho duro para nós.

Passo 6 – Vamos programar!

É hora de programar de verdade. Abra o arquivo src/main/java/org/aamm/z2java/lesson1/App.java com qualquer editor. Se você não conhece nenhum editor do Linux, simplesmente use pico (mas nós recomendamos que você aprenda o editor chamado vim, que é muito poderoso, embora um pouco difícil de aprender):

vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ pico src/main/java/org/aamm/z2java/lesson1/App.java

Você verá o código fonte:

package org.aamm.z2java.lesson1;

/**
 * Your class should write the message "Hello World" in the console using System.out.println.
 */
public class App 
{
    public static void main( String[] args )
    {
        // TODO Write here a command that prints "Hello World".
    }
}

Se você está usando pico, você ficará feliz em saber que as palavras na parte inferior da tela são comandos disponíveis. O caractere ^ significa a tecla "Control". Assim, Control+X é o comando para sair do editor.

Vá adiante e substitua a linha // TODO ... assim o arquivo se transforma em:

package org.aamm.z2java.lesson1;

/**
 * Your class should write the message "Hello World" in the console using System.out.println.
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println("bla bla bla");
    }
}

Então pressione Control+X para salvar o arquivo. O pico pedirá confirmação para salvar o arquivo. Simplesmente pressione Y para confirmar e então aperte ENTER para confirmar novamente.

Passo 7 – Rodar Maven novamente

O processo que todos os programadores seguem é:

  1. escrever código fonte;
  2. compilar;
  3. rodar o programa;
  4. procurar erros;
  5. se houver algo errado, vá para A. Se você não encontrou nenhum erro, você terminou!

Programadores adoram fazer A e D, mas odeiam B e C porque eles são repetitivos e chatos. Esse é o motivo pelo qual o Maven faz os B e C para nós. Então vamos rodar o Maven de novo:

vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ mvn
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building lesson1 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ lesson1 ---
[INFO] Deleting /home/vagrant/lesson-1/target
[INFO] 
[INFO] --- maven-resources-plugin:2.3:resources (default-resources) @ lesson1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/vagrant/lesson-1/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ lesson1 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /home/vagrant/lesson-1/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.3:testResources (default-testResources) @ lesson1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/vagrant/lesson-1/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.0:testCompile (default-testCompile) @ lesson1 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/vagrant/lesson-1/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.10:test (default-test) @ lesson1 ---
[INFO] Surefire report directory: /home/vagrant/lesson-1/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.aamm.z2java.lesson1.GuidanceTest
bla bla bla
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.064 sec <<< FAILURE!

Results :

Failed tests:   test(org.aamm.z2java.lesson1.GuidanceTest): The message you printed was not "Hello World". Take care about the differences between print and println. expected:<[Hello World]

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.947s
[INFO] Finished at: Sun Nov 02 15:47:39 UTC 2014
[INFO] Final Memory: 9M/24M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-test) on project lesson1: There are test failures.
[ERROR] 
[ERROR] Please refer to /home/vagrant/lesson-1/target/surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

Putz! Nós falhamos novamente! Não entre em pânico! Programadores falham o tempo todo! De fato, programar é fazer as coisas funcionarem. Se tudo está funcionando, você não está trabalhando. Programar é o processo de achar coisas para melhorar e, assim, criar novas coisas.

Vamos ver o que aconteceu dessa vez! A nova mensagem de erro é:

expected:<[Hello World]

Como somos ingênuos! Em vez de imprimir "Hello World" como a linha do TODO pede para fazer, nós escrevemos "bla bla bla". Parece que não conseguimos enganar o Java tão facilmente.

Passo 8 – Corrigir erros

Vamos voltar para o pico e mudar o arquivo novamente:

package org.aamm.z2java.lesson1;

/**
 * Your class should write the message "Hello World" in the console using System.out.println.
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println("Hello world");
    }
}

Agora parece que está perfeito! Salve seu arquivo (Control+X se você estiver rodando pico). Vamos rodar o Maven novamente!

Passo 9 – Rodar o Maven novamente

Nós temos que continuar rodando o Maven milhares de vezes. Agora nós entendemos porque são apenas três letras "mvn", pois, dessa forma, nós podemos digitar rápido e não perder tempo:

vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ mvn
(...)
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.aamm.z2java.lesson1.GuidanceTest
Hello world
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.087 sec <<< FAILURE!

Results :

Failed tests: 
  test(org.aamm.z2java.lesson1.GuidanceTest): The message you printed was not "Hello World". Take care about the differences between print and println. expected:<Hello [W]orld
> but was:<Hello [w]orld
>

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.019s
[INFO] Finished at: Sat Oct 25 21:11:52 BRST 2014
[INFO] Final Memory: 9M/125M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.7.2:test (default-test) on project lesson1: There are test failures.
[ERROR] 
[ERROR] Please refer to /home/akira/.svnworkspace/Documents/pessoal/projects/zeroToJavaWorkspace/trash/lesson1/target/surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

De novo não! O que pode ter dado errado dessa vez? Agora a mensagem diz:

expected:<Hello [W]orld
> but was:<Hello [w]orld

Então o Java está nos dizendo que nós imprimimos o w com letra minúscular em vez de usarmos letra maiúscula. Vamos mudar isso novamente!

Passo 10 – Mudar de novo

Essa será a terceira vez que nós rodamos pico (ou seu editor favorito). Então o editor de texto é extremamente importante para o programador. É como uma guitarra para o guitarrista. Para ser um bom programador você precisa conhecer profundamente um bom editor. Para o Java, entre os melhores editores estão o Eclipse, o InteliJ Idea e o Netbeans.

Para iniciantes, o pico, o vim ou o emacs são bem razoáveis.

A propósito, você pode rodar o mesmo comando de novo no Linux pressionando a seta para cima várias vezes. E então apertar ENTER para rodar o comando de novo.

Vamos rodar o pico novamente, e desta vez preste atenção a todos os detalhes.

package org.aamm.z2java.lesson1;

/**
 * Your class should write the message "Hello World" in the console using System.out.println.
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println("Hello World");
    }
}

Passo 11 – Nós somos os campeões

Vamos rodar o Maven novamente e ver como mandamos bem:

vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ mvn
(...)
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.aamm.z2java.lesson1.GuidanceTest
Hello World
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.151 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.875s
[INFO] Finished at: Sat Oct 25 21:19:45 BRST 2014
[INFO] Final Memory: 9M/125M
[INFO] ------------------------------------------------------------------------

Nenhuma falha! BUILD SUCCESS! Nosso trabalho está terminado!

Indo além!

Por enquanto nós vimos como testar nosso programa. Tudo o que ele faz é imprimir a mensagem: "Hello World". Mas nós podemos ver muito mais do que isso no terminal. Maven está adicionando um monte de mensagens obscuras, e nós realmente queremos ver somente nosso programa rodando. Se nosso programa está imprimindo "Hello World", nós queremos ver exatamente isso. Como podemos fazer?

Maven nos ajudará novamente:

vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$ mvn compile exec:java --quiet -Dexec.mainClass=org.aamm.z2java.lesson1.App
Hello World
vagrant@vagrant-ubuntu-trusty-32:~/lesson-1$

Então, o que aconteceu? Nós simplesmente chamamos o Maven passando 4 argumentos:

  • compile - Pede ao Maven que compile sua classe.
  • exec:java - Pede ao Maven que execute um programa Java.
  • --quiet - Pede ao Mavem que fique quieto. Assim o Mavem não imprime aquelas mensagens obscuras.
  • -Dexec.mainClass=org.aamm.z2java.lesson1.App - Pede ao Maven para executar a classe chamada org.aamm.z2java.lesson1.App . Este é o nosso programa.

Então o que é exatamente uma classe? Por agora, tudo o que nós precisamos saber é que App é o nome da nossa classe e org.aamm.z2java.lesson1 é o pacote onde a classe está localizada.

Um sistema Java típico pode ter milhares de classe. Então nós precisamos dizer ao Maven qual a classe é nossa classe principal. Em outras palavras, qual a classe é o ponto de entrada ou aquela que roda primeiro e chama todas as outras.

Por agora tal conceito pode parecer abstrato e artificial uma vez que temos somente uma classe, mas essas ideias se tornarão mais claras conforme avançamos.

Divirta-se

Agora que você terminou essa aula, você pode mudar a classe App da forma como desejar. É claro que, neste momento, a única coisa que você sabe fazer é imprimir mensagens no console, mas você pode adicionar mais linhas para imprimir outras coisas. Mesmo alguma ASCII art!

package org.aamm.z2java.lesson1;

/**
 * Your class should write the message "Hello World" in the console using System.out.println.
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println("+---------------+");
        System.out.println("| JAVA IS GREAT |");
        System.out.println("+---------------+");
   }
}

Back to top