Déployer mon application à la racine dans Tomcat

132

J'ai le fichier de guerre de mon application. J'ai besoin de déployer ceci au niveau racine. L'URL actuelle est http://localhost:8080/war_name/application_name.

iamjustcoder
la source
1
Pouvez-vous préciser quel est exactement votre problème? Lorsque vous déployez un fichier war dans tomcat, l'accès à l'application s'effectue via l'URL: localhost: 8080 / war_name sans l'extension .war.
ashishjmeshram
1
Oui, vous avez raison, j'ai besoin d'accéder à mon application. " localhost / nom_application", je peux le faire lorsque je renomme mon fichier de guerre en "ROOT.war", mais il jette une exception de mémoire car la taille de mon fichier de guerre est d'environ 120 Mo
iamjustcoder
1
@ user661660 - Il semble que vous ayez un problème différent - renommer en ROOT.wardevrait fonctionner. Je suggérerais de poser une autre question sur votre OutOfMemoryException, en fournissant la trace de la pile et les détails. Vous pouvez probablement le contourner en configurant -Xmxpour la JVM.
Rob Hruska
.lang.OutOfMemoryError: PermGen space 16 mars 2011 9:52:52 AM com.ebay.kernel.logger.Logger log GRAVE: Erreur dans le thread Perfmon java.lang.OutOfMemoryError: Espace PermGen Exception dans le thread "CalClient: NotifyThreadDestroyThread-0 "java.lang.OutOfMemor yError: PermGen space Exception dans le thread" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG fr space 16 mars 2011 9:53:36 AM com.ebay.kernel.logger.Logger log SEVERE: Erreur dans Perfmon thread java.lang.OutOfMemoryError: PermGen space Exception dans le thread "CalClient: NotifyThreadDestroyThread-0" java.lang.OutOfMemor yError: PermGen space
iamjustcoder
1
@ user661660 - Peut-être que certaines des réponses à cette question peuvent vous aider.
Rob Hruska

Réponses:

220

Vous avez plusieurs options:

  1. Supprimez le ROOT/répertoire prêt à l'emploi de tomcat et renommez votre fichier war ROOT.waravant de le déployer.

  2. Déployez votre guerre ( à partir de votre exemple) war_name.waret configurer la racine de contexte dans conf/server.xmlutiliser votre fichier de guerre:

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

Le premier est plus facile, mais un peu plus kludgy. Le second est probablement la manière la plus élégante de le faire.

Rob Hruska
la source
3
Si Tomcat est configuré pour le déploiement automatique, vous n'avez pas à vous soucier de l'option 2.
Buhake Sindi
4
@Dejel - Rien techniquement. Je l'ai fait pas mal moi-même; Il fait le travail. C'est juste un peu bizarre de devoir renommer votre propre fichier de guerre en quelque chose qui est une sorte de détail d'implémentation du conteneur.
Rob Hruska
4
Selon le lien que vous avez fourni, il n'est PAS recommandé de placer les éléments <Context> directement dans le fichier server.xml
Nilesh
6
Cette réponse recommande une technique qui est explicitement mentionnée dans la documentation comme mauvaise forme. La technique appropriée est détaillée ici: stackoverflow.com/questions/41263245/…
Christopher Schultz
5
+1 pour l'appeler ROOT.war. Selon la documentation Tomcat, vous devez être très prudent lorsque vous spécifiez "chemin" pour éviter le double déploiement: "Même lors de la définition statique d'un contexte dans server.xml, cet attribut ne doit pas être défini à moins que la docBase ne se trouve sous l'hôte appBase ou les deux deployOnStartup et autoDeploy sont faux. Si cette règle n'est pas suivie, un double déploiement est susceptible de se produire. " - de tomcat.apache.org/tomcat-8.0-doc/config/context.html
Anthony Hayward
31

sur tomcat v.7 (installation vanilla)

dans votre conf / server.xml, ajoutez le bit suivant vers la fin du fichier, juste avant la </Host>balise de fermeture:

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

Notez cet attribut docBase . C'est le plus important. Vous assurez-vous d'avoir déployé app_name avant de modifier votre application Web racine, ou copiez simplement votre webapp décompressée (app_name) dans le dossier webapps de votre tomcat. Démarrage, visitez root, voyez votre app_name là-bas!

Peter Perháč
la source
13

Dans tomcat 7 avec ces changements, je peux accéder à myAPP à / et ROOT à / 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>

Ajoutez ci-dessus à la <Host>section dans server.xml

Sudheer Palyam
la source
3
Un chemin de contexte doit être une chaîne vide ou commencer par un «/». Le chemin [ROOT] ne répond pas à ces critères et a été remplacé par [/ ROOT]
Nikita Bosik
11

Je sais que ma réponse recoupe en quelque sorte certaines des autres réponses, mais c'est une solution complète qui présente certains avantages. Cela fonctionne sur Tomcat 8:

  1. L'application principale est servie depuis la racine
  2. Le déploiement des fichiers war via l'interface Web est maintenu.
  3. L'application principale fonctionnera sur le port 80 tandis que seuls les administrateurs ont accès aux dossiers de gestion (je me rends compte que les systèmes * nix nécessitent un superutilisateur pour la liaison à 80, mais sous Windows, ce n'est pas un problème).

Cela signifie que vous ne devez redémarrer le tomcat qu'une seule fois, et après la mise à jour, les fichiers war peuvent être déployés sans problème.

Étape 1: Dans le fichier server.xml, recherchez l'entrée de connecteur et remplacez-la par:

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

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

Étape 2: Définissez les contextes dans la <Host ...>balise:

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

Notez que j'ai adressé toutes les applications dans le dossier webapp. Le premier fait basculer efficacement la racine et l'application principale de la position. ROOT est maintenant activé http://example.com/ROOTet l'application principale est activée http://example.com/. Les applications Web protégées par mot de passe nécessitent l' privileged="true"attribut.

Lorsque vous déployez un fichier CAS.war qui correspond à la racine ( <Context path="/" docBase="CAS">vous devez recharger celui-ci dans le panneau d'administration car il ne s'actualise pas avec le déploiement.

N'incluez pas le <Context path="/CAS" docBase="CAS">dans vos contextes car cela désactive l'option du gestionnaire pour déployer les fichiers war. Cela signifie que vous pouvez accéder à l'application de deux manières: http://example.com/ethttp://example.com/APP/

Étape 3: Afin d'empêcher tout accès indésirable au dossier racine et gestionnaire, ajoutez un valveà ces balises de contexte comme ceci:

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

Cela limite essentiellement l'accès au dossier de l'application Web d'administration aux personnes de mon propre domaine (fausse adresse IP) et de l'hôte local lorsqu'ils utilisent le port par défaut 8080 et maintient la possibilité de déployer dynamiquement les fichiers de guerre via l'interface Web.

Si vous souhaitez l'utiliser pour plusieurs applications utilisant des adresses IP différentes, vous pouvez ajouter l'adresse IP au connecteur ( address="143.21.2.1").

Si vous souhaitez exécuter plusieurs applications Web à partir de la racine, vous pouvez dupliquer la balise de service (utiliser un nom différent pour la seconde) et modifier la docbase de la <Context path="/" docBase="CAS">par exemple <Context path="/" docBase="ICR">.

KimvdLinde
la source
6

Le moyen le plus rapide.

  1. Assurez-vous que l'application ROOT n'est pas déployée, annulez le déploiement si vous en avez une

  2. Renommez votre guerre en ROOT.war, déployez, c'est tout, aucune modification de configuration n'est nécessaire

Dima
la source
6

Supprimer $CATALINA_HOME/webapps/ROOT. Mettez à jour $CATALINA_HOME/conf/server.xml, assurez-vous que l'élément Host ressemble au texte suivant:

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

Il fonctionne avec Tomcat 8. autoDeploy et deployOnStartup doivent être définis sur false pour empêcher tomcat de se déployer myAppdeux fois.

Jingguo Yao
la source
J'ai essayé de télécharger le WAR et cela n'a pas fonctionné. Est-ce uniquement pour les guerres explosées?
logixplayer
J'ai essayé de télécharger le WAR et cela n'a pas fonctionné sur la base de l'exemple de @ Jingguo. Est-ce uniquement pour les guerres explosées? EDIT: C'est en effet UNIQUEMENT pour les guerres explosées. Pourquoi est-ce? Puis-je ne pas simplement télécharger le WAR et éviter cette double étape? Comment puis-je le faire fonctionner?
logixplayer
@logixplayer. Ma solution fonctionne avec WAR. Je ne l'ai pas fait exploser. J'ai oublié de mentionner que $CATALINA_HOME/webapps/ROOTdoit être supprimé. Veuillez le supprimer et réessayer.
Jingguo Yao
J'ai supprimé la racine comme vous l'avez dit. J'ai déployé mon WAR (répertoire non éclaté). J'ai remarqué qu'un nouveau répertoire ROOT a été créé avec mon contenu, par exemple WEB-INF. Le site est en cours d'exécution. Est-ce ainsi que cela doit fonctionner?
logixplayer
J'ai également essayé cette méthode et tout cela lorsque j'essaye d'ouvrir la page dans le navigateur, cela ne cesse d'attendre le serveur. Le catalina.out indique seulement que le serveur a été démarré.
Asu
1

En plus du sol de @Rob Hruska, ce paramètre dans la section interne de server.xml fonctionne:

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

Remarque: override = "true" peut être requis dans certains cas.

AVM
la source
vous n'avez pas mentionné où mettre cela. La réponse de @Sudheer Palyam a été utile.
Kannan Ramamoorthy
1

En ajoutant à la réponse de @Dima , si vous utilisez mavenpour construire votre package, vous pouvez lui dire de définir le nom de votre fichier WAR sur ROOTin pom.xml:

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

Par défaut, tomcatdéploiera l'application ROOT.warWeb dans le contexte racine ( /).

Ali Tou
la source
0

ouvrez l'url du gestionnaire tomact: - http: // localhost: 8080 / manager / html /
puis dans les applications, vous voyez une application ayant un chemin comme "/" est déployée
simplement Annuler le déploiement. Renommez le fichier war de votre application en ROOT.war et placez -le simplement au chemin: - démarrez votre Tomcat Aucune configuration supplémentaire n'est nécessaire. Nous pouvons maintenant voir la page d'accueil de notre application ou l'URL configurée à l' adresse http: // localhost: 8080
entrez la description de l'image ici
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps

Anurag_BEHS
la source
-1

Dans mon serveur, j'utilise ceci et le déploiement automatique de racine fonctionne très bien:

   <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
la source
Cela ne se déploiera pas vers / mais vers / mysite
tine2k