Como definir o caminho de contexto de um aplicativo Web no Tomcat 7.0

162

Eu sei que posso renomear meu webapp (ou arquivo WAR) para ROOT, mas essa é uma maneira terrível de fazê-lo, IMHO. Agora eu verifiquei o documento do tomcat e ele diz

NÃO é recomendado colocar elementos diretamente no arquivo server.xml

Então, tentei fazer outro método sugerido.

Os elementos de contexto individual podem ser definidos explicitamente: Em um arquivo individual em /META-INF/context.xml, dentro dos arquivos do aplicativo.

Então eu criei um /META-INF/context.xmlcom o seguinte código,

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/"/>

Porém, após a implantação, quando reiniciei o servidor, ele ainda não carregava o contexto em "/", ainda carregava o "/<WEB_APP_NAME>"

Qualquer ponteiro útil.

Chantz
fonte
1
O motivo "NÃO é recomendado colocar elementos diretamente no arquivo server.xml" fornecido na documentação a seguir: "Isso ocorre porque torna a modificação da configuração do Contexto mais invasiva, pois o arquivo conf / server.xml principal não pode ser recarregado sem reiniciar o Tomcat ". A resposta aceita abaixo resolve diretamente o problema, mas se você provavelmente não modifica esse caminho novamente ou as reinicializações não causam muita interrupção, modificar o server.xml não parece tão irracional.
rimsky

Respostas:

236

O que você pode fazer é o seguinte;

Adicionar um arquivo chamado ROOT.xmlno<catalina_home>/conf/Catalina/localhost/

Esse ROOT.xml substituirá as configurações padrão do contexto raiz da instalação do tomcat para esse mecanismo e host (Catalina e localhost).

Digite o seguinte no arquivo ROOT.xml;

<Context 
  docBase="<yourApp>" 
  path="" 
  reloadable="true" 
/>

Aqui <yourApp>está o nome do seu aplicativo .. :)

E aí está, seu aplicativo agora é o aplicativo padrão e será exibido em http://localhost:8080

No entanto, há um efeito colateral; seu aplicativo será carregado duas vezes. Uma localhost:8080vez por uma vez localhost:8080/yourApp. Para corrigir isso, você pode colocar seu aplicativo FORA <catalina_home>/webappsDO LADO e usar um caminho relativo ou absoluto na tag docBase do ROOT.xml. Algo assim;

<Context 
  docBase="/opt/mywebapps/<yourApp>" 
  path="" 
  reloadable="true" 
/>

E então deve ficar tudo bem!

Paaske
fonte
32
Down votado? OK mas porquê? Se houver uma alternativa melhor, me avise também! : D
Paaske
1
Isso funcionará com outras guerras na pasta regular de webapps?
Chrislovecnm
5
Para resolver o duplo implantação você também pode definir ambas falsas "deployOnStartup" e "autodeploy" do atributo anfitrião no server.xml
Sefler
8
Descobri que se você não renomear a pasta ROOT padrão em / webapps "o gato volta" e redefinir o docBase no ROOT.xml. Isso ocorre com o servidor de desenvolvimento vfabric tc da VMWare ... Esteja avisado.
precisa saber é o seguinte
3
Parece que o Tomcat 7 não permitirá um docBase dentro do / webapps agora, portanto, seria obrigatório localizar o arquivo de guerra em outro local.
Mojo
12

Aqui segue as únicas soluções que funcionaram para mim. Inclua isso no nó Host no arquivo conf / server.xml

<Context path="" docBase="yourAppContextName">

  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

acesse o arquivo server.xml do Tomcat e defina o caminho em branco

rodvlopes
fonte
1
estará em server.xmlou context.xml? i ver uma marca XML <Context>no meucontext.xml
Saif
6
Há também uma tag contexto xml em server.xml No entanto o uso server.xml para o contexto de definição é desencorajado
İsmail Yavuz
4

No Tomcat 9.0, preciso alterar apenas o seguinte no server.xml

<Context docBase="web" path="/web" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

para

<Context docBase="web" path="" reloadable="true" source="org.eclipse.jst.jee.server:web"/>
MK Yung
fonte
3

Este pequeno código funcionou para mim, usando hosts virtuais

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>
Jorge Sanchez
fonte
Isso está dentro server.xml? De acordo com, por exemplo, Ali.Mojtehedy acima, isso é problemático. Além disso, outras respostas afirmam que /path/toprecisam estar fora do caminho normal dos aplicativos da web.
Jean Jordaan
Parece funcionar bem. Obviamente, você não deseja que o aplicativo ROOT exista na mesma pasta de aplicativos da web entre em conflito com o seu.
Anthony Hayward
2

A solução mais rápida e pode ser a melhor solução é ter o conteúdo abaixo em <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

<Context 
  docBase="/your_webapp_location_directory" 
  path="" 
  reloadable="true" 
/>

E seu webapp estará disponível em http://<host>:<port>/

Rajesh Gheware
fonte
1
Esse diretório docBase é absoluto ou relativo a uma pasta específica?
Jose Martinez
3
Eu tentei isso, mas não está funcionando. Eu tenho um aplicativo chamado Foobarem /opt/tomcat/webapps/Foobar. Tentei definir o docBase como Foobare também /opt/tomcat/webapps/Foobar, mas quando vou para `http: // <host>: <port> / ainda vejo a página inicial do Tomcat em vez do meu aplicativo Foobar. Eu até reiniciei o Tomcat. O que estou fazendo de errado?
Kimbaudi
Quando eu faço o caminho nulo, ele não alcança meu aplicativo):
Snickers3192
1

Eu enfrentei esse problema por um mês: Colocar a tag de contexto dentro do server.xml não é seguro, ele afeta os elementos de contexto que estão sendo implantados em todos os outros hosts; para aplicativos grandes, são necessários erros de conexão e também não é um bom isolamento. Por exemplo, você pode acessar outros sites por nome de pasta domain2 .com / domain1Folder !! também conexões de sessão de banco de dados carregadas duas vezes! a outra maneira é colocar o arquivo ROOT.xml que possui uma tag de contexto com o caminho completo, como:

 <Context path="" docBase="/var/lib/tomcat7/webapps/ROOT" />

em conf / catalina / webappsfoldername e implemente o arquivo war como ROOT.war dentro do webappsfoldername e também especifique host como

 <Host name="domianname"  appBase="webapps2" unpackWARs="true"  autoDeploy="true"  xmlValidation="false" xmlNamespaceAware="false" >

        <Logger className="org.apache.catalina.logger.FileLogger"
               directory="logs"  prefix="localhost_log." suffix=".txt"
          timestamp="true"/>
</Host>

Nesta abordagem também para aplicativos do mesmo tipo, as sessões de usuário não têm um bom isolamento! você pode entrar no app1 se app1 igual ao app2, após o login pela sessão do servidor automaticamente pode acessar o app2 ?! Portanto, você deve manter a sessão dos usuários no cache do lado do cliente e não com o jsessionid! podemos mudar o nome do mecanismo de localhost para resolvê-lo. mas digamos que brincar com o tomcat precise de mais tempo do que brincar com outros gatos!

Ali.Mojtehedy
fonte
1

Não é recomendável atualizar a configuração do servidor como server.xml ou ROOT.xml.

Você pode colocar um arquivo de configuração context.xml no diretório META-INF do aplicativo da web, com a configuração do caminho de contexto incluída. Isso substituirá a configuração padrão do servidor?

ou seja:

<Context docBase="yourAppName" path="/yourAppPath" reloadable="true">
Ivan
fonte
1

<Context docBase="yourAppName" path="" reloadable="true">

acesse o arquivo server.xml do Tomcat e defina o caminho em branco

Vipin Yadav
fonte
1

Tomcat 8: Após muitas pesquisas, este é apenas um código que funciona: em server.xml

<!-- Set /apple as default path -->
    <Host name="localhost"  appBase="webapps"
         unpackWARs="true" autoDeploy="true">
     <Context path="" docBase="apple">
         <!-- Default set of monitored resources -->
         <WatchedResource>WEB-INF/web.xml</WatchedResource>
     </Context>
    </Host>

Reinicie o Tomcat, verifique se, ao acessar 127.0.0.1:8080, ele exibirá o conteúdo em 127.0.0.1:8080/apple

Meu projeto foi o aplicativo Java da Web, criado pelo netbeans, defini o caminho de contexto na configuração do projeto, nada mais, até coloquei apple.war na pasta webapps.

user3600935
fonte
1

Para mim, as duas respostas funcionaram.

  1. Adicionando um arquivo chamado ROOT.xml em / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Adicionando entrada no server.xml
<Service name="Catalina2">
    <Connector port="8070" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8743" />
    <Engine name="Catalina2" defaultHost="localhost">
        <Host name="localhost"
            unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="/tmp/wars/hpong"  reloadable="true">
                <WatchedResource>WEB-INF/web.xml</WatchedResource>
            </Context>
      </Host>
    </Engine>
</Service>

Nota: quando você declara o docBase no contexto, ignora o appBase no Host.

  1. No entanto, eu preferi converter meu nome de guerra como ROOT.ware colocá-lo em webapps. Portanto, agora, solicitações de URL inigualáveis ​​de outras guerras (caminhos de contexto) serão direcionadas para essa guerra. Essa é a melhor maneira de lidar com o caminho de contexto ROOT ("/ **").

A segunda opção é (dupla) carregar as guerras da pasta Webapps também. Além disso, ele só precisa de uma pasta de guerra não compactada, o que é uma dor de cabeça.

Kanagavelu Sugumar
fonte
1

No Tomcat 8.X, no diretório inicial do tomcat / conf / folder em server.xml, você pode adicionar <Context>tag sob <Host>tag, como mostrado abaixo. Mas você precisa reiniciar o servidor para entrar em vigor

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

     <Context docBase="${catalina.base}\webapps\<Your App Directory Name>" path="<your app path you wish>" reloadable="true" />
  </Host>

OU se você estiver usando o Tomcat 7.X, poderá adicionar o arquivo context.xml na pasta WEB-INF no seu projeto. O conteúdo do arquivo que usei é como mostrado. e funcionou bem para mim. você não precisa reiniciar o servidor nesse caso.

<?xml version="1.0" encoding="UTF-8"?>

<Context docBase="${catalina.base}\webapps\<My App Directory Name>" path="<your app path you wish>" reloadable="true" />
harsha kumar Reddy
fonte
Testado no tomcat: 9.0 docker e funciona como 8.0 que você mencionou. localhost:8080/<Your App Directory Name>/e localhost:8080/<your app path you wish>/esses dois URLs funcionam ao mesmo tempo. Encontradas essas duas pastas extraídas em $CATALINA_HOME/webapps/.
niaomingjian 14/07
1

A solução mais simples e flexível está abaixo: Por dentro de $ {Tomcat_home} /config/server.xml

Altere o autoDeploy = "false" deployOnStartup = "false" no elemento Host , como abaixo .

<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="false" deployOnStartup="false">

Adicione abaixo da linha no elemento Host .

<Context path="" docBase="ServletInAction.war"  reloadable="true">
            <WatchedResource>WEB-INF/web.xml</WatchedResource>
        </Context>

Com a abordagem acima, podemos adicionar tantos aplicativos em aplicativos da web com nomes de caminhos de contexto diferentes.

Ravi Gupta
fonte
A solução alternativa sem a configuração acima do doinf é renomear seu arquivo war para root.war e colocá-lo no diretório webapps. O caminho de contexto automaticamente será definido como /.
Ravi Gupta
-6

O truque abaixo funcionou para mim.

1) Comente / exclua a configuração abaixo do arquivo server.xml (dentro da pasta conf) do tomcat.

2) Exclua a pasta ROOT existente (se houver) que reside na pasta tomcat webapps. E renomeie seu arquivo war (por exemplo: test.war) para ROOT.war.

Lembre-se de que, ao renomear o arquivo war para ROOT.war, "ROOT" deve estar em maiúsculas.

Limitação: você pode implantar apenas um aplicativo em uma instância do tomcat.

Kulshrest Gautam
fonte
3
Da pergunta: "Eu sei que posso renomear meu webapp (ou arquivo WAR) para ROOT, mas essa é uma maneira terrível de fazê-lo, IMHO".
Jean Jordaan
1
Eu não gostaria de me restringir a usar apenas um aplicativo da web por instância do tomcat.
Ulrich