Implantando aplicativos da Web no Jetty
1. Visão geral
Neste artigo, faremos uma rápida visão geral do servidor da web Jetty e, em seguida, abordaremos várias abordagens para implantar um arquivo WAR.
Jetty é um servidor da web Java HTTP de código aberto e um contêiner de servlet. O Jetty é mais comumente usado em comunicação máquina a máquina no ecossistema Java.
2. Configuração do Projeto
A versão mais recente do Jetty sempre pode ser baixada seguindothis link. Criaremos um aplicativo Web Java muito básico a partir da linha de comando com o Maven, que usaremos para nossos exemplos.
Neste artigo, estamos usando o Jetty 9.x, a versão mais recente no momento.
Vamos para o nosso console, navegue até o local de sua escolha e execute o seguinte comando:
mvn archetype:generate -DgroupId=com.example -DartifactId=jetty-app
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
Este comando criará um aplicativo da web Java completo dentro de uma nova pastajetty-app em nossa localização atual. É apenas uma das muitas maneiras de criar um aplicativo Java com o Maven e se adequa ao nosso objetivo.
Já que vamos lidar com arquivos WAR, vamos navegar até a raiz do projeto e construí-lo:
cd jetty-app
Construindo com o Maven:
mvn package
Entãojetty-app.war será criado no localjetty-app/target/jetty-app.war.
3. Estrutura do Jetty
Context path. Refere-se ao local que é relativo ao endereço do servidor e representa o nome do aplicativo da web.
Por exemplo, se nosso aplicativo da web for colocado no diretório$JETTY_HOME\webapps\myapp, ele será acessado pela URLhttp://localhost/myapp, e seu caminho de contexto será/myapp.
WAR. É a extensão de um arquivo que empacota uma hierarquia de diretórios de aplicativos da Web no formato ZIP e é abreviação de Arquivo da Web. Os aplicativos da web Java geralmente são compactados como arquivos WAR para implementação. Os arquivos WAR podem ser criados na linha de comandos ou com um IDE como o Eclipse.
4. Implantando por meio da cópia do WAR
A maneira mais fácil de implantar um aplicativo da Web no servidor Jetty é provavelmente copiando o arquivo WAR para o diretório$JETTY_HOME/webapps.
Após a cópia, podemos iniciar o servidor navegando para$JETTY_HOMEe executando o comando:
java -jar start.jar
O Jetty fará a varredura em seu diretório`$JETTY_HOME/webapps` na inicialização para aplicativos da web a serem implantados. Nosso novo aplicativo será implantado no contexto de/jetty-app.
Quando carregamos a URLhttp://localhost:8080/jetty-app do navegador, devemos ver nosso aplicativo rodando comHello world! impresso na tela.
5. Implantando usando arquivo de contexto
O servidor web Jetty nos oferece uma maneira dedeploy a web archive localizados em qualquer lugar no sistema de arquivos, criando um arquivo de contexto para ele.
Dessa forma, mesmo que nosso arquivo WAR esteja localizado em um desktop ou tenhamos optado por mantê-lo emjetty-app/target onde o Maven coloca o pacote, podemos apenas criar seu arquivo de contexto dentro de$JETTY_HOME/webapps.
Vamos remover a implantação dejetty-app.war que acabamos de implantar, excluindo-a dewebapps. Em seguida, criaremosjetty-app.xml com o seguinte código e o colocaremos dentro dewebapps:
/jetty
absolute/path/to/jetty-app.war
This context file must have the same name as our WAR, com extensão de arquivo XML. Observe que definimos o atributocontextPath para/jetty. Isso significa que acessaremos nosso aplicativo da web a partir da URLhttp://localhost:8080/jetty.
Essa capacidade de personalizar o caminho de contexto é uma das grandes vantagens da abordagem de arquivo de contexto da implantação de WARs no Jetty, pois alguns nomes de aplicativos podem não ser convenientes para essa finalidade.
6. Implantar com o plug-in Jetty Maven
6.1. Implantação padrão
O plugin jetty Maven nos ajuda a fazer testes e iteração rápidos ao criar aplicativos da Web Java. Para poder implantar e executar aplicativos com ele, só precisamos adicionar o plug-in empom.xml:
org.eclipse.jetty
jetty-maven-plugin
9.3.11.v20160721
A versão mais recente pode ser encontrada seguindothis Maven link.
Precisamos ter certeza de que nossa instância do Jetty em execução na porta8080 foi interrompida antes de executar a próxima etapa.
Para implantar nosso aplicativo após adicionar o plug-in, navegamos até a raiz ondepom.xml está localizado e executamos o seguinte comando:
mvn jetty:run
Este comando cria uma nova instância do jetty e o plug-in implementa o aplicativo nele. Podemos acessá-lo carregandohttp://localhost:8080.
O plugin jetty Maven examina continuamente o projeto da web em busca de quaisquer alterações e o reimplementa continuamente.
6.2. Alterando oContextPath
Na subseção anterior, o aplicativo foi implantado no contexto de/. No entanto, se quisermos implementar em um determinado caminho de contexto, como/jetty, como antes, teremos que configurar o plugin de forma diferente.
Alteraremos nossa declaração de plug-in para o seguinte XML:
org.eclipse.jetty
jetty-maven-plugin
9.3.11.v20160721
/jetty
Observe como adicionamos um bloco de configuração para personalizar ainda mais nossa implantação. Existem várias opções de configuração para serem colocadas dentro deste bloco, dependendo do que se deseja.
Após essas alterações, podemos executar novamente o plugin como antes e acessar nosso aplicativo através dehttp://localhost:8080/jetty.
6.3. Mudando a porta
Um cenário que se pode enfrentar é uma exceção de porta em uso. Pode ser que tenhamos uma instância jetty em execução na porta8080 para produção, mas ainda estamos em fase de desenvolvimento e queremos nos beneficiar da facilidade de iteração que vem com a implantação usando o plugin Maven.
Nesses casos, precisamos executar nosso servidor de teste em uma porta diferente. Vamos mudar a configuração do plugin para o seguinte XML:
/jetty
8888
Quando executarmos novamente nosso plugin Maven, poderemos acessar nosso aplicativo a partir dehttp://localhost:8888/jetty.
Vale ressaltar que, com o plugin jetty Maven, não precisamos ter uma instância do jetty instalada e em execução. Em vez disso, ele cria sua própria instância de cais.
7. Implantando com Jetty Runner
Assim como o plugin jetty Maven, o jetty-runner oferece uma maneira rápida e fácil de implantar e executar nosso aplicativo web. Com o jetty-runner, também não precisamos instalar e executar uma instância separada de um servidor jetty.
7.1. Configuração do Jetty Runner
Para usar o jetty-runner na rápida implantação e execução de nossos aplicativos da web, podemos baixar a versão mais recente seguindo esteMaven link.
Com o jetty-runner, precisamos apenas colocar o seu jar baixado em qualquer lugar que desejamos e estar pronto com o caminho do sistema de arquivos para nossos arquivos da web.
Podemos passar parâmetros de configuração a partir da linha de comando, além de implantar vários aplicativos em diferentes contextos e vinculados a diferentes portas com apenas um comando.
Coloquei meu jarro jetty-runner na mesma hierarquia do diretóriojetty-app. Esse é o diretório que contém nosso aplicativo da web.
7.2. Implantação Básica
Vamos implantar nosso WAR usando jetty-runner:
java -jar jetty-runner-9.4.0.M1.jar jetty-app/target/jetty-app.war
Este comando, assim como o caso do plug-in Maven, cria uma instância do jetty e implementa o WAR fornecido a ele. O caminho WAR pode ser um caminho absoluto ou relativo.
Podemos carregar este aplicativo usandohttp://localhost:8080.
7.3. Implantar com caminho de contexto
Para implantar no contexto de/jetty como antes:
java -jar jetty-runner-9.4.0.M1.jar --path /jetty jetty-app/target/jetty-app.war
Acessível viahttp://localhost:8080/jetty.
7.4. Implantar na porta determinada
Para implantar em um determinado número de porta:
java -jar jetty-runner-9.4.0.M1.jar --port 9090 jetty-app/target/jetty-app.war
Acessível viahttp://localhost:9090.
7.5. Implantar vários WARs
Para implantar vários WARs com o mesmo comando, usamos o argumento–path para tornar cada um único:
java -jar jetty-runner --path /one one.war --path /two two.war
Em seguida, acessaríamosone.war viahttp://localhost:8080/oneetwo.war viahttp://localhost:8080/two.
8. Implantar com o plug-in Cargo Maven
Cargo é uma biblioteca versátil que nos permite manipular vários tipos de contêineres de aplicativos de uma maneira padrão.
8.1. Configuração de implantação de carga
Nesta seção, veremos comouse Cargo’s Maven plugin to deploy a WAR to Jetty, neste caso implementaremos um WAR em uma instância Jetty 9.x.
Para ter um controle firme de todo o processo, começaremos do zero criando um novo aplicativo da web Java na linha de comando:
mvn archetype:generate -DgroupId=com.example -DartifactId=cargo-deploy
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
Isso criará um aplicativo da web Java completo no diretóriocargo-deploy. Se construirmos, implantarmos e carregarmos este aplicativo como está, ele imprimiráHello World! no navegador.
Como nosso aplicativo da web não contém servlets, nosso arquivoweb.xml será muito básico. Portanto, navegue até a pastaWEB-INF do nosso projeto recém-criado e crie umweb.xml se ainda não foi criado automaticamente com o seguinte conteúdo:
cargo-deploy
index.jsp
Para permitir que o Maven reconheça os comandos de cargo sem digitar o nome totalmente qualificado, precisamos adicionar o plugin cargo Maven em um grupo de plugin emsettings.xml.
Como filho imediato do elemento root<settings></settings>, adicione este:
org.codehaus.cargo
8.2. Implantação Local
Nesta subseção, editaremos nossopom.xml para atender aos nossos novos requisitos de implantação.
Adicione o plug-in da seguinte maneira:
org.codehaus.cargo
cargo-maven2-plugin
1.5.0
jetty9x
installed
Insert absolute path to jetty 9 installation
existing
Insert absolute path to jetty 9 installation
Observe que nósexplicitly define the packaging as a WAR, sem isso, nossa construção irá falhar. Na seção de plugins, adicionamos o plugin cargo maven2.
A versão mais recente no momento da escrita é1.5.0. No entanto, a versão mais recente sempre pode ser encontradahere. Além disso, adicionamos uma seção de configuração onde informamos ao Maven que estamos usando o contêiner Jetty e também uma instalação existente do Jetty.
Ao definir o tipo de contêiner parainstalled, informamos ao Maven que temos uma instância Jetty instalada na máquina e fornecemos a URL absoluta para essa instalação.
Ao definir o tipo de configuração paraexisting, informamos ao Maven que temos uma configuração existente que estamos usando e nenhuma configuração adicional é necessária.
A alternativa seria instruir a carga a baixar e configurar a versão do Jetty especificada fornecendo um URL. No entanto, nosso foco está emWAR deployment.
É importante notar que, quer estejamos usando Maven 2.x ou Maven 3.x, o plug-in cargo maven2 funciona para ambos.
Agora podemos instalar nosso aplicativo executando:
mvn install
e implante-o executando:
mvn cargo:deploy
Se tudo correr bem no console Maven e Jetty, poderemos executar nosso aplicativo da web carregandohttp://localhost:8080/cargo-deploy.
Se verificarmos a pasta$JETTY_HOME/webapps, encontraremos um arquivo descritor de implantação ou o que chamamos anteriormente de arquivo de contexto chamadocargo-deploy.xml criado pelo cargo.
8.3. Implantação Remota
Por padrão, o Jetty não possui possibilidades de implantação remota. Para adicionar esse suporte ao Jetty, o Cargo usa o aplicativo da WebJetty remote deployer.
O que isto significa é que precisamos fazer o download de um aplicativo da Web WAR pré-criado pelos desenvolvedores do Cargo, implantar esse WAR no contêiner do cais de destino.
Sempre que desejamos implantar neste servidor remoto usando o plug-in de carga Maven, ele envia uma solicitação HTTP para o aplicativo implementador no servidor remoto com o nosso WAR para implantação.
Este implantador remoto pode ser encontradohere. Vá para a seçãotools e baixe o WARcargo-jetty-7-and-onwards-deployer.
Considerações de segurança
Devemos configurar umsecurity realm no jetty antes que isso possa funcionar, para fins de autenticação. Crie um arquivo chamadorealm.properties no diretório$JETTY_HOME/etc do servidor jetty remoto. O conteúdo do arquivo é:
admin:password,manager
Oadmin é o nome de usuário pelo qual o cliente pode acessar os aplicativos protegidos,password é a senha emanager é a função que os clientes devem possuir antes de receberem acesso.
Também devemos declarar nossos requisitos de segurança no aplicativo implementador. Vamos descompactar o WAR que baixamos da página de downloads do jetty, fazer algumas alterações e empacotá-lo novamente em um WAR.
Depois de desempacotar, vá paraWEB-INF/web.xmle descomente o código XML com o comentárioUncomment in order to activate security. Ou coloque o seguinte código lá:
Jetty Remote Deployer
/*
manager
BASIC
Test Realm
Implantar o implantador
Agora, podemos empacotar o aplicativo novamente em um WAR e copiá-lo para qualquer local no servidor remoto. Nós iremos implantá-lo no Jetty.
Durante a implantação, é melhor usar umdeployment descriptor file para que possamos criar umsecurityHandlere passar para ele umloginService. Todos os aplicativos protegidos devem ter um serviço de login, caso contrário, o jetty falhará ao implantá-los.
Agora, vamos criar um arquivo de contexto em$JETTY_HOME/webapps da instância jetty remota, lembre-se das regras de nomeação do arquivo de contexto. Crie o mesmo nome que o WAR:
/deployer
absolute/path/to/cargo-jetty-deployer.war
Test Realm
/etc/realm.properties
Inicie o servidor jetty remoto e se tudo correr bem, devemos ser capazes de carregarhttp://localhost:8080/cargo-jetty-deployer. Devemos então ser capazes de ver algo como:
HTTP ERROR 400
Problem accessing /cargo-jetty-deployer/. Reason:
Command / is unknown
Implantando WAR para Jetty remoto
Para fazer uma implantação remota, só precisamos alterar nossa seção de configuração depom.xml. Implantação remota significa que não temos uma instalação local do Jetty, mas temos acesso autenticado ao aplicativo implementador em execução no servidor remoto.
Então, vamos mudar opom.xml para que a seção de configuração fique assim:
jetty9x
remote
runtime
127.0.0.1
8080
admin
password
Desta vez, mudamos o tipo de contêiner deinstalled pararemotee o tipo de configuração deexisting pararuntime. Por fim, adicionamos propriedades de nome de host, porta e autenticação à configuração.
limpe o projeto:
mvn clean
instale-o:
mvn install
finalmente, implante-o:
mvn cargo:deploy
É isso aí.
9. Implantando do Eclipse
O Eclipse nos permite incorporar servidores para adicionar a implantação de projetos da web no fluxo de trabalho normal sem sair do IDE.
9.1. Incorporando Jetty no Eclipse
Podemos embutir uma instalação do Jetty no eclipse selecionando o itemwindow na barra de tarefas e, a seguir,preferences no menu suspenso.
Encontraremos uma grade em árvore de itens de preferência no painel esquerdo da janela que aparece. Podemos então navegar para eclipse → servidores ou apenas digitar servidores na barra de pesquisa.
Em seguida, selecionamos o diretório Jetty, se ainda não estiver aberto, e escolhemos a versão do Jetty que baixamos.
No lado direito do painel, aparecerá uma página de configuração, onde selecionamos a opção enable para ativar esta versão do Jetty e navegamos até a pasta de instalação.
Nas capturas de tela, o jetty 7.x será substituído pela versão do jetty que configuramos.
Aplicamos as alterações e da próxima vez que abrirmos a visualização dos servidores nas janelas do eclipse → mostrar o submenu da visualização, o servidor recém-configurado estará presente e podemos iniciar, parar e implantar aplicativos nele.
9.2. Implantando aplicativo da Web no Embedded Jetty
Para implantar um aplicativo Web na instância incorporada do Jetty, ele deve existir em nosso espaço de trabalho.
Abra a visualizaçãoservers na janela → mostrar visualização e procure por servidores. Quando aberto, podemos apenas clicar com o botão direito no servidor que configuramos e selecionaradd deployment no menu de contexto que aparece.
Na caixa de diálogoNew Deployment que aparece, abra a lista suspensaproject e selecione o projeto da web.
Há uma seçãoDeploy Type abaixo da caixa de combinaçãoProject quando selecionamosExploded Archive(development mode),our changes in the application will be synced live without having to redeploy, esta é a melhor opção durante o desenvolvimento, pois é muito eficiente.
SelecionarPackaged Archive(production mode) exigirá que reimplantemos toda vez que fizermos alterações e as virmos no navegador. Isso é melhor apenas para produção, mas ainda assim, o Eclipse facilita igualmente.
9.3. Implantando aplicativo da Web em local externo
Geralmente, optamos por implantar um WAR por meio do Eclipse para facilitar a depuração. Pode chegar um momento em que queremos implantá-lo em um local diferente daqueles usados pelos servidores integrados do Eclipse.
A instância mais comum é onde nosso servidor de produção está online e queremos atualizar o aplicativo Web.
Podemos ignorar esse procedimento implantando no modo de produção e observandoDeploy Location na caixa de diálogoNew Deployment e selecionando o WAR a partir daí.
Durante a implantação, em vez de selecionar um servidor embutido, podemos selecionar a opção<Externally Launched> na exibiçãoservers ao lado da lista de servidores embutidos. Navegamos até o diretório$JETTY_HOME /webapps de uma instalação externa do Jetty.
10. Implantando do IntelliJ IDEA
Para implantar um aplicativo Web no Jetty, ele deve existir e já foi baixado e instalado.
10.1. Configuração Local
Abra o menuRun e clique nas opçõesEdit Configurations.
No painel à esquerda, pesquiseJetty Server, se não estiver lá, clique no sinal + no menu, pesquiseJettye selecioneLocal. No camponame, coloqueJetty 9.
Clique no botãoConfigure…e no campoJetty Home navegue até o local inicial de sua instalação e selecione-o.
Opcionalmente, defina a páginaStartup comohttp://localhost:8080/eHTTP port: 8080, altere a porta conforme apropriado.
Vá para a guiaDeployment e clique no símbolo +, selecione o artefato que deseja adicionar ao servidor e clique em OK
10.2. Configuração Remota
Siga as mesmas instruções das configurações locais do Jetty, mas na guia servidor, você deve inserir o local remoto da instalação.
11. Conclusão
Neste artigo, abordamos extensivamente as várias maneiras de implantar um arquivo WAR no servidor da web Jetty.