Cách đặt đường dẫn ngữ cảnh của ứng dụng web trong Tomcat 7.0


162

Tôi biết rằng tôi có thể đổi tên ứng dụng web của mình (hoặc đó là tệp WAR) thành ROOT nhưng đây là một cách khủng khiếp để làm điều đó, IMHO. Bây giờ tôi đã kiểm tra tài liệu tomcat và nó nói

KHÔNG nên đặt các phần tử trực tiếp trong tệp server.xml

Vì vậy, tôi đã thử làm một phương pháp khác mà nó gợi ý.

Các thành phần bối cảnh riêng lẻ có thể được xác định rõ ràng: Trong một tệp riêng lẻ tại /META-INF/context.xml bên trong các tệp ứng dụng.

Vì vậy, tôi đã tạo một /META-INF/context.xmlvới mã sau đây,

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

Nhưng sau khi triển khai khi tôi khởi động lại máy chủ, nó vẫn không tải được ngữ cảnh tại "/", nó vẫn tải nó với "/<WEB_APP_NAME>"

Bất kỳ con trỏ hữu ích.



1
Lý do "KHÔNG nên đặt các phần tử trực tiếp vào tệp server.xml" được đưa ra trong các tài liệu theo sau trong câu tiếp theo: "Điều này là do việc sửa đổi cấu hình Ngữ cảnh xâm lấn hơn vì tệp conf / server.xml chính không thể được tải lại mà không cần khởi động lại Tomcat. " Câu trả lời được chấp nhận dưới đây trực tiếp giải quyết vấn đề, nhưng nếu bạn không có khả năng sửa đổi đường dẫn này một lần nữa hoặc khởi động lại thì không quá khó chịu, việc sửa đổi server.xml dường như không hợp lý.
rimsky

Câu trả lời:


236

Những gì bạn có thể làm là sau đây;

Thêm một tập tin gọi ROOT.xmltrong<catalina_home>/conf/Catalina/localhost/

ROOT.xml này sẽ ghi đè cài đặt mặc định cho ngữ cảnh gốc của cài đặt tomcat cho công cụ và máy chủ đó (Catalina và localhost).

Nhập thông tin sau vào tệp ROOT.xml;

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

Đây <yourApp>là tên của ứng dụng của bạn .. :)

Và ở đó bạn đi, ứng dụng của bạn bây giờ là ứng dụng mặc định và sẽ hiển thị trên http://localhost:8080

Tuy nhiên, có một tác dụng phụ; ứng dụng của bạn sẽ được tải hai lần. Một lần cho localhost:8080và một lần cho localhost:8080/yourApp. Để khắc phục điều này, bạn có thể đặt ứng dụng NGOÀI TRỜI <catalina_home>/webappsvà sử dụng đường dẫn tương đối hoặc tuyệt đối trong thẻ docBase của ROOT.xml. Một cái gì đó như thế này;

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

Và sau đó tất cả sẽ ổn thôi!


32
Bỏ phiếu? Được rôi nhưng tại sao? Nếu có một sự thay thế tốt hơn, cho tôi biết quá! : D
Paaske

1
Điều này sẽ làm việc với các cuộc chiến khác trong thư mục webapps thông thường?
chrislovecnm

5
Để giải quyết việc triển khai kép, bạn cũng có thể đặt cả "triển khaiOnStartup" và "autoDeploy" sai của thuộc tính Máy chủ trong server.xml
Sefler

8
Tôi đã thấy rằng nếu bạn không đổi tên thư mục ROOT mặc định trong / webapps thì "con mèo quay lại" và nó đặt lại docBase trong ROOT.xml. Đây là với máy chủ phát triển vfoven tc của VMWare ... Hãy cảnh báo.
hoserdude

3
Có vẻ như Tomcat 7 sẽ không cho phép docBase bên trong / ứng dụng web ngay bây giờ, do đó dường như bắt buộc phải định vị tệp chiến tranh ở nơi khác.
Mojo

12

Dưới đây là các giải pháp duy nhất làm việc cho tôi. Thêm phần này vào nút Máy chủ trong conf / server.xml

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

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

</Context>

đi tới tệp Tomcat server.xml và đặt đường dẫn trống


1
sẽ ở server.xmlhoặc context.xml? tôi thấy một thẻ xml <Context>trong của tôicontext.xml
Saif

6
Ngoài ra còn có một thẻ xml ngữ cảnh trong server.xml Tuy nhiên, việc sử dụng server.xml để xác định bối cảnh không được khuyến khích
İsmail Yavuz

4

Trong Tomcat 9.0, tôi chỉ phải thay đổi những điều sau trong server.xml

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

đến

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

3

Mã nhỏ này làm việc cho tôi, sử dụng máy chủ ảo

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

Đây là trong server.xml? Theo ví dụ Ali.Mojtehedy ở trên có vấn đề. Ngoài ra, các câu trả lời khác nói rằng /path/tocần phải nằm ngoài đường dẫn webapps thông thường.
Jean Jordaan

Có vẻ để làm việc tốt. Tất nhiên, bạn không muốn ứng dụng ROOT tồn tại trong cùng thư mục webapps xung đột với ứng dụng của bạn.
Anthony Hayward

2

Nhanh nhất và có thể là giải pháp tốt nhất là có nội dung bên dưới <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

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

Và ứng dụng web của bạn sẽ có sẵn tại http://<host>:<port>/


1
Là thư mục docBase tuyệt đối hay liên quan đến một thư mục cụ thể?
Jose Martinez

3
Tôi đã thử điều này, nhưng nó không hoạt động. Tôi có một ứng dụng có tên Foobartrong /opt/tomcat/webapps/Foobar. Tôi đã thử cài đặt docBase Foobarvà cũng vậy /opt/tomcat/webapps/Foobar, nhưng khi tôi truy cập `http: // <host>: <port> / Tôi vẫn thấy trang chủ Tomcat thay vì ứng dụng Foobar của mình. Tôi thậm chí đã khởi động lại Tomcat. Tôi đang làm gì sai?
kimbaudi

Khi tôi thực hiện đường dẫn null, nó không đến được ứng dụng của tôi):
Snickers3192

1

Tôi đã phải đối mặt với vấn đề này trong một tháng, Đặt thẻ ngữ cảnh bên trong server.xml không an toàn, nó ảnh hưởng đến các thành phần bối cảnh triển khai cho tất cả các máy chủ khác, đối với các ứng dụng lớn, lỗi kết nối cũng không cách ly tốt, ví dụ bạn có thể truy cập các trang web khác bằng tên thư mục domain2 .com / domain1Folder !! cũng kết nối phiên cơ sở dữ liệu được tải hai lần! cách khác là đặt tệp ROOT.xml có thẻ ngữ cảnh với đường dẫn đầy đủ như:

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

trong conf / catalina / webappsprintername và triển khai tệp chiến tranh dưới dạng ROOT.war bên trong tên người dùng web và cũng chỉ định máy chủ như vậy

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

Trong cách tiếp cận này cũng cho các ứng dụng cùng loại phiên người dùng không cách ly tốt! bạn có thể bên trong app1 nếu app1 giống như app2 bạn có thể sau khi đăng nhập bởi phiên phía máy chủ tự động có thể đăng nhập vào app2 không?! Vì vậy, bạn phải giữ phiên người dùng trong bộ đệm phía máy khách chứ không phải với jsessionid! chúng tôi có thể thay đổi tên công cụ từ localhost để giải quyết nó. nhưng hãy nói rằng chơi với tomcat cần nhiều thời gian hơn chơi với những con mèo khác!


1

Không nên cập nhật cấu hình máy chủ như server.xml hoặc ROOT.xml.

Bạn có thể đặt tệp cấu hình bối cảnh trong thư mục META-INF của ứng dụng web, với cài đặt đường dẫn ngữ cảnh được bao gồm. Điều này sẽ ghi đè cài đặt máy chủ mặc định?

I E:

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

1

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

đi tới tệp Tomcat server.xml và đặt đường dẫn trống


1

Tomcat 8: Sau nhiều lần tìm kiếm, đây chỉ là mã làm việc: trong 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>

Khởi động lại Tomcat, đảm bảo khi bạn truy cập 127.0.0.1:8080, nó sẽ hiển thị nội dung trong 127.0.0.1:8080/apple

Dự án của tôi là phù thủy ứng dụng web java được tạo bởi netbeans, tôi đặt đường dẫn ngữ cảnh trong cấu hình dự án, không có gì khác, thậm chí tôi đặt apple.war trong thư mục webapps.


1

Đối với tôi cả hai câu trả lời làm việc.

  1. Thêm một tệp có tên ROOT.xml trong / conf / Catalina / localhost /
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Thêm mục nhập trong 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>

Lưu ý: khi bạn khai báo docBase trong ngữ cảnh thì bỏ qua appBase tại Host.

  1. Tuy nhiên, tôi thích chuyển đổi tên chiến tranh của mình hơn ROOT.warvà đặt nó dưới webapps. Vì vậy, bây giờ các yêu cầu url chưa từng có từ các cuộc chiến khác (bối cảnh) sẽ rơi vào cuộc chiến này. Đây là cách tốt hơn để xử lý đường dẫn ngữ cảnh ROOT ("/ **").

Tùy chọn thứ hai là (gấp đôi) tải các cuộc chiến từ thư mục Webapps. Ngoài ra, nó chỉ cần thư mục chiến tranh không nén mà là một vấn đề đau đầu.




1

Trong Tomcat 8.X, trong thư mục nhà / conf / thư mục tomcat trong server.xml, bạn có thể thêm <Context>thẻ theo <Host>thẻ như dưới đây. Nhưng bạn phải khởi động lại máy chủ để có hiệu lực

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

HOẶC nếu bạn đang sử dụng Tomcat 7.X, bạn có thể thêm tệp ngữ cảnh trong thư mục WEB-INF trong dự án của mình. Nội dung của tập tin tôi sử dụng là như được hiển thị. và nó làm việc tốt cho tôi bạn không phải khởi động lại máy chủ trong trường hợp này.

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

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

Đã thử nghiệm trong tomcat: 9.0 docker và nó hoạt động như 8.0 bạn đã đề cập. localhost:8080/<Your App Directory Name>/localhost:8080/<your app path you wish>/cả hai URL này hoạt động cùng một lúc. Tìm thấy hai thư mục giải nén dưới $CATALINA_HOME/webapps/.
niaomingjian

1

Giải pháp đơn giản và linh hoạt nhất nằm bên dưới: Bên trong $ {Tomcat_home} /config/server.xml

Thay đổi autoDeploy = "false" integrationOnStartup = "false" trong phần tử Máy chủ như bên dưới Điều này là bắt buộc.

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

Thêm dòng dưới đây trong phần tử máy chủ .

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

Với cách tiếp cận trên, chúng ta có thể thêm bao nhiêu ứng dụng trong webapps với các tên đường dẫn ngữ cảnh khác nhau.


Giải pháp thay thế mà không cần cấu hình doinf ở trên chỉ là đổi tên tệp chiến tranh của bạn thành root.war và đặt nó trong thư mục webapps. Đường dẫn ngữ cảnh tự động sẽ được đặt thành /.
Ravi Gupta

-6

Thủ thuật dưới đây làm việc cho tôi.

1) Nhận xét / xóa cấu hình bên dưới khỏi tệp server.xml (bên trong thư mục conf) của tomcat.

2) Xóa thư mục ROOT hiện có (Nếu có) nằm trong thư mục ứng dụng web tomcat. Và đổi tên tệp chiến tranh của bạn (ví dụ: test.war) thành ROOT.war.

Hãy nhớ rằng trong khi đổi tên tệp chiến tranh thành ROOT.war, "ROOT" phải ở dạng mũ.

Giới hạn: Bạn chỉ có thể triển khai một ứng dụng trong một phiên bản tomcat.


3
Từ câu hỏi: "Tôi biết rằng tôi có thể đổi tên ứng dụng web của mình (hoặc đó là tệp WAR) thành ROOT nhưng đây là một cách khủng khiếp để làm điều đó, IMHO."
Jean Jordaan

1
Tôi không muốn giới hạn bản thân mình chỉ sử dụng một ứng dụng web cho mỗi phiên bản tomcat.
ulrich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.