Jak ustawić ścieżkę kontekstową aplikacji internetowej w Tomcat 7.0

162

Wiem, że mogę zmienić nazwę mojej aplikacji internetowej (lub jej pliku WAR) na ROOT, ale to okropny sposób, aby to zrobić, IMHO. Teraz sprawdziłem dokument Tomcat i mówi

NIE zaleca się umieszczania elementów bezpośrednio w pliku server.xml

Więc spróbowałem zrobić to inną metodą, którą zasugerował.

Poszczególne elementy kontekstu można jawnie zdefiniować: w indywidualnym pliku pod adresem /META-INF/context.xml wewnątrz plików aplikacji.

Więc utworzyłem /META-INF/context.xmlz następującym kodem,

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

Ale po wdrożeniu i ponownym uruchomieniu serwera nadal nie udało się załadować kontekstu w „/”, nadal ładował go za pomocą "/<WEB_APP_NAME>"

Wszelkie wskazówki są pomocne.

Chantz
źródło
1
Powód „NIE zaleca się umieszczania elementów bezpośrednio w pliku server.xml” podany w dokumentach jest następujący w następnym zdaniu: „Dzieje się tak, ponieważ sprawia, że ​​modyfikowanie konfiguracji kontekstu jest bardziej inwazyjne, ponieważ główny plik conf / server.xml nie może być ponownie załadowane bez ponownego uruchamiania Tomcata. " Zaakceptowana odpowiedź poniżej bezpośrednio rozwiązuje problem, ale jeśli nie jest prawdopodobne, aby ponownie zmodyfikować tę ścieżkę lub ponowne uruchomienie nie jest zbyt uciążliwe, modyfikacja pliku server.xml nie wydaje się aż tak nierozsądna.
rimsky

Odpowiedzi:

236

Oto co możesz zrobić;

Dodaj plik o nazwie ROOT.xmlw<catalina_home>/conf/Catalina/localhost/

Ten plik ROOT.xml zastąpi domyślne ustawienia kontekstu głównego instalacji tomcat dla tego silnika i hosta (Catalina i localhost).

Wprowadź następujące dane do pliku ROOT.xml;

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

Oto <yourApp>nazwa Twojej aplikacji… :)

I gotowe, Twoja aplikacja jest teraz domyślną aplikacją i pojawi się na http://localhost:8080

Jest jednak jeden efekt uboczny; Twoja aplikacja zostanie załadowana dwukrotnie. Raz na localhost:8080zawsze localhost:8080/yourApp. Aby to naprawić, możesz umieścić aplikację <catalina_home>/webappsNA ZEWNĄTRZ i użyć względnej lub bezwzględnej ścieżki w znaczniku docBase ROOT.xml. Coś takiego;

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

A potem powinno być wszystko OK!

Paaske
źródło
32
Głosował w dół? Dobrze ale dlaczego? Jeśli istnieje lepsza alternatywa, daj mi znać! : D
Paaske
1
Czy to zadziała z innymi wojnami w zwykłym folderze aplikacji internetowych?
chrislovecnm
5
Aby rozwiązać problem podwójnego wdrożenia, możesz również ustawić zarówno „deployOnStartup”, jak i „autoDeploy” false atrybutu Host w pliku server.xml
Sefler
8
Zauważyłem, że jeśli nie zmienisz nazwy domyślnego folderu ROOT w / webapps "kot wraca" i resetuje docBase w ROOT.xml. To jest z serwerem deweloperskim vfabric tc firmy VMWare ... Uwaga.
hoserdude
3
Wygląda na to, że Tomcat 7 nie pozwoli teraz na umieszczenie bazy docBase w / webapps, więc umieszczenie pliku wojny w innym miejscu wydaje się obowiązkowe.
Mojo
12

Oto jedyne rozwiązania, które działały dla mnie. Dodaj to do węzła hosta w pliku conf / server.xml

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

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

</Context>

przejdź do pliku Tomcat server.xml i ustaw ścieżkę pustą

rodvlopes
źródło
1
będzie o godzinie server.xmllub context.xml? widzę tag xml <Context>w moimcontext.xml
Saif
6
Istnieje również kontekstowy znacznik xml w pliku server.xml. Jednak użycie server.xml do definiowania kontekstu jest odradzane
İsmail Yavuz
4

W Tomcat 9.0 muszę tylko zmienić następujące elementy w server.xml

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

do

<Context docBase="web" path="" reloadable="true" source="org.eclipse.jst.jee.server:web"/>
MK Yung
źródło
3

Ten mały kod zadziałał dla mnie, używając wirtualnych hostów

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>
Jorge Sanchez
źródło
To jest w server.xmlśrodku? Według np. Ali.Mojtehedy powyżej jest to problematyczne. Inne odpowiedzi wskazują, że /path/tomusi znajdować się poza normalną ścieżką do aplikacji internetowych.
Jean Jordaan
Wydaje się, że działa dobrze. Oczywiście nie chcesz, aby aplikacja ROOT istniała w tym samym folderze aplikacji sieci Web, aby kolidować z Twoim.
Anthony Hayward
2

Najszybszym i być może najlepszym rozwiązaniem jest umieszczenie poniżej treści w formacie <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

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

Twoja aplikacja internetowa będzie dostępna pod adresem http://<host>:<port>/

Rajesh Gheware
źródło
1
Czy ten katalog docBase jest bezwzględny czy względny w stosunku do określonego folderu?
Jose Martinez
3
Próbowałem tego, ale to nie działa. Mam aplikację zwaną Foobarw /opt/tomcat/webapps/Foobar. Próbowałem ustawić docBase na Foobara także /opt/tomcat/webapps/Foobar, ale kiedy przechodzę do `http: // <host>: <port> / nadal widzę stronę główną Tomcat zamiast mojej aplikacji Foobar. Nawet zrestartowałem Tomcat. Co ja robię źle?
kimbaudi
Kiedy ustawiam ścieżkę na zero, nie dociera do mojej aplikacji):
Snickers3192
1

Stawiałem czoła temu problemowi przez miesiąc, Umieszczenie tagu kontekstowego wewnątrz server.xml nie jest bezpieczne, wpływa na elementy kontekstu wdrażane dla wszystkich innych hostów, w przypadku dużych aplikacji przyjmuje błędy połączenia również niezbyt dobrą izolację, na przykład możesz uzyskać dostęp do innych witryn według nazwy folderu domena2 .com / domain1Folder !! również dwukrotnie ładowane połączenia sesji bazy danych! w drugą stronę należy umieścić plik ROOT.xml, który ma tag kontekstowy z pełną ścieżką taką:

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

w conf / catalina / webappsfoldername i wdróż plik wojenny jako ROOT.war wewnątrz webappsfoldername, a także określ host taki

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

W tym podejściu również dla sesji użytkowników tego samego typu nie ma dobrej izolacji! możesz wewnątrz app1, jeśli app1 jest taki sam jak app2, możesz po zalogowaniu przez sesję po stronie serwera automatycznie zalogować się do app2?! Musisz więc utrzymywać sesję użytkowników w pamięci podręcznej po stronie klienta, a nie z jsessionid! możemy zmienić nazwę silnika z localhost, aby go rozwiązać. ale powiedzmy, że zabawa z kocurem wymaga więcej czasu niż zabawa z innymi kotami!

Ali.Mojtehedy
źródło
1

Nie zaleca się aktualizowania konfiguracji serwera, takiej jak server.xml lub ROOT.xml.

Możesz umieścić plik konfiguracyjny context.xml w katalogu META-INF aplikacji internetowej, z dołączonym ustawieniem ścieżki kontekstu. To spowoduje zastąpienie domyślnych ustawień serwera?

to znaczy:

<Context docBase="yourAppName" path="/yourAppPath" reloadable="true">
Ivan
źródło
1

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

przejdź do pliku Tomcat server.xml i ustaw ścieżkę pustą

Vipin Yadav
źródło
1

Tomcat 8: Po wielu poszukiwaniach jest to tylko działający kod: w 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>

Zrestartuj Tomcat, upewnij się, że po uzyskaniu dostępu do 127.0.0.1:8080 wyświetli zawartość w 127.0.0.1:8080/apple

Mój projekt to aplikacja webowa java stworzona przez netbeans, ustawiam ścieżkę kontekstu w konfiguracji projektu, nic innego, nawet umieściłem apple.war w folderze webapps.

user3600935
źródło
1

Dla mnie obie odpowiedzi zadziałały.

  1. Dodanie pliku o nazwie ROOT.xml w / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Dodanie wpisu w 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>

Uwaga: kiedy deklarujesz docBase w kontekście, zignoruj ​​appBase na hoście.

  1. Jednak wolałem przekonwertować moją nazwę wojny na ROOT.wari umieścić ją pod aplikacjami internetowymi. Więc teraz niedopasowane żądania adresów URL z innych wojen (ścieżek kontekstu) trafią do tej wojny. Jest to lepszy sposób obsługi ścieżki kontekstu ROOT („/ **”).

Drugą opcją jest (podwójne) ładowanie wojen z folderu Webapps. Potrzebuje tylko nieskompresowanego folderu wojennego, który jest bólem głowy.

Kanagavelu Sugumar
źródło
1

W Tomcat 8.X, w katalogu domowym tomcat / conf / folder w server.xml możesz dodać <Context>tag pod <Host>tagiem, jak pokazano poniżej. Ale musisz zrestartować serwer, aby odniosło skutek

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

LUB jeśli używasz Tomcat 7.X, możesz dodać plik context.xml do folderu WEB-INF w swoim projekcie. Zawartość pliku, którego użyłem, jest taka, jak pokazano. i działało dobrze dla mnie. w tym przypadku nie musisz restartować serwera.

<?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
źródło
Testowane w dokerze tomcat: 9.0 i działa jak wspomniałeś 8.0. localhost:8080/<Your App Directory Name>/i localhost:8080/<your app path you wish>/oba te adresy URL działają w tym samym czasie. Znalazłem te dwa wyodrębnione foldery w $CATALINA_HOME/webapps/.
niaomingjian
1

Najprostsze i elastyczne rozwiązanie znajduje się poniżej: Inside $ {Tomcat_home} /config/server.xml

Zmień autoDeploy = "false" deployOnStartup = "false" w elemencie Host , jak poniżej. Jest to konieczne.

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

Dodaj poniższy wiersz pod elementem Host .

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

Dzięki powyższemu podejściu możemy dodać dowolną liczbę aplikacji do aplikacji internetowych z różnymi nazwami ścieżek kontekstowych.

Ravi Gupta
źródło
Alternatywnym rozwiązaniem bez powyższej konfiguracji doinf jest po prostu zmiana nazwy pliku war na root.war i umieszczenie go w katalogu webapps. Ścieżka kontekstu automatycznie zostanie ustawiona na /.
Ravi Gupta
-6

Poniższa sztuczka zadziałała dla mnie.

1) Skomentuj / usuń poniższą konfigurację z pliku server.xml (w folderze conf) tomcat.

2) Usuń istniejący folder ROOT (jeśli istnieje) znajdujący się w folderze webapps tomcat. I zmień nazwę pliku wojny (np.: Test.war) na ROOT.war.

Pamiętaj, że przy zmianie nazwy pliku wojennego na ROOT.war "ROOT" powinien być pisany wielkimi literami.

Ograniczenie: w jednej instancji tomcat można wdrożyć tylko jedną aplikację.

Kulshrest Gautam
źródło
3
Z pytania: „Wiem, że mogę zmienić nazwę mojej aplikacji internetowej (lub jej pliku WAR) na ROOT, ale jest to okropny sposób, aby to zrobić, IMHO”.
Jean Jordaan
1
Nie chciałbym ograniczać się do używania tylko jednej aplikacji internetowej na instancję tomcat.
ulrich