Bereitstellen meiner Anwendung im Stammverzeichnis in Tomcat

132

Ich habe die Kriegsakte meiner Bewerbung. Ich muss dies auf der Root-Ebene bereitstellen. Die aktuelle URL lautet http://localhost:8080/war_name/application_name.

iamjustcoder
quelle
1
Könnten Sie bitte genau angeben, was Ihr Problem ist? Wenn Sie eine War-Datei in Tomcat bereitstellen, wird auf die Anwendung über die URL: localhost: 8080 / war_name ohne die Erweiterung .war zugegriffen.
Ashishjmeshram
1
Ja, Sie haben Recht, ich muss auf meine App zugreifen. " localhost / application_name ", dies kann ich erreichen, wenn ich meine War-Datei in "ROOT.war" umbenenne, aber es wird eine Speicherausnahme ausgelöst, da meine War-Dateigröße etwa 120
MB
1
@ user661660 - Es scheint, als hätten Sie ein anderes Problem - das Umbenennen in ROOT.warsollte funktionieren. Ich würde vorschlagen, eine weitere Frage zu Ihrer OutOfMemoryExceptionPerson zu stellen und die Stapelverfolgung und die Details anzugeben. Sie können dies wahrscheinlich umgehen, indem Sie -Xmxdie JVM konfigurieren .
Rob Hruska
.lang.OutOfMemoryError: PermGen-Speicherplatz 16. März 2011, 09:52:52 Uhr com.ebay.kernel.logger.Logger-Protokoll SEVERE: Fehler im Perfmon-Thread java.lang.OutOfMemoryError: PermGen-Speicherplatz Ausnahme im Thread "CalClient: NotifyThreadDestroyThread-0 "java.lang.OutOfMemor yError: PermGen-Speicherplatz Ausnahme im Thread" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG en space 16. März 2011, 09:53:36 Uhr com.ebay.kernel.logger.Logger-Protokoll SEVERE: Fehler in Perfmon thread java.lang.OutOfMemoryError: PermGen-Speicherplatz Ausnahme im Thread "CalClient: NotifyThreadDestroyThread-0" java.lang.OutOfMemor yError: PermGen-Speicherplatz
iamjustcoder
1
@ user661660 - Vielleicht können Ihnen einige der Antworten auf diese Frage helfen.
Rob Hruska

Antworten:

220

Sie haben mehrere Möglichkeiten:

  1. Entfernen Sie das sofort einsatzbereite ROOT/Verzeichnis aus Tomcat und benennen Sie Ihre War-Datei in um, ROOT.warbevor Sie sie bereitstellen.

  2. Stellen Sie Ihren Krieg als (aus Ihrem Beispiel) bereit war_name.warund konfigurieren Sie den Kontextstamm in conf/server.xml, um Ihre Kriegsdatei zu verwenden:

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

Der erste ist einfacher, aber etwas klobiger. Der zweite ist wahrscheinlich der elegantere Weg, dies zu tun.

Rob Hruska
quelle
3
Wenn Tomcat auf automatische Bereitstellung eingestellt ist, müssen Sie sich keine Gedanken über Option 2 machen.
Buhake Sindi
4
@Dejel - Technisch nichts. Ich habe es selbst ziemlich oft gemacht; es erledigt den Job. Fühlt sich einfach ein bisschen wackelig an, wenn Sie Ihre eigene Kriegsdatei in etwas umbenennen müssen, das eine Art Implementierungsdetail des Containers darstellt.
Rob Hruska
4
Gemäß dem von Ihnen angegebenen
server.xml zu
6
Diese Antwort empfiehlt eine Technik, die in der Dokumentation ausdrücklich als schlechte Form erwähnt wird. Die richtige Technik wird hier detailliert beschrieben: stackoverflow.com/questions/41263245/…
Christopher Schultz
5
+1 für den Namen ROOT.war. Laut den Tomcat-Dokumenten müssen Sie bei der Angabe von "Pfad" sehr vorsichtig sein, um eine doppelte Bereitstellung zu vermeiden: "Selbst wenn Sie einen Kontext in server.xml statisch definieren, darf dieses Attribut nur festgelegt werden, wenn sich die docBase nicht unter der des Hosts befindet appBase oder sowohl deployOnStartup als auch autoDeploy sind falsch. Wenn diese Regel nicht befolgt wird, führt dies wahrscheinlich zu einer doppelten Bereitstellung. " - von tomcat.apache.org/tomcat-8.0-doc/config/context.html
Anthony Hayward
31

auf Tomcat v.7 (Vanille-Installation)

Fügen Sie in Ihrer Datei conf / server.xml kurz vor dem </Host>schließenden Tag am Ende der Datei das folgende Bit hinzu :

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

Beachten Sie das docBase- Attribut. Es ist das Wichtige. Sie stellen entweder sicher, dass Sie app_name bereitgestellt haben, bevor Sie Ihre Root-Web-App ändern, oder kopieren Sie einfach Ihre entpackte webapp (app_name) in den webapps-Ordner Ihres Tomcat. Start, besuchen Sie root, sehen Sie dort Ihren App-Namen!

Peter Perháč
quelle
13

In Tomcat 7 kann ich mit diesen Änderungen auf myAPP unter / und ROOT unter / ROOT zugreifen

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

Fügen Sie oben den <Host>Abschnitt in server.xml hinzu

Sudheer Palyam
quelle
3
Ein Kontextpfad muss entweder eine leere Zeichenfolge sein oder mit einem '/' beginnen. Der Pfad [ROOT] erfüllt diese Kriterien nicht und wurde in [/ ROOT] geändert
Nikita Bosik
11

Ich weiß, dass sich meine Antwort mit einigen der anderen Antworten überschneidet, aber dies ist eine vollständige Lösung, die einige Vorteile hat. Dies funktioniert unter Tomcat 8:

  1. Die Hauptanwendung wird von der Wurzel aus bedient
  2. Die Bereitstellung von Kriegsdateien über die Weboberfläche wird beibehalten.
  3. Die Hauptanwendung wird auf Port 80 ausgeführt, während nur die Administratoren Zugriff auf die Verwaltungsordner haben (mir ist klar, dass * nix-Systeme einen Superuser zum Binden an 80 benötigen, aber unter Windows ist dies kein Problem).

Dies bedeutet, dass Sie den Tomcat nur einmal neu starten müssen und nach aktualisierten Kriegsdateien problemlos bereitgestellt werden können.

Schritt 1: Suchen Sie in der Datei server.xml den Connector-Eintrag und ersetzen Sie ihn durch:

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

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

Schritt 2: Definieren Sie Kontexte innerhalb des <Host ...>Tags:

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

Beachten Sie, dass ich alle Apps im Webapp-Ordner adressiert habe. Der erste schaltet effektiv die Root- und die Haupt-App aus der Position. ROOT ist jetzt eingeschaltet http://example.com/ROOTund die Hauptanwendung ist eingeschaltet http://example.com/. Die passwortgeschützten Webanwendungen erfordern das privileged="true"Attribut.

Wenn Sie eine CAS.war-Datei bereitstellen, die mit dem Stammverzeichnis übereinstimmt ( <Context path="/" docBase="CAS">Sie müssen diese im Admin-Bereich neu laden, da sie bei der Bereitstellung nicht aktualisiert wird.

Nehmen Sie das nicht <Context path="/CAS" docBase="CAS">in Ihre Kontexte auf, da es die Manager-Option zum Bereitstellen von Kriegsdateien deaktiviert. Dies bedeutet, dass Sie auf zwei Arten auf die App zugreifen können: http://example.com/undhttp://example.com/APP/

Schritt 3: Um unerwünschten Zugriff auf den Stamm- und Managerordner zu verhindern, fügen Sie valvediesen Kontext-Tags Folgendes hinzu:

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

Dies beschränkt den Zugriff auf den Administrator-Web-App-Ordner im Wesentlichen auf Personen aus meiner eigenen Domain (gefälschte IP-Adresse) und localhost, wenn sie den Standardport 8080 verwenden, und behält die Möglichkeit bei, die War-Dateien dynamisch über die Webschnittstelle bereitzustellen.

Wenn Sie dies für mehrere Apps verwenden möchten, die unterschiedliche IP-Adressen verwenden, können Sie die IP-Adresse zum Connector hinzufügen ( address="143.21.2.1").

Wenn Sie mehr Web - Anwendungen von der Wurzel ausführen möchten, können Sie die Service - Tag - Duplikat (einen anderen Namen für die zweiten verwenden) und die Docbase der Änderung <Context path="/" docBase="CAS">zu zum Beispiel <Context path="/" docBase="ICR">.

KimvdLinde
quelle
6

Der schnellste Weg.

  1. Stellen Sie sicher, dass keine ROOT-App bereitgestellt ist, und entfernen Sie die Bereitstellung, falls vorhanden

  2. Benennen Sie Ihren Krieg in ROOT.war um, stellen Sie bereit, das ist alles, es sind keine Konfigurationsänderungen erforderlich

Dima
quelle
6

Entfernen $CATALINA_HOME/webapps/ROOT. Aktualisieren Sie $CATALINA_HOME/conf/server.xml, stellen Sie sicher, dass das Host-Element wie folgt aussieht:

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

Es funktioniert mit Tomcat 8. autoDeploy und deployOnStartup müssen auf false gesetzt werden, um zu verhindern, dass Tomcat myAppzweimal bereitgestellt wird .

Jingguo Yao
quelle
Ich habe versucht, das WAR hochzuladen, aber es hat nicht funktioniert. Gilt das nur für explodierte WARs?
Logixplayer
Ich habe versucht, das WAR hochzuladen, aber es hat nach dem Beispiel von @ Jingguo nicht funktioniert. Gilt das nur für explodierte WARs? EDIT: Es ist in der Tat nur für explodierte Kriege. Warum ist das? Kann ich nicht einfach das WAR hochladen und diesen doppelten Schritt vermeiden? Wie kann ich es zum Laufen bringen?
Logixplayer
@logixplayer. Meine Lösung funktioniert mit WAR. Ich habe es nicht explodiert. Ich habe vergessen zu erwähnen, dass $CATALINA_HOME/webapps/ROOTdas entfernt werden muss. Bitte entfernen Sie es und versuchen Sie es erneut.
Jingguo Yao
Ich habe die Wurzel entfernt, wie du gesagt hast. Ich habe mein WAR (nicht explodiertes Verzeichnis) bereitgestellt. Ich habe festgestellt, dass ein neues ROOT-Verzeichnis mit meinen Inhalten erstellt wurde, z. B. WEB-INF. Die Site wird ausgeführt. Soll das so funktionieren?
Logixplayer
Ich habe auch diese Methode ausprobiert und wenn ich versuche, die Seite im Browser zu öffnen, wartet sie nur auf den Server. Die Catalina.out sagt nur, dass der Server gestartet wurde.
Asu
1

Diese Einstellung in server.xml im Abschnitt fügt sich in @Rob Hruskas Sol ein und funktioniert wie folgt:

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

Hinweis: In einigen Fällen kann override = "true" erforderlich sein.

AVM
quelle
Sie haben nicht erwähnt, wo Sie das platzieren sollen. @ Sudheer Palyam Antwort war hilfreich.
Kannan Ramamoorthy
1

Zusätzlich zu @Dima ‚s Antwort, wenn Sie mit mavenIhrem Paket zu bauen, man kann sagen , es WAR - Datei - Namen zu setzen ROOTin pom.xml:

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

Standardmäßig tomcatwird die ROOT.warWebanwendung im Stammkontext bereitgestellt ( /).

Ali Tou
quelle
0

Öffnen Sie die URL des Tomact-Managers: - http: // localhost: 8080 / manager / html /.
In Anwendungen wird eine Anwendung mit dem Pfad "/"
angezeigt. Benennen Sie die War-Datei Ihrer Anwendung in ROOT.war um und platzieren Sie sie einfach unter folgendem Pfad: - Starten Sie Ihren Tomcat. Keine zusätzliche Konfiguration erforderlich. Jetzt können wir unsere Anwendungshomepage oder konfigurierte URL unter http: // localhost: 8080 sehen
Geben Sie hier die Bildbeschreibung ein
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps

Anurag_BEHS
quelle
-1

Auf meinem Server verwende ich dies und Root Autodeploy funktioniert einwandfrei:

   <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
quelle
Dies wird nicht auf / sondern auf / mysite
tine2k