Pergunta

EDITAR:Acho que devo esclarecer minha intenção...

Estou tentando simplificar o ciclo de iteração de desenvolvimento de código de gravação >> construir WAR >> implantar >> atualizar >> repetir.Gostaria de ser relativamente independente do IDE (ou seja, não quero que plug-ins Eclipse ou IntelliJ façam o trabalho).Quero poder editar arquivos de código/estático e construir conforme necessário em meu diretório de origem WAR, e apenas ter a configuração de execução/depuração como uma chamada de linha de comando para uma instalação centralizada do Jetty.

Mais tarde, gostaria de poder realizar a implantação real usando geralmente a mesma configuração, mas com um WAR empacotado.Não quero que o código do meu aplicativo seja específico para meu IDE ou Jetty.

Então, talvez a melhor maneira de fazer esta pergunta seja O que você descobriu é a maneira mais limpa de usar o Jetty como seu servidor de aplicativos de desenvolvimento/depuração?


Digamos que eu queira uma instalação mínima do Jetty 7.Quero o mínimo possível de configuração XML, só preciso da API Servlet bruta, sem JSP, sem filtragem, etc.Eu só quero poder ter alguns servlets personalizados e ter arquivos estáticos servidos, se existirem.Este será o único WAR e servirá como root para uma determinada porta.

Idealmente, para facilitar a implantação, gostaria que o diretório Jetty fosse apenas o download padrão e minha configuração WAR/XML fosse separada desses arquivos Jetty padrão.Na minha invocação do Jetty, gostaria de passar esse XML mínimo e pronto.

Estou descobrindo que a documentação está em todo lugar e grande parte dela é para Jetty 6 ou específica para vários outros pacotes (Spring, etc.).Acho que se eu tiver essa configuração mínima, adicionar abstrações adicionais será muito mais limpo.Além disso, me permitirá lidar de forma mais limpa com cenários de Jetty incorporados.

Esta questão SO é um exemplo de cenário onde este XML seria útil Jetty Run War usando apenas linha de comando

Qual seria o XML mínimo necessário para especificar esse local WAR e os hosts/porta para atendê-lo?

Agradecemos antecipadamente por quaisquer trechos ou links.

Foi útil?

Solução

Jetty migrou para o Eclipse.Há informações muito sutis sobre isso.Isso também levou a uma mudança no nome do pacote, que é outro nível de nuance.Eles publicaram um utilitário para converter a configuração do Jetty6 para a configuração do Jetty 7, mas novamente - não muito popular.Estou desapontado com o fórum Eclipse Jetty.Aqui é onde você deve procurar a documentação do Jetty 7 em diante http://wiki.eclipse.org/Jetty/Starting

acho que isso é o mínimo jetty.xml Tirado de http://wiki.eclipse.org/Jetty/Reference/jetty.xml

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">\ 
<Configure id="Server" class="org.eclipse.jetty.server.Server">
</Configure>

Mas, eu preferiria começar com uma cópia do $JETTY_HOME/etc/jetty.xml e modificaria a partir daí.

Se você está bem com $JETTY_HOME/webapps diretório, você pode configurar a porta modificando esta parte

<Configure id="Server" class="org.eclipse.jetty.server.Server">
    ...
    <Call name="addConnector">
      <Arg>
          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
            <Set name="host"><Property name="jetty.host" /></Set>
            <Set name="port"><Property name="jetty.port" default="7777"/></Set>
            <Set name="maxIdleTime">300000</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <Set name="confidentialPort">8443</Set>
        <Set name="lowResourcesConnections">20000</Set>
        <Set name="lowResourcesMaxIdleTime">5000</Set>
          </New>
      </Arg>
    </Call>
    ....
</Configure>

Caso contrário, vou modificar context.xml da maneira explicada aqui (para Jetty 7) Como servir o webapp A da porta A e o webapp B da porta B

Consulte também estas páginas:

....Edição nº 1:desculpe pelo URL errado para webapp por conector.atualizei o link para Como servir o webapp A da porta A e o webapp B da porta B para apontar para o documento destinado ao Jetty 7.


Atualizar sobre 'como você lida com Jetty em vários ambientes?'

Desenvolvedor

Usamos Maven, então o Jetty incorporado funciona para nós.Nós apenas corremos mvn clean install run:jetty e a porta está configurada no arquivo de configuração do Maven, ou seja, pom.xml.Isso é não Dependente de IDE e Jetty podem ser facilmente incorporados usando ANT, mas nunca tentei.

Teste

Temos Jetty autônomo em execução.Configurei a porta e ajustei os parâmetros, removi aplicativos padrão (por exemplo,root.war etc) e criou um context.xml com portas específicas do aplicativo e diretório de implantação.(Infelizmente, fiz esta pergunta na lista de discussão do Eclipse Jetty e ninguém se preocupou em responder).Esta é uma configuração única.

Para compilações/implantações de teste, temos um script de construção que cria o WAR de acordo com as especificações do ambiente de teste e depois o carrega para o ambiente de teste.Depois disso, invocamos um script de shell que (1) interrompe o Jetty, (2) copia o arquivo war para o diretório webapp do myApp e (3) reinicia o Jetty.

No entanto, a maneira mais fácil de fazer isso é usando o plugin Cargo do Maven.O azar foi que eu estava usando o Jetty 7.1.6, que era incompatível com o Cargo.Mais tarde, eles consertaram, mas eu fiz meu trabalho com um script personalizado.

Prod

Prod tem quase o mesmo procedimento do teste, exceto.Os ajustes são feitos para maior segurança e balanceamento de carga.Mas do ponto de vista de implantação, não há nada diferente do caso de teste para o produto.

Observe que não me preocupei com o que são os arquivos XML e quantos devem estar lá.Acabei de usar aqueles que são minhas preocupações - jetty.xml e context.xml.Além disso, descobri que é muito mais limpo de usar jetty.conf e jetty.sh para passar parâmetros JVM, XMLs personalizados e para iniciar e parar.

Espero que isto ajude.


Na implantação a quente:

Agora, se você usa Maven e usa Jetty incorporado.Ele apenas sabe quando o código é alterado - como "farejador de tiros".No ambiente de desenvolvimento, você executa o Jetty, faz alterações, atualiza a página e vê suas alterações - implantação a quente.Encontre mais aqui http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin procurar scanIntervalSeconds

Outras dicas

Isso não responde totalmente à sua pergunta, mas caso ajude, aqui está um código mínimo usando Jetty 7 incorporado para iniciar um servidor com um servlet raiz:

    HandlerCollection handlers = new HandlerCollection();
    ServletContextHandler root = new ServletContextHandler(handlers, "/", ServletContextHandler.NO_SESSIONS|ServletContextHandler.NO_SECURITY);
    root.addServlet(new ServletHolder(new MyServlet()), "/*");

    Server server = new Server(8080);
    server.setHandler(handlers);
    server.start();

Veja é claro http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty.

Se você estiver construindo com Maven (que é independente IDE), então você deve depurar com o plugin Maven Molty. Basicamente, você executa o aplicativo como "MVN Jetty: Executar" na linha de comando, tudo isso funciona sem ter que fazer qualquer reafectação. O mais bom IDES Como o Suporte Maven embutido e permite executar / depurar o aplicativo como um maven; O que significa que o Maven é executado, o que inicia o plugin do cais que inicia o aplicativo e você pode depurá-lo. Como tudo está se esgotando das pastas de origem IDE e bin, você nem precisa de uma instalação do Jetty Server.

Aqui está um projeto de demonstração que é executado dessa maneira https : //github.com/simbo1905/zktodo2/blob/master/commandline.build.and.run.txt e aqui é como executá-lo sob Eclipse https://github.com/simbo1905/zktodo2/blob/master/eclipse.indigo.build.and. debug.txt Mas qualquer IDE que entende que o Maven deve funcionar. Dê uma olhada no Pom.xml, onde configura o plugin Maven Molty.

Eu usaria o Gradle e verificaria a pasta de saída da compilação a cada poucos segundos em busca de alterações na compilação.

Em um arquivo build.gradle:

apply plugin: 'jetty'

...

jettyRun.doFirst {
    // set system properties, etc here for bootstrapping
}

jettyRun {
    httpPort = 8989
    reload = 'automatic'
    scanIntervalSeconds = 3
    daemon = false
}

É isso.Você pode optar por construir automaticamente o IDE e apontar para esse diretório.Mas você também pode optar por não fazê-lo.Esta solução não está vinculada a um IDE.

Pensei em atualizar com o que faço agora.Eu escrevi um pequeno arquétipo de aplicativo de linha de comando / Maven que funciona como eu pensei que tudo deveria funcionar em primeiro lugar.O aplicativo bootstrap permite que você inicie o contêiner de servlet de sua escolha (Jetty, Tomcat, GlassFish) apenas passando o caminho para o WAR e sua porta.

Usando o Maven, você pode criar e empacotar sua própria instância deste aplicativo simples:

mvn archetype:generate \
    -DarchetypeGroupId=org.duelengine \
    -DarchetypeArtifactId=war-bootstrap-archetype \
    -DarchetypeVersion=0.2.1

Então você inicia assim:

java -jar bootstrap.jar -war myapp.war -p 8080 --jetty

Aqui está a fonte do utilitário e do arquétipo: https://bitbucket.org/mckamey/war-bootstrap

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top