Comment définir le chemin de contexte d'une application Web dans Tomcat 7.0

162

Je sais que je peux renommer ma webapp (ou son fichier WAR) en ROOT mais c'est une façon terrible de le faire, à mon humble avis . Maintenant, j'ai vérifié le document tomcat et il dit

Il n'est PAS recommandé de placer des éléments directement dans le fichier server.xml

J'ai donc essayé de faire une autre méthode qu'il suggérait.

Les éléments de contexte individuels peuvent être définis explicitement: dans un fichier individuel à /META-INF/context.xml à l'intérieur des fichiers d'application.

J'ai donc créé un /META-INF/context.xmlavec le code suivant,

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

Mais après le déploiement lorsque j'ai redémarré le serveur, il n'a toujours pas réussi à charger le contexte à "/", il l'a toujours chargé avec le "/<WEB_APP_NAME>"

Tous les pointeurs utiles.

Chantz
la source
1
La raison "Il n'est PAS recommandé de placer des éléments directement dans le fichier server.xml" donnée dans la documentation suit dans la phrase suivante: "C'est parce que cela rend la modification de la configuration du contexte plus invasive puisque le fichier principal conf / server.xml ne peut pas être rechargé sans redémarrer Tomcat. " La réponse acceptée ci-dessous résout directement le problème, mais si vous n'êtes pas susceptible de modifier à nouveau ce chemin ou si les redémarrages ne sont pas trop perturbateurs, modifier le server.xml ne semble pas si déraisonnable.
rimsky

Réponses:

236

Voici ce que vous pouvez faire:

Ajouter un fichier appelé ROOT.xmldans<catalina_home>/conf/Catalina/localhost/

Ce ROOT.xml remplacera les paramètres par défaut pour le contexte racine de l'installation tomcat pour ce moteur et cet hôte (Catalina et localhost).

Entrez ce qui suit dans le fichier ROOT.xml;

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

Voici <yourApp>le nom de votre application .. :)

Et voilà, votre application est maintenant l'application par défaut et apparaîtra sur http://localhost:8080

Cependant, il y a un effet secondaire; votre application sera chargée deux fois. Une fois pour localhost:8080et une fois pour localhost:8080/yourApp. Pour résoudre ce problème, vous pouvez placer votre application à L'EXTÉRIEUR <catalina_home>/webappset utiliser un chemin relatif ou absolu dans la balise docBase de ROOT.xml. Quelque chose comme ça;

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

Et puis tout devrait être OK!

Paaske
la source
32
Down voté? D'accord mais pourquoi? S'il y a une meilleure alternative, faites-le moi savoir aussi! : D
Paaske
1
Cela fonctionnera-t-il avec d'autres guerres dans le dossier Webapps normal?
chrislovecnm
5
Pour résoudre le double déploiement, vous pouvez également définir à la fois "deployOnStartup" et "autoDeploy" false de l'attribut Host dans le server.xml
Sefler
8
J'ai trouvé que si vous ne renommez pas le dossier ROOT par défaut sous / webapps "le chat revient" et il réinitialise la docBase dans ROOT.xml. C'est avec le serveur de développement vfabric tc de VMWare ... Soyez averti.
hoserdude
3
Il semble que Tomcat 7 n'autorisera pas une docBase dans / webapps maintenant, il semblerait donc obligatoire de localiser le fichier war ailleurs.
Mojo
12

Voici les seules solutions qui ont fonctionné pour moi. Ajoutez ceci au nœud hôte dans le fichier conf / server.xml

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

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

</Context>

Accédez au fichier Tomcat server.xml et définissez le chemin d'accès vide

rodvlopes
la source
1
sera à server.xmlou context.xml? je vois une balise xml <Context>dans moncontext.xml
Saif
6
Il existe également une balise context xml dans server.xml, mais l'utilisation de server.xml pour la définition du contexte est déconseillée
İsmail Yavuz
4

Dans Tomcat 9.0, je n'ai qu'à modifier ce qui suit dans le server.xml

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

à

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

Ce petit code a fonctionné pour moi, en utilisant des hôtes virtuels

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>
Jorge Sanchez
la source
C'est dans server.xml? Selon par exemple Ali.Mojtehedy ci-dessus, c'est problématique. En outre, d'autres réponses indiquent qu'il /path/todoit être en dehors du chemin normal des applications Web.
Jean Jordaan
Semble bien fonctionner. Bien sûr, vous ne voulez pas que l'application ROOT existe dans le même dossier Webapps pour entrer en conflit avec le vôtre.
Anthony Hayward
2

La solution la plus rapide et peut-être la meilleure est d'avoir un contenu en dessous <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

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

Et votre webapp sera disponible sur http://<host>:<port>/

Rajesh Gheware
la source
1
Ce répertoire docBase est-il absolu ou relatif à un dossier spécifique?
Jose Martinez
3
J'ai essayé cela, mais cela ne fonctionne pas. J'ai une application appelée Foobarà /opt/tomcat/webapps/Foobar. J'ai essayé de définir docBase sur Foobaret aussi /opt/tomcat/webapps/Foobar, mais quand je vais sur `http: // <hôte>: <port> / je vois toujours la page d'accueil de Tomcat au lieu de mon application Foobar. J'ai même redémarré Tomcat. Qu'est-ce que je fais mal?
kimbaudi
Quand je rends le chemin nul, il n'atteint pas mon application):
Snickers3192
1

J'ai fait face à ce problème pendant un mois, mettre une balise de contexte dans server.xml n'est pas sûr, cela affecte les éléments de contexte se déployant pour tous les autres hôtes, pour les grandes applications, il faut des erreurs de connexion également pas une bonne isolation, par exemple, vous pouvez accéder à d'autres sites par nom de dossier domain2 .com / domain1Folder !! également les connexions de session de base de données chargées deux fois! l'autre façon est de mettre le fichier ROOT.xml qui a une balise de contexte avec un chemin complet tel que:

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

dans conf / catalina / webappsfoldername et déployez le fichier war en tant que ROOT.war à l'intérieur de webappsfoldername et spécifiez également l'hôte tel

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

Dans cette approche, les sessions utilisateur des applications de même type n'ont pas une bonne isolation! vous pouvez à l'intérieur de app1 si app1 identique à app2, vous pouvez après la connexion par session côté serveur automatiquement vous connecter à app2?! Vous devez donc garder la session des utilisateurs dans le cache côté client et non avec jsessionid! nous pouvons changer le nom du moteur de localhost pour le résoudre. mais disons que jouer avec tomcat nécessite plus de temps que jouer avec d'autres chats!

Ali.Mojtehedy
la source
1

Il n'est pas recommandé de mettre à jour la configuration du serveur comme server.xml ou ROOT.xml.

Vous pouvez placer un fichier de configuration context.xml dans le répertoire META-INF de votre application Web, avec le paramètre de chemin de contexte inclus. Cela remplacera le paramètre par défaut du serveur?

c'est à dire:

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

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

Accédez au fichier Tomcat server.xml et définissez le chemin d'accès vide

Vipin Yadav
la source
1

Tomcat 8: Après de nombreuses recherches, il ne s'agit que de code fonctionnel: dans 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>

Redémarrez Tomcat, assurez-vous que lorsque vous accédez à 127.0.0.1:8080, il affichera le contenu dans 127.0.0.1:8080/apple

Mon projet était une application web java créée par netbeans, j'ai défini le chemin de contexte dans la configuration du projet, rien d'autre, même j'ai mis apple.war dans le dossier webapps.

user3600935
la source
1

Pour moi, les deux réponses ont fonctionné.

  1. Ajout d'un fichier appelé ROOT.xml dans / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Ajout d'une entrée dans 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>

Remarque: lorsque vous déclarez docBase sous contexte, ignorez appBase sur l'hôte.

  1. Cependant, j'ai préféré convertir mon nom de guerre ROOT.waret le placer sous des applications Web. Alors maintenant, les demandes d'URL inégalées d'autres guerres (chemins de contexte) vont atterrir dans cette guerre. C'est une meilleure façon de gérer le chemin de contexte ROOT ("/ **").

La deuxième option consiste également à (doubler) le chargement des wars à partir du dossier Webapps. De plus, il n'a besoin que d'un dossier de guerre non compressé, ce qui est un casse-tête.

Kanagavelu Sugumar
la source
1

Dans Tomcat 8.X, sous le répertoire de base de tomcat / conf / folder dans server.xml, vous pouvez ajouter une <Context>balise sous la <Host>balise comme indiqué ci-dessous. Mais vous devez redémarrer le serveur pour prendre effet

  <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 si vous utilisez Tomcat 7.X, vous pouvez ajouter le fichier context.xml dans le dossier WEB-INF de votre projet. Le contenu du fichier que j'ai utilisé est comme indiqué. et cela a bien fonctionné pour moi. vous n'avez pas besoin de redémarrer le serveur dans ce cas.

<?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
la source
Testé dans tomcat: 9.0 docker et il fonctionne comme 8.0 que vous avez mentionné. localhost:8080/<Your App Directory Name>/et localhost:8080/<your app path you wish>/ces deux URL fonctionnent en même temps. J'ai trouvé ces deux dossiers extraits sous $CATALINA_HOME/webapps/.
niaomingjian le
1

La solution la plus simple et flexible est ci-dessous: Inside $ {Tomcat_home} /config/server.xml

Modifiez l' autoDeploy = "false" deployOnStartup = "false" sous l' élément Host comme ci-dessous. Ceci est indispensable.

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

Ajoutez ci-dessous la ligne sous l' élément hôte .

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

Avec l'approche ci-dessus, nous pouvons ajouter autant d'applications sous des applications Web avec différents noms de chemin de contexte.

Ravi Gupta
la source
Une autre solution sans doinf ci-dessus de la configuration consiste simplement à renommer votre fichier war en root.war et à le placer dans le répertoire webapps. Le chemin de contexte sera automatiquement défini sur /.
Ravi Gupta
-6

L'astuce ci-dessous a fonctionné pour moi.

1) Commentez / supprimez la configuration ci-dessous du fichier server.xml (dans le dossier conf) de tomcat.

2) Supprimez le dossier ROOT existant (le cas échéant) résidant dans le dossier tomcat webapps. Et renommez votre fichier war (par exemple: test.war) en ROOT.war.

N'oubliez pas que lorsque vous renommez le fichier war en ROOT.war, "ROOT" doit être en majuscules.

Limitation: vous ne pouvez déployer qu'une seule application dans une seule instance de tomcat.

Kulshrest Gautam
la source
3
De la question: "Je sais que je peux renommer ma webapp (ou son fichier WAR) en ROOT mais c'est une manière terrible de le faire, à mon humble avis."
Jean Jordaan
1
Je ne voudrais pas me limiter à n'utiliser qu'une seule application Web par instance de Tomcat.
ulrich