Come impostare il percorso di contesto di un'applicazione Web in Tomcat 7.0


162

So che posso rinominare il mio webapp (o il suo file WAR) in ROOT ma questo è un modo terribile per farlo, IMHO. Ora ho controllato il documento Tomcat e dice

NON è consigliabile posizionare gli elementi direttamente nel file server.xml

Quindi ho provato a farlo un altro metodo che mi ha suggerito.

I singoli elementi di contesto possono essere definiti esplicitamente: in un singolo file in /META-INF/context.xml all'interno dei file dell'applicazione.

Quindi ho creato un /META-INF/context.xmlcon il seguente codice,

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

Ma dopo la distribuzione quando ho riavviato il server non è ancora riuscito a caricare il contesto in "/", lo ha comunque caricato con il "/<WEB_APP_NAME>"

Qualsiasi suggerimento utile.



1
Il motivo "NON è consigliabile posizionare gli elementi direttamente nel file server.xml" indicato nei documenti segue nella frase successiva: "Questo perché rende la modifica della configurazione del contesto più invasiva poiché il file conf / server.xml principale non può ricaricare senza riavviare Tomcat. " La risposta accettata di seguito risolve direttamente il problema, ma se non si rischia di modificare nuovamente questo percorso o il riavvio non è troppo dannoso, la modifica di server.xml non sembra così irragionevole.
rimsky,

Risposte:


236

Quello che puoi fare è il seguente;

Aggiungere un file chiamato ROOT.xmlin<catalina_home>/conf/Catalina/localhost/

Questo ROOT.xml sovrascriverà le impostazioni predefinite per il contesto root dell'installazione tomcat per quel motore e host (Catalina e localhost).

Immettere quanto segue nel file ROOT.xml;

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

Ecco <yourApp>il nome della tua app .. :)

Ed ecco fatto, l'applicazione è ora l'applicazione predefinita e verrà visualizzata http://localhost:8080

Tuttavia, c'è un effetto collaterale; l'applicazione verrà caricata due volte. Una volta per localhost:8080e una volta per localhost:8080/yourApp. Per risolvere questo problema puoi mettere la tua applicazione ESTERNA <catalina_home>/webappse utilizzare un percorso relativo o assoluto nel tag docBase di ROOT.xml. Qualcosa come questo;

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

E poi dovrebbe essere tutto a posto!


32
Hai votato? Ok ma perche? Se esiste un'alternativa migliore, fammelo sapere! : D
Paaske,

1
Funzionerà con altre guerre nella normale cartella webapps?
chrislovecnm,

5
Per risolvere la doppia distribuzione è anche possibile impostare sia "deployOnStartup" che "autoDeploy" false dell'attributo Host in server.xml
Sefler

8
Ho scoperto che se non si rinomina la cartella ROOT predefinita in / webapps "il gatto torna" e reimposta il docBase in ROOT.xml. Questo è con il server di sviluppo vfabric tc di VMWare ... Attenzione.
hoserdude,

3
Sembra che Tomcat 7 non consentirà un docBase all'interno di / webapps ora, quindi sembrerebbe obbligatorio individuare il file di guerra altrove.
Mojo,

12

Ecco le uniche soluzioni che hanno funzionato per me. Aggiungi questo al nodo Host in conf / server.xml

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

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

</Context>

vai al file Tomcat server.xml e imposta il percorso vuoto


1
sarà a server.xmlo context.xml? vedo un tag xml <Context>nel miocontext.xml
Saif

6
Esiste anche un tag xml di contesto in server.xml Tuttavia l'utilizzo di server.xml per la definizione del contesto è sconsigliato
İsmail Yavuz,

4

In Tomcat 9.0, devo solo modificare quanto segue in server.xml

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

per

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

3

Questo piccolo codice ha funzionato per me, usando host virtuali

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>

Questo è dentro server.xml? Secondo ad esempio Ali.Mojtehedy sopra questo è problematico. Inoltre, altre risposte affermano che /path/todeve essere al di fuori del normale percorso delle webapps.
Jean Jordaan,

Sembra funzionare bene. Ovviamente, non vuoi che l'applicazione ROOT esista nella stessa cartella di webapps in conflitto con la tua.
Anthony Hayward,

2

La soluzione più rapida e potrebbe essere la migliore è avere contenuti di seguito in <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

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

E la tua webapp sarà disponibile all'indirizzo http://<host>:<port>/


1
Quella directory docBase è assoluta o relativa a una cartella specifica?
Jose Martinez,

3
Ho provato questo, ma non funziona. Ho un app chiamata Foobara /opt/tomcat/webapps/Foobar. Ho provato a impostare docBase su Foobare anche /opt/tomcat/webapps/Foobar, ma quando vado su `http: // <host>: <porta> / vedo ancora la home page di Tomcat invece della mia app Foobar. Ho anche riavviato Tomcat. Che cosa sto facendo di sbagliato?
Kimbaudi,

Quando rendo nullo il percorso non raggiunge la mia app):
Snickers3192

1

Ho riscontrato questo problema per un mese, Mettere il tag di contesto all'interno di server.xml non è sicuro, influisce sugli elementi di contesto che si distribuiscono per tutti gli altri host, per le grandi app richiede errori di connessione e non un buon isolamento, ad esempio puoi accedere ad altri siti con il nome della cartella domain2 .com / domain1Folder !! anche le connessioni alla sessione del database sono state caricate due volte! l'altro modo è mettere il file ROOT.xml che ha un tag di contesto con percorso completo come:

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

in conf / catalina / webappsfoldername e distribuire il file di guerra come ROOT.war all'interno di webappsfoldername e specificare anche tale host

 <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>

In questo approccio anche per le app dello stesso tipo le sessioni utente non hanno un buon isolamento! è possibile all'interno di app1 se app1 è uguale a app2 dopo l'accesso mediante sessione lato server è possibile accedere automaticamente ad app2 ?! Quindi devi mantenere la sessione degli utenti nella cache lato client e non con jsessionid! potremmo cambiare il nome del motore da localhost per risolverlo. ma supponiamo che giocare con Tomcat abbia bisogno di più tempo rispetto a giocare con altri gatti!


1

Non è consigliabile aggiornare la configurazione del server come server.xml o ROOT.xml.

È possibile inserire un file di configurazione context.xml nella directory META-INF dell'applicazione Web, con l'impostazione del percorso di contesto inclusa. Questo sostituirà l'impostazione predefinita del server?

vale a dire:

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

1

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

vai al file Tomcat server.xml e imposta il percorso vuoto


1

Tomcat 8: dopo molte ricerche questo è solo un codice funzionante: in 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>

Riavvia Tomcat, assicurati che quando accedi a 127.0.0.1:8080, verrà visualizzato il contenuto in 127.0.0.1:8080/apple

Il mio progetto era una strega di applicazioni web java creata da netbeans, ho impostato il percorso di contesto nella configurazione del progetto, nient'altro, persino ho messo apple.war nella cartella webapps.


1

Per me entrambe le risposte hanno funzionato.

  1. Aggiunta di un file chiamato ROOT.xml in / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Aggiunta della voce in 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 dichiari docBase nel contesto, ignora appBase sull'host.

  1. Comunque ho preferito convertire il mio nome di guerra come ROOT.ware metterlo sotto webapps. Quindi ora richieste di url senza eguali da altre guerre (percorsi di contesto) atterreranno in questa guerra. Questo è il modo migliore per gestire il percorso di contesto ROOT ("/ **").

La seconda opzione è (doppia) anche il caricamento delle guerre dalla cartella Webapps. Inoltre ha solo bisogno di cartelle di guerra non compresse che è un mal di testa.




1

In Tomcat 8.X, sotto home directory / conf / tomcat in server.xml è possibile aggiungere <Context>tag sotto <Host>tag come mostrato di seguito. Ma devi riavviare il server per avere effetto

  <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>

OPPURE se si utilizza Tomcat 7.X è possibile aggiungere il file context.xml nella cartella WEB-INF nel progetto. Il contenuto del file che ho usato è come mostrato. e ha funzionato bene per me. in questo caso non è necessario riavviare il server.

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

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

Testato in tomcat: finestra mobile 9.0 e funziona come 8.0 menzionato. localhost:8080/<Your App Directory Name>/ed localhost:8080/<your app path you wish>/entrambi questi 2 URL funzionano contemporaneamente. Ho trovato queste due cartelle estratte sotto $CATALINA_HOME/webapps/.
niaomingjian,

1

Di seguito la soluzione più semplice e flessibile: Inside $ {Tomcat_home} /config/server.xml

Modifica autoDeploy = "false" deployOnStartup = "false" in Elemento host come sotto Questo è necessario.

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

Aggiungi sotto la riga in Elemento host .

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

Con l'approccio sopra possiamo aggiungere quante più applicazioni sotto webapp con nomi di percorsi di contesto diversi.


Una soluzione alternativa senza doinf sopra la configurazione è semplicemente rinominare il file di guerra in root.war e inserirlo nella directory di webapps. Il percorso di contesto automatico verrà impostato su /.
Ravi Gupta,

-6

Il trucco di seguito ha funzionato per me.

1) Commenta / elimina la configurazione seguente dal file server.xml (all'interno della cartella conf) di tomcat.

2) Elimina la cartella ROOT esistente (se presente) all'interno della cartella webcats di tomcat. E rinominare il file di guerra (ad esempio: test.war) in ROOT.war.

Ricorda che durante la ridenominazione del file di guerra in ROOT.war "ROOT" dovrebbe essere in maiuscolo.

Limitazione: è possibile distribuire una sola applicazione all'interno di un'istanza di Tomcat.


3
Dalla domanda: "So che posso rinominare il mio webapp (o il suo file WAR) in ROOT ma questo è un modo terribile per farlo, IMHO."
Jean Jordaan,

1
Non vorrei limitarmi a usare una sola webapp per istanza di Tomcat.
ulrich
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.