วิธีการตั้งค่าเส้นทางบริบทของเว็บแอปพลิเคชันใน Tomcat 7.0


162

ฉันรู้ว่าฉันสามารถเปลี่ยนชื่อ webapp ของฉัน (หรือไฟล์ WAR) เป็นROOTแต่นี่เป็นวิธีที่แย่มากที่จะทำ IMHO ตอนนี้ฉันเช็คเอาท์เอกสาร tomcat & มันบอกว่า

ไม่แนะนำให้วางองค์ประกอบโดยตรงในไฟล์ server.xml

ดังนั้นฉันจึงลองทำอีกวิธีที่มันแนะนำ

องค์ประกอบบริบทบุคคลอาจมีการกำหนดไว้อย่างชัดเจน: ในแต่ละไฟล์ที่ /META-INF/context.xml ภายในไฟล์แอปพลิเคชัน

ดังนั้นฉันสร้าง/META-INF/context.xmlด้วยรหัสต่อไปนี้

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

แต่หลังจากการปรับใช้เมื่อฉันรีสตาร์ทเซิร์ฟเวอร์ก็ยังไม่สามารถโหลดบริบทที่ "/" มันยังคงโหลดด้วย "/<WEB_APP_NAME>"

ตัวชี้ใด ๆ ที่เป็นประโยชน์



1
เหตุผล "ไม่แนะนำให้วางองค์ประกอบโดยตรงในไฟล์ server.xml" ที่ระบุในเอกสารต่อไปนี้ในประโยคถัดไป: "นี่เป็นเพราะทำให้การแก้ไขการกำหนดค่าบริบทเป็นสิ่งที่รุกรานมากขึ้นเนื่องจากไฟล์ conf / server.xml หลักไม่สามารถทำได้ สามารถโหลดซ้ำได้โดยไม่ต้องเริ่มต้น Tomcat ใหม่ " คำตอบที่ได้รับการยอมรับด้านล่างแก้ปัญหาโดยตรง แต่ถ้าคุณไม่น่าจะแก้ไขเส้นทางนี้อีกครั้งหรือการรีสตาร์ทนั้นไม่ทำให้เกิดความยุ่งยากเกินไปการแก้ไข server.xml ดูเหมือนจะไม่สมเหตุสมผลทั้งหมด
rimsky

คำตอบ:


236

สิ่งที่คุณสามารถทำได้มีดังต่อไปนี้

เพิ่มไฟล์ที่เรียกว่าROOT.xmlใน<catalina_home>/conf/Catalina/localhost/

ROOT.xml นี้จะแทนที่การตั้งค่าเริ่มต้นสำหรับบริบทรูทของการติดตั้ง tomcat สำหรับเอ็นจิ้นและโฮสต์นั้น (Catalina และ localhost)

ป้อนสิ่งต่อไปนี้ในไฟล์ ROOT.xml

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

นี่<yourApp>คือชื่อแอพของคุณ .. :)

แอปพลิเคชันของคุณจะเป็นแอปพลิเคชั่นเริ่มต้นและจะปรากฏขึ้น http://localhost:8080

อย่างไรก็ตามมีผลข้างเคียงหนึ่งอย่าง ใบสมัครของคุณจะถูกโหลดสองครั้ง ครั้งเดียวสำหรับและอีกครั้งสำหรับlocalhost:8080 localhost:8080/yourAppในการแก้ไขปัญหานี้คุณสามารถใส่แอปพลิเคชันของคุณด้านนอก<catalina_home>/webappsและใช้เส้นทางสัมพัทธ์หรือพา ธ สัมบูรณ์ในแท็ก docBase ของ ROOT.xml บางสิ่งเช่นนี้

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

แล้วมันก็ควรจะตกลงทั้งหมด!


32
โหวตลงไหม ตกลง แต่ทำไม หากมีทางเลือกที่ดีกว่าให้ฉันรู้ด้วย! : D
Paaske

1
จะสามารถใช้งานร่วมกับสงครามอื่น ๆ ในโฟลเดอร์ webapps ปกติได้หรือไม่
chrislovecnm

5
เพื่อแก้ปัญหาการปรับใช้สองครั้งคุณสามารถตั้งค่าได้ทั้ง "deployOnStartup" และ "autoDeploy" false ของแอตทริบิวต์ Host ใน server.xml
Sefler

8
ฉันพบว่าหากคุณไม่เปลี่ยนชื่อโฟลเดอร์ ROOT เริ่มต้นภายใต้ / webapps "cat come back" และรีเซ็ต docBase ใน ROOT.xml นี่คือกับเซิร์ฟเวอร์การพัฒนา vfabric tc ของ VMWare ... ถูกเตือน
hoserdude

3
ดูเหมือนว่า Tomcat 7 จะไม่อนุญาตให้ใช้ docBase ภายใน / webapps ในตอนนี้ดังนั้นจึงเป็นสิ่งจำเป็นสำหรับการค้นหาไฟล์สงครามที่อื่น
Mojo

12

ต่อไปนี้เป็นแนวทางแก้ไขปัญหาเดียวที่ได้ผลสำหรับฉัน เพิ่มสิ่งนี้ไปยังโหนดโฮสต์ใน conf / server.xml

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

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

</Context>

ไปที่ไฟล์ Tomcat server.xml และตั้งค่าพา ธ ว่าง


1
จะเป็นที่server.xmlหรือcontext.xml? ฉันเห็นแท็ก xml <Context>ในของฉันcontext.xml
Saif

6
นอกจากนี้ยังมีแท็ก xml บริบทใน server.xml อย่างไรก็ตามการใช้ server.xml สำหรับการกำหนดบริบทนั้นไม่ได้รับการสนับสนุน
İsmail Yavuz

4

ใน Tomcat 9.0 ฉันต้องเปลี่ยนสิ่งต่อไปนี้ใน 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"/>

3

รหัสเล็ก ๆ นี้ใช้งานได้สำหรับฉันโดยใช้โฮสต์เสมือน

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>

นี่คือserver.xmlอะไร? ตามตัวอย่างเช่น Ali.Mojtehedy ด้านบนนั่นเป็นปัญหา นอกจากนี้ยังมีคำตอบอื่น ๆ ที่/path/toจำเป็นต้องอยู่นอกเส้นทาง webapps ปกติ
Jean Jordaan

ดูเหมือนว่าจะทำงานได้ดี แน่นอนคุณไม่ต้องการให้แอปพลิเคชัน ROOT อยู่ในโฟลเดอร์ webapps เดียวกันเพื่อขัดแย้งกับคุณ
Anthony Hayward

2

เร็วที่สุดและอาจเป็นทางออกที่ดีที่สุดคือมีเนื้อหาด้านล่าง <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

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

และเว็บแอปของคุณจะสามารถใช้ได้ที่ http://<host>:<port>/


1
นั่นคือไดเรกทอรี docBase ที่สมบูรณ์หรือเกี่ยวข้องกับโฟลเดอร์เฉพาะหรือไม่?
Jose Martinez

3
ฉันลองสิ่งนี้ แต่มันไม่ทำงาน ฉันมี app ที่เรียกว่าในFoobar /opt/tomcat/webapps/Foobarฉันพยายามตั้ง docBase ไปFoobarและยัง/opt/tomcat/webapps/Foobarแต่เมื่อฉันไป `http: // <โฮสต์>: <port> / ฉันยังคงเห็นหน้าแรก Tomcat แทนของ app Foobar ของฉัน ฉันเริ่ม Tomcat ด้วยซ้ำ ผมทำอะไรผิดหรือเปล่า?
kimbaudi

เมื่อฉันทำให้เส้นทางเป็นโมฆะมันไม่สามารถเข้าถึงแอปของฉัน):
Snickers3192

1

ฉันประสบปัญหานี้เป็นเวลาหนึ่งเดือนการวางแท็กบริบทใน server.xml ไม่ปลอดภัยจะส่งผลกระทบต่อองค์ประกอบบริบทที่ปรับใช้สำหรับโฮสต์อื่น ๆ ทั้งหมดสำหรับแอปขนาดใหญ่ที่ใช้ข้อผิดพลาดในการเชื่อมต่อ .com / โดเมน 1 โฟลเดอร์ !! ยังเชื่อมต่อเซสชันฐานข้อมูลโหลดสองครั้ง! อีกวิธีคือใส่ไฟล์ ROOT.xml ที่มีแท็กบริบทที่มีเส้นทางแบบเต็มเช่น:

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

ใน conf / catalina / webappsfoldername และปรับใช้ไฟล์ war เป็น ROOT.war ภายใน webappsfoldername และระบุ host เช่น

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

ในวิธีการนี้ยังสำหรับแอพประเภทเดียวกันเซสชันผู้ใช้ไม่ได้แยกดี! คุณอาจอยู่ใน app1 หาก app1 เหมือนกับ app2 คุณสามารถเข้าสู่ระบบโดยเซสชันด้านเซิร์ฟเวอร์โดยอัตโนมัติ ดังนั้นคุณต้องเก็บเซสชันผู้ใช้ไว้ในแคชฝั่งไคลเอ็นต์ไม่ใช่ jsessionid! เราอาจเปลี่ยนชื่อเครื่องยนต์จาก localhost เพื่อแก้ไข แต่สมมุติว่าการเล่นกับแมวตัวผู้ต้องใช้เวลามากกว่าเล่นกับแมวตัวอื่น!


1

ไม่แนะนำให้อัปเดตการกำหนดค่าเซิร์ฟเวอร์เช่น server.xml หรือ ROOT.xml

คุณสามารถวางไฟล์คอนฟิกูเรชัน context.xml ภายใต้ไดเร็กทอรี META-INF บนเว็บแอ็พพลิเคชันของคุณโดยมีการตั้งค่าพา ธ บริบท สิ่งนี้จะแทนที่การตั้งค่าเซิร์ฟเวอร์เริ่มต้นหรือไม่

เช่น:

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


1

Tomcat 8: หลังจากค้นหาหลายครั้งรหัสนี้ใช้งานได้เท่านั้น: ใน 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>

รีสตาร์ท Tomcat ตรวจสอบให้แน่ใจเมื่อคุณเข้าถึง 127.0.0.1:8080 มันจะแสดงเนื้อหาใน 127.0.0.1:8080/apple

โครงการของฉันคือแม่มดเว็บแอปพลิเคชัน Java ที่สร้างโดย netbeans ฉันกำหนดเส้นทางบริบทในการกำหนดค่าโครงการไม่มีสิ่งอื่นใดแม้แต่ฉันใส่ apple.war ในโฟลเดอร์ webapps


1

สำหรับฉันทั้งสองคำตอบทำงาน

  1. การเพิ่มไฟล์ชื่อ ROOT.xml ใน / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. การเพิ่มรายการใน 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>

หมายเหตุ: เมื่อคุณประกาศ docBase ภายใต้บริบทให้ข้าม appBase ที่ Host

  1. อย่างไรก็ตามฉันต้องการแปลงชื่อสงครามของฉันเป็นROOT.warและวางไว้ใต้ webapps ดังนั้นตอนนี้คำขอ URL ที่ไม่ตรงกันจากสงครามอื่น ๆ (บริบท) จะเข้าสู่สงครามนี้ วิธีนี้เป็นวิธีที่ดีกว่าในการจัดการเส้นทางบริบท ROOT ("/ **")

ตัวเลือกที่สองคือ (สองเท่า) โหลดสงครามจากโฟลเดอร์ Webapps เช่นกัน นอกจากนี้ยังต้องการเฉพาะโฟลเดอร์สงครามที่ไม่มีการบีบอัดซึ่งเป็นอาการปวดหัว




1

ใน Tomcat 8.X ภายใต้โฮมไดเร็กทอรี / conf / โฟลเดอร์ Tomcat ใน server.xml คุณสามารถเพิ่ม<Context>แท็กภายใต้<Host>แท็กดังที่แสดงด้านล่าง แต่คุณต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อให้มีผล

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

หรือถ้าคุณใช้ Tomcat 7.X คุณสามารถเพิ่มไฟล์ context.xml ในโฟลเดอร์ WEB-INF ในโครงการของคุณ เนื้อหาของไฟล์ที่ฉันใช้นั้นเป็นไปตามที่แสดง และมันก็ใช้ได้ดีสำหรับฉัน คุณไม่ต้องรีสตาร์ทเซิร์ฟเวอร์ในกรณีนี้

<?xml version="1.0" encoding="UTF-8"?>

<Context docBase="${catalina.base}\webapps\<My App Directory Name>" path="<your app path you wish>" reloadable="true" />

ทดสอบใน tomcat: 9.0 docker และใช้งานได้กับ 8.0 ที่คุณพูดถึง localhost:8080/<Your App Directory Name>/และlocalhost:8080/<your app path you wish>/URL ทั้งสองนี้ทำงานได้ในเวลาเดียวกัน $CATALINA_HOME/webapps/พบทั้งสองโฟลเดอร์สกัดภายใต้
niaomingjian

1

โซลูชันที่ง่ายและยืดหยุ่นอยู่ด้านล่าง: ภายใน $ {Tomcat_home} /config/server.xml

เปลี่ยนautoDeploy = "false" deployOnStartup = "false"ภายใต้องค์ประกอบโฮสต์เช่นด้านล่างสิ่งนี้จะต้อง

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

เพิ่มบรรทัดด้านล่างภายใต้องค์ประกอบโฮสต์

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

ด้วยวิธีการข้างต้นเราสามารถเพิ่มแอปพลิเคชั่นได้มากมายภายใต้ webapps พร้อมชื่อเส้นทางบริบทที่แตกต่างกัน


โซลูชันทางเลือกที่ไม่มี doinf ด้านบนการกำหนดค่าเป็นเพียงการเปลี่ยนชื่อไฟล์ war ของคุณเป็น root.war และวางไว้ในไดเรกทอรี webapps เส้นทางบริบทโดยอัตโนมัติจะถูกตั้งค่าเป็น /
Ravi Gupta

-6

เคล็ดลับด้านล่างใช้ได้สำหรับฉัน

1) ความคิดเห็น / ลบการกำหนดค่าด้านล่างจากไฟล์ server.xml (ภายในโฟลเดอร์ conf) ของ tomcat

2) ลบโฟลเดอร์ ROOT ที่มีอยู่ (ถ้ามี) ที่อยู่ในโฟลเดอร์ tomcat webapps และเปลี่ยนชื่อไฟล์สงครามของคุณ (เช่น: test.war) เป็น ROOT.war

โปรดจำไว้ว่าในขณะที่เปลี่ยนชื่อไฟล์ war เป็น ROOT.war "ROOT" ควรเป็นตัวพิมพ์ใหญ่

ข้อ จำกัด : คุณสามารถปรับใช้แอปพลิเคชันเดียวเท่านั้นภายในหนึ่งอินสแตนซ์ tomcat


3
จากคำถาม: "ฉันรู้ว่าฉันสามารถเปลี่ยนชื่อ webapp ของฉัน (หรือเป็นไฟล์ WAR) เป็น ROOT แต่นี่เป็นวิธีที่แย่มากที่จะทำ IMHO"
Jean Jordaan

1
ฉันไม่ต้องการ จำกัด ตัวเองเพียงแค่ใช้ webapp เดียวต่อ Tomcat instance
ulrich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.