So legen Sie den Kontextpfad einer Webanwendung in Tomcat 7.0 fest

162

Ich weiß, dass ich meine Webanwendung (oder die WAR-Datei) in ROOT umbenennen kann, aber dies ist meiner Meinung nach ein schrecklicher Weg, dies zu tun. Jetzt habe ich das Tomcat-Dokument ausgecheckt und es steht

Es wird NICHT empfohlen, Elemente direkt in der Datei server.xml zu platzieren

Also habe ich versucht, es mit einer anderen Methode zu machen, die es vorgeschlagen hat.

Einzelne Kontextelemente können explizit definiert werden: In einer einzelnen Datei unter /META-INF/context.xml innerhalb der Anwendungsdateien.

Also habe ich einen /META-INF/context.xmlmit folgendem Code erstellt:

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

Nach der Bereitstellung beim Neustart des Servers konnte der Kontext jedoch immer noch nicht mit "/" geladen werden. Er wurde weiterhin mit dem geladen "/<WEB_APP_NAME>"

Alle Hinweise hilfreich.

Chantz
quelle
1
Der in den Dokumenten angegebene Grund "Es wird NICHT empfohlen, Elemente direkt in der Datei server.xml zu platzieren" im folgenden Satz lautet: "Dies liegt daran, dass das Ändern der Kontextkonfiguration invasiver wird, da die Hauptdatei conf / server.xml dies nicht kann neu geladen werden, ohne Tomcat neu zu starten. " Die unten akzeptierte Antwort löst das Problem direkt. Wenn Sie diesen Pfad jedoch wahrscheinlich nicht erneut ändern oder Neustarts nicht zu störend sind, erscheint das Ändern der Datei server.xml nicht allzu unangemessen.
Rimsky

Antworten:

236

Was Sie tun können, ist das Folgende;

Fügen Sie eine Datei mit dem Namen ROOT.xmlin<catalina_home>/conf/Catalina/localhost/

Diese ROOT.xml überschreibt die Standardeinstellungen für den Stammkontext der Tomcat-Installation für diese Engine und diesen Host (Catalina und localhost).

Geben Sie Folgendes in die Datei ROOT.xml ein.

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

Hier <yourApp>ist der Name Ihrer App. :)

Und los geht's, Ihre Anwendung ist jetzt die Standardanwendung und wird am angezeigt http://localhost:8080

Es gibt jedoch eine Nebenwirkung; Ihre Anwendung wird zweimal geladen. Einmal für localhost:8080und einmal für localhost:8080/yourApp. Um dies zu beheben, können Sie Ihre Anwendung AUSSEN platzieren <catalina_home>/webappsund einen relativen oder absoluten Pfad im docBase-Tag von ROOT.xml verwenden. Etwas wie das;

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

Und dann sollte alles in Ordnung sein!

Paaske
quelle
32
Abgestimmt? OK, aber warum? Wenn es eine bessere Alternative gibt, lass es mich auch wissen! : D
Paaske
1
Funktioniert dies mit anderen Kriegen im regulären Webapps-Ordner?
chrislovecnm
5
Um die Doppelbereitstellung zu lösen, können Sie auch "deployOnStartup" und "autoDeploy" für das Host-Attribut in der Datei server.xml
Sefler
8
Ich habe festgestellt, dass, wenn Sie den Standard-ROOT-Ordner unter / webapps nicht umbenennen, "die Katze zurückkommt" und die docBase in der Datei ROOT.xml zurückgesetzt wird. Dies ist mit dem vfabric tc-Entwicklungsserver von VMWare möglich ... Seien Sie gewarnt.
Hoserdude
3
Es scheint, dass Tomcat 7 jetzt keine docBase in / webapps zulässt, daher scheint es obligatorisch zu sein, die Kriegsdatei an einer anderen Stelle zu suchen.
Mojo
12

Hier folgen die einzigen Lösungen, die für mich funktioniert haben. Fügen Sie dies dem Host-Knoten in der Datei conf / server.xml hinzu

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

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

</Context>

Wechseln Sie zur Datei Tomcat server.xml und setzen Sie den Pfad leer

Rodvlopes
quelle
1
wird bei server.xmloder sein context.xml? Ich sehe ein XML-Tag <Context>in meinemcontext.xml
Saif
6
Es gibt auch ein Kontext-XML-Tag in server.xml. Von der Verwendung von server.xml zur Kontextdefinition wird jedoch abgeraten
İsmail Yavuz
4

In Tomcat 9.0 muss ich im Folgenden nur Folgendes ändern server.xml

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

zu

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

Dieser kleine Code funktionierte für mich mit virtuellen Hosts

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>
Jorge Sanchez
quelle
Das ist in server.xml? Laut zB Ali.Mojtehedy oben ist das problematisch. Andere Antworten geben außerdem an, dass /path/tosie außerhalb des normalen Webapps-Pfads liegen müssen.
Jean Jordaan
Scheint gut zu funktionieren. Natürlich möchten Sie nicht, dass die ROOT-Anwendung im selben Webapps-Ordner vorhanden ist, um Konflikte mit Ihrer zu verursachen.
Anthony Hayward
2

Am schnellsten und möglicherweise am besten ist es, den folgenden Inhalt zu haben <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

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

Und Ihre Webapp wird unter verfügbar sein http://<host>:<port>/

Rajesh Gheware
quelle
1
Ist das docBase-Verzeichnis absolut oder relativ zu einem bestimmten Ordner?
Jose Martinez
3
Ich habe es versucht, aber es funktioniert nicht. Ich habe eine App namens Foobarin /opt/tomcat/webapps/Foobar. Ich habe versucht, docBase auf Foobarund auch zu setzen /opt/tomcat/webapps/Foobar, aber wenn ich zu http: // <Host>: <Port> gehe, wird anstelle meiner Foobar-App immer noch die Tomcat-Startseite angezeigt. Ich habe sogar Tomcat neu gestartet. Was mache ich falsch?
Kimbaudi
Wenn ich den Pfad null mache, erreicht er meine App nicht):
Snickers3192
1

Ich war einen Monat lang mit diesem Problem konfrontiert. Das Einfügen eines Kontext-Tags in die Datei server.xml ist nicht sicher. Es wirkt sich auf die Kontextelemente aus, die für alle anderen Hosts bereitgestellt werden. Bei großen Apps sind Verbindungsfehler erforderlich, auch keine gute Isolierung. Sie können beispielsweise über den Ordnernamen domain2 auf andere Websites zugreifen .com / domain1Folder !! auch Datenbanksitzungsverbindungen werden zweimal geladen! Der andere Weg ist die Datei ROOT.xml mit einem Kontext-Tag mit vollständigem Pfad, z.

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

Geben Sie in conf / catalogina / webappsfoldername die Kriegsdatei als ROOT.war in webappsfoldername ein und geben Sie auch den Host an, z

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

Bei diesem Ansatz haben Benutzersitzungen auch für Apps des gleichen Typs keine gute Isolation! Sie können sich in App1 befinden, wenn App1 mit App2 identisch ist. Sie können sich nach der Anmeldung durch eine serverseitige Sitzung automatisch bei App2 anmelden ?! Sie müssen also die Benutzersitzung im clientseitigen Cache und nicht mit jsessionid halten! Wir können den Motornamen von localhost ändern, um ihn zu lösen. Aber sagen wir mal, das Spielen mit Kater braucht mehr Zeit als das Spielen mit anderen Katzen!

Ali.Mojtehedy
quelle
1

Es wird nicht empfohlen, die Serverkonfiguration wie server.xml oder ROOT.xml zu aktualisieren.

Sie können eine Konfigurationsdatei context.xml in das META-INF-Verzeichnis Ihrer Webanwendung einfügen, einschließlich der Einstellung für den Kontextpfad. Dadurch wird die Standardservereinstellung überschrieben.

dh:

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

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

Wechseln Sie zur Datei Tomcat server.xml und setzen Sie den Pfad leer

Vipin Yadav
quelle
1

Tomcat 8: Nach vielen Suchvorgängen ist dies nur Arbeitscode: 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>

Starten Sie Tomcat neu und stellen Sie sicher, dass beim Zugriff auf 127.0.0.1:8080 der Inhalt in 127.0.0.1:8080/apple angezeigt wird

Mein Projekt war eine Java-Webanwendung, die von NetBeans erstellt wurde. Ich habe den Kontextpfad in der Projektkonfiguration festgelegt, nichts anderes, auch wenn ich apple.war in den Ordner webapps gestellt habe.

user3600935
quelle
1

Bei mir haben beide Antworten funktioniert.

  1. Hinzufügen einer Datei mit dem Namen ROOT.xml in / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Eintrag in server.xml hinzufügen
<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>

Hinweis: Wenn Sie docBase im Kontext deklarieren, ignorieren Sie appBase auf dem Host.

  1. Ich habe es jedoch vorgezogen, meinen Kriegsnamen als zu konvertieren ROOT.warund ihn unter Webanwendungen zu platzieren. Jetzt landen unübertroffene URL-Anfragen aus anderen Kriegen (Kontextpfaden) in diesem Krieg. Dies ist eine bessere Möglichkeit, den ROOT-Kontextpfad ("/ **") zu verarbeiten.

Die zweite Option ist das (doppelte) Laden der Kriege aus dem Webapps-Ordner. Außerdem benötigt es nur einen unkomprimierten Kriegsordner, was Kopfschmerzen bereitet.

Kanagavelu Sugumar
quelle
1

In Tomcat 8.X können Sie unter tomcat-Ausgangsverzeichnis / conf / folder in server.xml ein <Context>Tag unter einem <Host>Tag hinzufügen, wie unten gezeigt. Sie müssen den Server jedoch neu starten, um wirksam zu werden

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

ODER Wenn Sie Tomcat 7.X verwenden, können Sie die Datei context.xml im Ordner WEB-INF in Ihrem Projekt hinzufügen. Der Inhalt der von mir verwendeten Datei ist wie gezeigt. und es hat gut funktioniert für mich. In diesem Fall müssen Sie den Server nicht neu starten.

<?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
quelle
Getestet in Tomcat: 9.0 Docker und es funktioniert wie von Ihnen erwähnte 8.0. localhost:8080/<Your App Directory Name>/und diese localhost:8080/<your app path you wish>/beiden URLs funktionieren gleichzeitig. Fand diese beiden extrahierten Ordner unter $CATALINA_HOME/webapps/.
Niaomingjian
1

Die einfachste und flexibelste Lösung finden Sie unten: In $ {Tomcat_home} /config/server.xml

Ändern Sie das autoDeploy = "false" deployOnStartup = "false" unter dem Host- Element wie folgt. Dies ist ein Muss.

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

Fügen Sie unter Host- Element die folgende Zeile hinzu .

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

Mit dem obigen Ansatz können wir so viele Anwendungen unter Webanwendungen mit unterschiedlichen Kontextpfadnamen hinzufügen.

Ravi Gupta
quelle
Eine alternative Lösung ohne doinf über der Konfiguration besteht darin, Ihre Kriegsdatei einfach in root.war umzubenennen und im Verzeichnis webapps abzulegen. Der automatische Kontextpfad wird automatisch auf / gesetzt.
Ravi Gupta
-6

Der folgende Trick hat bei mir funktioniert.

1) Kommentieren / löschen Sie die folgende Konfiguration aus der Datei server.xml (im Ordner conf) von tomcat.

2) Löschen Sie den vorhandenen ROOT-Ordner (falls vorhanden), der sich im Tomcat-Webanwendungsordner befindet. Und benennen Sie Ihre Kriegsdatei (zB: test.war) in ROOT.war um.

Denken Sie daran, dass beim Umbenennen der Kriegsdatei in ROOT.war "ROOT" in Großbuchstaben angegeben werden sollte.

Einschränkung: Sie können nur eine Anwendung in einer Tomcat-Instanz bereitstellen.

Kulshrest Gautam
quelle
3
Aus der Frage: "Ich weiß, dass ich meine Webanwendung (oder die WAR-Datei) in ROOT umbenennen kann, aber dies ist meiner Meinung nach ein schrecklicher Weg, dies zu tun."
Jean Jordaan
1
Ich möchte mich nicht darauf beschränken, nur eine einzige Webanwendung pro Tomcat-Instanz zu verwenden.
Ulrich