Implantando meu aplicativo na raiz no Tomcat

132

Eu tenho o arquivo de guerra do meu aplicativo. Eu preciso implantar isso no nível raiz. O URL atual é http://localhost:8080/war_name/application_name.

iamjustcoder
fonte
1
Você poderia especificar qual é exatamente o seu problema? Quando você implanta um arquivo war no tomcat, o aplicativo é acessado usando URL: localhost: 8080 / war_name sem a extensão .war.
ashishjmeshram
1
Sim, você está certo, preciso acessar meu aplicativo. " Localhost / application_name ", isso eu posso conseguir quando estou renomeando meu arquivo de guerra para "ROOT.war", mas o seu jogando fora de exceção de memória, porque o meu tamanho do arquivo guerra é de cerca de 120MB
iamjustcoder
1
@ user661660 - Parece que você tem um problema diferente - renomear para ROOT.wardeve funcionar. Sugiro fazer outra pergunta sobre você OutOfMemoryException, fornecendo o rastreamento da pilha e os detalhes. Você provavelmente pode contornar isso configurando -Xmxpara a JVM.
Rob Hruska
.lang.OutOfMemoryError: PermGen space 16 de março de 2011 9:52:52 Registro com.ebay.kernel.logger.Logger SEVERE: Erro no thread Perfmon java.lang.OutOfMemoryError: PermGen space Exceção de espaço no thread "CalClient: NotifyThreadDestroyThread-0 "java.lang.OutOfMemor yError: PermGen space Exceção no segmento" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG no espaço 16 de março de 2011 9:53:36 AM com.ebay.kernel.logger.Logger log SEVERO: erro no Perfmon thread java.lang.OutOfMemoryError: PermGen space Exceção no segmento "CalClient: NotifyThreadDestroyThread-0" java.lang.OutOfMemor yError: PermGen space
iamjustcoder
1
@ user661660 - Talvez algumas das respostas para esta pergunta possam ajudá-lo.
Rob Hruska

Respostas:

220

Você tem algumas opções:

  1. Remova o ROOT/diretório pronto para uso do tomcat e renomeie seu arquivo war para ROOT.warantes de implementá-lo.

  2. Implantar seu guerra como (a partir de seu exemplo) war_name.ware configurar a raiz do contexto em conf/server.xmlusar seu arquivo de guerra:

    <Context path="" docBase="war_name" debug="0" reloadable="true"></Context>

O primeiro é mais fácil, mas um pouco mais arrogante. O segundo é provavelmente a maneira mais elegante de fazer isso.

Rob Hruska
fonte
3
Se Tomcat está definido para autodeploy, você não precisa se preocupar com a opção 2.
Buhake Sindi
4
@ Dejel - Nada tecnicamente. Eu já fiz isso bastante; Isso finaliza o trabalho. Parece um pouco complicado ter que renomear seu próprio arquivo de guerra para algo que seja um tipo de detalhe de implementação do contêiner.
Rob Hruska
4
Como por link que você forneceu não é recomendado para o lugar <context> elementos diretamente no arquivo server.xml
Nilesh
6
Esta resposta recomenda uma técnica mencionada explicitamente na documentação como forma incorreta. A técnica adequada é detalhado aqui: stackoverflow.com/questions/41263245/...
Christopher Schultz
5
+1 por chamá-lo de ROOT.war. De acordo com os documentos do Tomcat, você precisa ter muito cuidado ao especificar "caminho" para evitar a implantação dupla: "Mesmo ao definir estaticamente um Contexto no server.xml, esse atributo não deve ser definido, a menos que o docBase não esteja localizado no diretório Host. appBase ou deployOnStartup e autoDeploy são falsos. Se essa regra não for seguida, é provável que ocorra uma implantação dupla. " - from tomcat.apache.org/tomcat-8.0-doc/config/context.html
Anthony Hayward
31

no tomcat v.7 (instalação baunilha)

em seu conf / server.xml, adicione o seguinte bit no final do arquivo, pouco antes da </Host>tag de fechamento:

<Context path="" docBase="app_name">
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Observe esse atributo docBase . É a parte importante. Você deve ter implantado app_name antes de alterar seu aplicativo Web raiz ou apenas copiado seu webapp descompactado (app_name) na pasta webapps do tomcat. Inicialização, visite root, veja seu app_name lá!

Peter Perháč
fonte
13

No tomcat 7 com essas alterações, eu consigo acessar o myAPP em / e ROOT em / ROOT

<Context path="" docBase="myAPP">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="ROOT" docBase="ROOT">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Adicione acima à <Host>seção em server.xml

Sudheer Palyam
fonte
3
Um caminho de contexto deve ser uma sequência vazia ou começar com um '/'. O caminho [ROOT] não atender a esses critérios e foi alterado para [/ ROOT]
Nikita Bosik
11

Eu sei que minha resposta está meio que sobreposta com algumas das outras respostas, mas esta é uma solução completa que tem algumas vantagens. Isso funciona no Tomcat 8:

  1. O aplicativo principal é servido a partir da raiz
  2. A implantação de arquivos war através da interface da web é mantida.
  3. O aplicativo principal será executado na porta 80 enquanto apenas os administradores tiverem acesso às pastas de gerenciamento (eu percebo que os sistemas * nix exigem um superusuário para vincular ao 80, mas no Windows isso não é um problema).

Isso significa que você só precisa reiniciar o tomcat uma vez e, após a atualização dos arquivos war, pode ser implantado sem problemas.

Etapa 1: no arquivo server.xml, localize a entrada do conector e substitua-a por:

<Connector 
    port="8080"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector
    port="80"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

Etapa 2: defina contextos na <Host ...>tag:

<Context path="/" docBase="CAS">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/ROOT" docBase="ROOT">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/host-manager" docBase="host-manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Observe que eu enderecei todos os aplicativos na pasta webapp. O primeiro efetivamente muda a raiz e o aplicativo principal da posição. Agora, o ROOT está ativado http://example.com/ROOTe o aplicativo principal está ativado http://example.com/. Os aplicativos da web protegidos por senha requerem o privileged="true"atributo

Quando você implanta um arquivo CAS.war que corresponda à raiz ( <Context path="/" docBase="CAS">é necessário recarregá-lo no painel de administração, pois ele não é atualizado com a implantação).

Não inclua o <Context path="/CAS" docBase="CAS">em seus contextos, pois isso desativa a opção de gerente para implantar arquivos de guerra. Isso significa que você pode acessar o aplicativo de duas maneiras: http://example.com/ehttp://example.com/APP/

Etapa 3: para impedir o acesso indesejado à pasta raiz e do gerenciador, adicione um valvea essas tags de contexto como esta:

<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
        addConnectorPort="true"
        allow="143\.21\.2\.\d+;8080|127\.0\.0\.1;8080|::1;8080|0:0:0:0:0:0:0:1;8080"/>
</Context>

Isso basicamente limita o acesso à pasta de aplicativos da web de administração a pessoas do meu próprio domínio (endereço IP falso) e host local quando eles usam a porta 8080 padrão e mantém a capacidade de implantar dinamicamente os arquivos de guerra por meio da interface da web.

Se você quiser usar isso para vários aplicativos que usam endereços IP diferentes, adicione o endereço IP ao conector ( address="143.21.2.1").

Se você deseja executar vários aplicativos da Web a partir da raiz, pode duplicar a etiqueta de Serviço (use um nome diferente para o segundo) e alterar a base de dados de <Context path="/" docBase="CAS">para, por exemplo <Context path="/" docBase="ICR">.

KimvdLinde
fonte
6

O caminho mais rápido.

  1. Verifique se você não tem o aplicativo ROOT implantado, desinstale-o se tiver um

  2. Renomeie sua guerra para ROOT.war, deploy, isso é tudo, não são necessárias alterações na configuração

Dima
fonte
6

Retire $CATALINA_HOME/webapps/ROOT. Atualização $CATALINA_HOME/conf/server.xml, verifique se o elemento Host se parece com o seguinte texto:

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="" docBase="myApp"></Context>

Ele funciona com o Tomcat 8. autoDeploy e deployOnStartup precisam ser configurados como false para impedir que o tomcat seja implantado myAppduas vezes.

Jingguo Yao
fonte
Tentei fazer o upload do WAR e ele não funcionou. Isso é apenas para WARs explodidas?
Logixplayer 15/07/2015
Tentei fazer o upload do WAR e ele não funcionou com base no exemplo de @ Jingguo. Isso é apenas para WARs explodidas? EDIT: É realmente apenas para guerras explodidas. Por que é isso? Não posso simplesmente carregar o WAR e evitar esta etapa dupla? Como posso fazer isso funcionar?
Logixplayer 15/07/2015
@logixplayer. Minha solução funciona com WAR. Eu não a explodi. Esqueci de mencionar que $CATALINA_HOME/webapps/ROOTprecisa ser removido. Remova-o e tente novamente.
Jingguo Yao
Eu removi a raiz como você disse. Implantei meu WAR (diretório não explodido). Percebi que um novo diretório ROOT foi criado com minhas coisas, por exemplo, WEB-INF. O site está em execução. É assim que deve funcionar?
logixplayer
Eu também tentei esse método e tudo quando tento abrir a página no navegador, continua esperando pelo servidor. O catalina.out diz apenas que o servidor foi iniciado.
Asu
1

Adicionando ao sol de @Rob Hruska, essa configuração na seção interna server.xml funciona:

<Context path="" docBase="gateway" reloadable="true" override="true"> </Context>

Nota: override = "true" pode ser necessário em alguns casos.

AVM
fonte
você não mencionou onde colocar isso. A resposta do @Sudheer Palyam foi útil.
Kannan Ramamoorthy
1

Adicionando à resposta do @Dima , se você estiver usando mavenpara criar seu pacote, você pode dizer para definir o nome do seu arquivo WAR ROOTem pom.xml:

<build>
    <finalName>ROOT</finalName>
</build>

Por padrão, tomcatimplantará o ROOT.warwebapp no ​​contexto raiz ( /).

Ali Tou
fonte
0

abra o gerenciador do tomact url: - http: // localhost: 8080 / manager / html /
, em aplicativos, você vê um aplicativo com o caminho como "/" sendo implementado
simplesmente. Renomeie o arquivo de guerra do seu aplicativo como ROOT.war e coloque-o no caminho: - inicie o Tomcat Não é necessária nenhuma configuração extra. Agora podemos ver a página inicial do aplicativo ou o URL configurado em http: // localhost: 8080
insira a descrição da imagem aqui
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps

Anurag_BEHS
fonte
-1

No meu servidor, estou usando isso e o root autodeploy funciona perfeitamente:

   <Host name="mysite" autoDeploy="true" appBase="webapps" unpackWARs="true" deployOnStartup="true">
        <Alias>www.mysite.com</Alias>
        <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="mysite_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b"/>
        <Context path="/mysite" docBase="mysite" reloadable="true"/>
    </Host>
Mircea Stanciu
fonte
Isso não vai implantar a / mas / mysite
tine2k