Projeto JEE com jetty + maven

Olá Pessoal,

O post de hoje saiu após muito sofrimento de tentar criar um maven Project rodando com Jetty, mas que eu não precisasse ter o jetty na máquina local e que desse suporte JSF. Parece algo simples e fácil, concorda? Mas me deu uma dor de cabeça e consumiu praticamente 2 dias de tentativas. Vamos entender o motivo.

Lets go …

Contexto

Bem, eu precisava criar um projeto para ter tudo gerenciado pelo maven. Primeiro eu decidi sair do TomCat e ir para o Jetty, pois a performance do tomcat e outros problemas que estava tendo com o servidor estavam sendo criticos, mas eu não queria ter o jetty na máquina local para poder rodar minha app, queria fazer isso de maneira simples pelo maven, daí veio as alternativas:

  • Criar um projeto webapps usando o archetype do maven;
  • Criar um dynamic web Project e adicionar o maven ;
  • Criar um projeto maven usando archetype JSF disponíveis;
  • Criar um projeto JSF e depois adicionar maven + jetty
  • Plugin jetty Eclipse via Eclipse Market

Nenhuma dessas alternativas funcionou como eu queria. Muitos dos archetype disponíveis lá no maven estão “bugados” e simplesmente não iniciam aplicação. A opção 2 só funcionava sem JSF, ao adicionar “JSF capacibilities” pelo eclipse simplesmente exigia ter o jetty local para apontar. O mesmo para a opção 4. A opção 3 simplesmente nenhum dos archtype que tentei subia app. Tentei até arrumar, mas era muita mão e tempo que seria gasto. A opção 5 ainda está a desejar, os plugins que testei disponíveis no eclipse market simplesmente estavam cheio de bugs, fora quando não travava a IDE.

E a solução?

Mais simples do que imaginei. Apenas criei um simple maven Project.

 

 

Clique em next

 

Clique em finish. E terá um projeto com a estrutura a seguir:

 

Vamos criar nosso web.xml, WEB-INF e lib.

 

 

Para os arquivos web.xml e face-config.xml, é simples.  Apenas crie um JSF Project e copie o web.xml e face-config.xml gerado. Não recomendo querer criar os arquivos na mão, pois você pode ter erros por digitar algo errado e acabar perdendo tempo fixar algo que não agrega muito valor.

Adicione as libs que você precisa:

 

 

Novamente copiei do projeto jsf. E adicionei as do JSF 2.0 : jsf-api-2.0.9.jar e jsf-impl.jar

Agora vamos  configurar o arquivo  pom do maven:

Feito isso crie um arquivo index.jsp em webapp e dentro de body coloque o que achar necessário para testar.

 

 

Observe que criei um arquivo xhtml para poder testar o JSF 2.0.  Nele  apenas uso uma tag <h:outputLabel value=”Lopes Neto” /> assim verifico se realmente o projeto está dando suporte ao JSF.

Rodando aplicação

Para rodar aplicação é bem simples, clique com o botão direito no projeto e siga os passos a seguir:

 

Clique em maven build e vamos adicionar um build para iniciar o maven

<img mavenrunconfigjettyrun>

Apenas selecione o projeto em base directory e em goals coloque jetty:run que é para iniciar o servidor.

E agora basta acessar e ver sua aplicação rodando sem o jetty local, apenas através do maven:

Enfim, foi a forma que consegui fazer o maven rodar para projetos JEE com JSF sem ter o jetty local na máquina. Não posso dizer que fiquei satisfeito com essa solução, mas foi a que me deu menos dor de cabeça.

Vou ficando por aqui. See ya!!

Abraços!

Criando WebServices Java 6

Olá pessoa­­­l,

Preparei este post para quem quer começar a brincar com WebService. Fiz três posts: um “hello world”, outro onde veremos como criar um cliente para consumir o serviço e por último criar um WebService envolvendo banco de dados que será consumido. Usaremos alguns recursos do Java 6 para criar e publicar um WebService.  Eu espero que vocês gostem da série. O objetivo maior é poder compartilhar o conhecimento com quem está chegando, eu tive dificuldades no inicio de juntar todo quebra-cabeça e ver uma simples mensagem. Nem sempre é fácil quando estamos dando os primeiros passos e o objetivo do post é ajudar quem está nesse contexto. Enfim, teremos uma pequena jornada nas próximas semanas.

Lets GO…

WebService

Não vou falar sobre o que é um WebService, pois há vários artigos, posts em blog, Wikipedia explicando exatamente o proposto da tecnologia, o post aqui tem foco de ser prático, ou seja, algo mão na massa, e vou considerar que você já leu sobre o assunto, porém agora quer ver a coisa funcionado. Eu não sou muito bom de teoria, e vou darei um exemplo bem alto nível somente para tentar exemplificar o que é um WebService, caso você tenha dúvida do conceito (eu particularmente quando li o sobre o assunto pela primeira fiquei meio perdido).  Imagine a Amazon (é o servidor) e você é um cliente da Amazon como fornecedor. Você tem uma livraria em parceria com Amazon, porém a aplicação que controla os livros que você tem na sua livraria é diferente do sistema de controle da Amazon, porém você gostaria de realizar uma pesquisa no “banco” da Amazon e poder efetuar compras de livros como fornecedor quando não tivesse o exemplar na livraria fisicamente, como fazer isso a partir da sua aplicação? Através de um WebService. A Amazon disponibiliza esse serviço de consultar e comprar livros como fornecedor e vc como consumidor vai pegar esse serviço e incorporar ao seu sistema, sem precisar adaptar seu sistema (mudar linguagem, banco etc) para nada especifico da Amazon. Supondo que seu sistema é em .NET e o da Amazon em Java, isso pouco importa via WebServices.

Por que Java 6?

No Java 6 foi adicionado anotações que permitem, definimos se a nossa classe é um WebService e quais métodos queremos publicar. Além de outras anotações relacionadas. E isso nos ajuda a criar e publicar um WebService sem precisar de um container (TomCat,Jetty etc). É isso mesmo, vc não vai precisar instalar um desses servidores para criar e testar seus webservices durante desenvolvimento. Evidente que essa forma não vai substitui os benefícios que temos ao usar um servidor de aplicação.  Mas, é uma mão durante o desenvolvimento.

Nosso exemplo

No nosso exemplo vamos fazer um  Hello World + <nomepassado> ou seja, “Hello World Camilo”. É algo muito simples, mas para quem está iniciando é uma felicidade em ver as coisas funcionando mesma que seja com uma mensagem tão tradicional como a nossa.

O que você precisa saber antes de começar:

É importante que você conheça os termos abaixo:

SEI Service Endpoint Interface: temos a interface com as operações (métodos) do webservice

SIB Service Implementation Bean: representa a classe que implementa a interface. Este sempre tem um link através da anotação @WebService para o SEI, ou seja, o endPoint.

WSDL: é um contrato entre o meu serviço com os mais consumidores

SOAP: é um protocolo usado na criação WS

Comando wsimport: usado pelo consumidor, ou seja, pelo cliente que vai usar o webservice. Esse comando tem a responsabilidade de criar o cliente webservice para o webservice (estranho mais é isso que acontece na pratica)

Comando apt: gera o javaws(pacote/package) para o publish do serviço.

apt:<caminho da classe WebService>

@WebService = é sinal que temos um SEI

@WebMethod = é sinal que cada método é uma operação do service

Praticando

Neste primeiro exemplo veremos como criar um WebServices e publicá-lo para que terceiros possa consumir o serviço que disponibilizamos:

  1. Crie um projeto no Eclipse JavaApplication
  2. criamos os três packages: 1 para colocar a classe que é responsável por publicar o webservice, outra para ter a interface (SEI) e mais um para a classe que implementada a interface (SIB).

Interface SEI

Vamos criar a nossa interface que terá dois métodos a serem implementados pela classe que estará no package SIB. Onde o objetivo é dar boas vindas ao usuário em dois idiomas: inglês e português. O código deve ficar assim:

@WebService

public interface Welcome {

@WebMethod

String welcomePt(String nome);

@WebMethod

String welcomeEn(String nome);

}

SIB – Classe que implementa a interface

Vamos criar a classe que tem a responsabilidade dá “colocar” carne no esqueleto. Vale lembrar que poderíamos fazer isso tudo em uma classe sem o uso da interface etc. Mas, por boas praticas de desenvolvimento fizemos assim.

import javax.jws.WebService;

import br.com.camilolopes.ws.sei.Welcome;

@WebService(endpointInterface=”br.com.camilolopes.ws.sei.Welcome”)

public class WelcomeImpl implements Welcome {

@Override

public String welcomePt(String nome) {

// TODO Auto-generated method stub

return “Olá “+ nome;

}

@Override

public String welcomeEn(String nome) {

// TODO Auto-generated method stub

return “Hello ” +nome;

}}

Anotação @WebService na classe é necessário fazer, pois precisamos indicar o endPointInterface que nesse caso é a nossa classe que colocamos no package xx.sib

Publicando o Serviço

Para publicarmos é muito simples. Criaremos uma classe responsável, como a seguir:

public class WelcomePublish {

public static void main(String[] args) {

Endpoint.publish(“http://localhost:9876/welcome”, new WelcomeImpl());

}}

No código acima estamos informando onde será publicado o serviço: endereço (localhost) e a porta (9876). Depois informamos à classe que tem a implementação do serviço. É o mesmo que dizer: publique neste endereço, o que temos na classe WelcomeImpl.Na pratica é isso que acontece.

Note: cuidado com a porta se estiver ocupada veja qual o processo está usando e finalize. Normalmente a porta acima está disponível. Depois que terminar de publicar seu serviço e quiser subir outro na mesma porta, vá ao gerenciador de tarefa e mate o process javaws, ele será o que o seu webservice estava usando ou pare sua aplicação via Eclipse.

Testando o Serviço

Para testarmos se o nosso serviço está funcionando, vamos publicá-lo executando a classe WelcomePublish. Ao rodar a classe devemos ter a imagem a seguir no console:

Verificando serviço publicado

Para verificar o serviço, vamos acessar usando o browser e obter o wsdl. Certifique que a classe WelcomePublish está rodando e acesse: http://localhost:9876/welcome?wsdl . Já temos o serviço publicado, e agora qualquer outra pessoa pode criar o cliente e consumir. Acesse o link e veja o resultado :).

Acho que por hoje é só isso, no próximo vamos conhecer a SOAPUI e como criar um cliente para consumir esse serviço.Não se preocupe por agora como será consumido e sim entender a base de WebService e praticar um pouco mais.

Abraços,  espero que tenham gostado. See ya!!