Distribuire la mia applicazione alla radice in Tomcat


132

Ho il file di guerra della mia applicazione. Devo distribuire questo a livello di root. L'URL corrente è http://localhost:8080/war_name/application_name.


1
Potresti specificare qual è esattamente il tuo problema? Quando si distribuisce un file war in tomcat, si accede all'applicazione usando URL: localhost: 8080 / war_name senza l'estensione .war.
ashishjmeshram,

1
Sì, hai ragione, devo accedere alla mia app. " localhost / nome_applicazione", questo posso ottenere quando sto rinominando il mio file di guerra in "ROOT.war", ma sta generando un'eccezione di memoria perché la dimensione del mio file di guerra è di circa 120
MB

1
@ user661660 - Sembra che tu abbia un problema diverso: rinominare ROOT.wardovrebbe funzionare. Suggerirei di porre un'altra domanda sulla tua OutOfMemoryException, fornendo la traccia dello stack e i dettagli. Probabilmente puoi aggirarlo configurando -Xmxla JVM.
Rob Hruska,

.lang.OutOfMemoryError: PermGen space 16 mar 2011 9:52:52 AM com.ebay.kernel.logger.Logger log SEVERE: Errore nel thread Perfmon java.lang.OutOfMemoryError: PermGen space Eccezione nel thread "CalClient: NotifyThreadDestroyThread-0 "java.lang.OutOfMemor yError: PermGen space Eccezione nel thread" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG en space 16 mar 2011 9:53:36 com.ebay.kernel.logger.Logger log SEVERE: Errore in Perfmon thread java.lang.OutOfMemoryError: PermGen space Eccezione nel thread "CalClient: NotifyThreadDestroyThread-0" java.lang.OutOfMemor yError: PermGen space
iamjustcoder

1
@ user661660 - Forse alcune delle risposte a questa domanda possono aiutarti.
Rob Hruska,

Risposte:


220

Hai un paio di opzioni:

  1. Rimuovere la ROOT/directory predefinita da tomcat e rinominare il file di guerra in ROOT.warprima di distribuirlo.

  2. Distribuire la vostra guerra (dal vostro esempio) war_name.ware configurare la radice di contesto in conf/server.xmldi utilizzare il file di guerra:

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

Il primo è più semplice, ma un po 'più complicato. Il secondo è probabilmente il modo più elegante per farlo.


3
Se Tomcat è impostato per la distribuzione automatica, non devi preoccuparti dell'opzione 2.
Buhake Sindi

4
@Dejel - Niente tecnicamente. L'ho fatto un po 'da solo; ottiene il lavoro fatto. Mi sento un po 'nervoso dover rinominare il tuo file di guerra in qualcosa che è una specie di dettaglio di implementazione del contenitore.
Rob Hruska,

4
Come da link fornito NON è consigliabile posizionare gli elementi <Contesto> direttamente nel file server.xml
Nilesh

6
Questa risposta raccomanda una tecnica menzionata esplicitamente nella documentazione come forma errata. La tecnica corretta è dettagliata qui: stackoverflow.com/questions/41263245/…
Christopher Schultz,

5
+1 per averlo chiamato ROOT.war. Secondo i documenti Tomcat, è necessario prestare molta attenzione quando si specifica "percorso" per evitare una doppia distribuzione: "Anche quando si definisce staticamente un contesto in server.xml, questo attributo non deve essere impostato a meno che docBase non si trovi sotto l'host appBase o deployOnStartup e autoDeploy sono falsi. Se questa regola non viene seguita, è probabile che si verifichi una doppia distribuzione. " - da tomcat.apache.org/tomcat-8.0-doc/config/context.html
Anthony Hayward,

31

su Tomcat v.7 (installazione vanilla)

nel tuo conf / server.xml aggiungi il seguente bit verso la fine del file, appena prima del </Host>tag di chiusura:

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

Si noti che l' attributo docBase . È la parte importante. O ti assicuri di aver distribuito app_name prima di cambiare l'app Web di root, o semplicemente copi la tua webapp scompattata (app_name) nella cartella webapps di Tomcat. Avvia, visita root, vedi lì il tuo nome_app!


13

In tomcat 7 con queste modifiche, sono in grado di accedere a myAPP su / e ROOT su / 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>

Aggiungi sopra alla <Host>sezione in server.xml


3
Un percorso di contesto deve essere una stringa vuota o iniziare con un '/'. Il percorso [ROOT] non soddisfa questi criteri ed è stato modificato in [/ ROOT]
Nikita Bosik

11

So che la mia risposta è una sorta di sovrapposizione con alcune delle altre risposte, ma questa è una soluzione completa che presenta alcuni vantaggi. Questo funziona su Tomcat 8:

  1. L'applicazione principale è servita dalla radice
  2. Viene mantenuta la distribuzione di file di guerra tramite l'interfaccia Web.
  3. L'applicazione principale verrà eseguita sulla porta 80 mentre solo gli amministratori hanno accesso alle cartelle di gestione (mi rendo conto che i sistemi * nix richiedono un superutente per l'associazione a 80, ma su Windows non è un problema).

Ciò significa che è necessario riavviare Tomcat una sola volta e dopo che i file di guerra aggiornati possono essere distribuiti senza problemi.

Passaggio 1: nel file server.xml, trova la voce del connettore e sostituiscila con:

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

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

Passaggio 2: definire i contesti all'interno del <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>

Nota che ho indirizzato tutte le app nella cartella webapp. Il primo passa efficacemente dalla posizione alla radice e all'app principale. ROOT è ora attivo http://example.com/ROOTe l'applicazione principale è attiva http://example.com/. Le webapp protette da password richiedono l' privileged="true"attributo.

Quando si distribuisce un file CAS.war che corrisponde alla radice ( <Context path="/" docBase="CAS">è necessario ricaricare quello nel pannello di amministrazione poiché non si aggiorna con la distribuzione.

Non includere il <Context path="/CAS" docBase="CAS">nei tuoi contesti in quanto disabilita l'opzione manager per distribuire file di guerra. Ciò significa che puoi accedere all'app in due modi: http://example.com/ehttp://example.com/APP/

Passaggio 3: per impedire l'accesso indesiderato alla cartella principale e di gestione, aggiungere un valvea quei tag di contesto come questo:

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

Ciò limita essenzialmente l'accesso alla cartella dell'app Web dell'amministratore alle persone del mio dominio (indirizzo IP falso) e localhost quando usano la porta predefinita 8080 e mantiene la possibilità di distribuire dinamicamente i file di guerra attraverso l'interfaccia web.

Se si desidera utilizzarlo per più app che utilizzano indirizzi IP diversi, è possibile aggiungere l'indirizzo IP al connettore ( address="143.21.2.1").

Se si desidera eseguire più app Web dalla radice, è possibile duplicare il numero di servizio (utilizzare un nome diverso per il secondo) e modificare, <Context path="/" docBase="CAS">ad esempio, la base di dati di <Context path="/" docBase="ICR">.


6

Il modo più veloce

  1. Assicurati di non avere l'app ROOT distribuita, disimpiega se ne hai una

  2. Rinomina la tua guerra in ROOT.war, distribuisci, tutto qui, non sono necessarie modifiche alla configurazione


6

Rimuovi $CATALINA_HOME/webapps/ROOT. Aggiorna $CATALINA_HOME/conf/server.xml, assicurati che l'elemento Host assomigli al seguente testo:

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

Funziona con Tomcat 8. autoDeploy e deployOnStartup devono essere impostati su false per impedire a Tomcat di essere distribuito myAppdue volte.


Ho provato a caricare il WAR e non ha funzionato. Questo è solo per le GUERRE esplose?
logixplayer,

Ho provato a caricare la GUERRA e non ha funzionato sulla base dell'esempio di @ Jingguo. Questo è solo per le GUERRE esplose? EDIT: È davvero SOLO per le guerre esplose. Perchè è questo? Non posso semplicemente caricare WAR ed evitare questo doppio passaggio? Come posso farlo funzionare?
logixplayer,

@logixplayer. La mia soluzione funziona con WAR. Non l'ho fatto esplodere. Ho dimenticato di menzionare che $CATALINA_HOME/webapps/ROOTdeve essere rimosso. Rimuovilo e riprova.
Jingguo Yao,

Ho rimosso il ROOT come hai detto. Ho distribuito il mio WAR (directory non esplosa). Ho notato che è stata creata una nuova directory ROOT con le mie cose, ad esempio WEB-INF. Il sito è in esecuzione. È così che dovrebbe funzionare?
logixplayer,

Ho anche provato questo metodo e tutto quando provo ad aprire la pagina nel browser continua ad aspettare il server. Catalina.out dice solo che il server è stato avviato.
Asu,

1

Aggiungendo al sol di @Rob Hruska, questa impostazione nella sezione server.xml all'interno funziona:

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

Nota: override = "true" potrebbe essere richiesto in alcuni casi.


non hai menzionato dove metterlo. La risposta di @Sudheer Palyam è stata utile.
Kannan Ramamoorthy,

1

Aggiungendo alla risposta di @Dima , se stai usando per compilare ilmaven tuo pacchetto, puoi dirlo per impostare il nome del tuo file WAR su ROOTin pom.xml:

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

Per impostazione predefinita, tomcatdistribuirà ROOT.warwebapp nel contesto root ( /).


0

open tomact manager url: - http: // localhost: 8080 / manager / html /
quindi nelle applicazioni si vede che un'applicazione con percorso come "/" viene distribuita
semplicemente Annulla distribuzione. Rinomina il file di guerra dell'applicazione come ROOT.war e posizionalo nel percorso: - avvia Tomcat Non è necessaria alcuna configurazione aggiuntiva.
inserisci qui la descrizione dell'immagine
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps

Ora possiamo vedere la nostra home page dell'applicazione o l'URL configurato su http: // localhost: 8080


-1

Nel mio server sto usando questo e la distribuzione automatica di root funziona bene:

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

Questo non verrà distribuito su / ma su / mysite
tine2k il
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.