2010-04-07 27 views
22

Làm cách nào để tôi biết Tomcat để sử dụng một đường dẫn ngữ cảnh cụ thể khi đưa ra WAR-File của tôi?Xác định ngữ cảnh Servlet trong WAR-File

Ví dụ: Tôi có tệp chiến tranh được tạo bởi xây dựng maven và tên kết quả của tệp khá dài. Vì vậy, tôi không muốn ứng dụng quản lý tomcat sử dụng tên tệp của chiến tranh là ngữ cảnh.

Cung cấp một context.xml trong META-INF đã không tạo ra kết quả mong muốn

Tôi cũng thấy điều này trong các tài liệu cho các thuộc tính của pathContext:

Giá trị của trường này phải không được đặt trừ khi định nghĩa tĩnh một Ngữ cảnh trong tệp tin.xml, vì nó sẽ được suy ra từ các tên tệp được sử dụng cho tệp ngữ cảnh .xml hoặc docBase.

Vì vậy, dường như không đúng cách để nói cho máy chủ ứng dụng biết đường dẫn cho WAR của tôi là gì.

Bất kỳ gợi ý nào khác?

Trả lời

28

Có hai điểm quan trọng trong các tài liệu của Context Container:

  • Trong những file riêng biệt (có phần mở rộng ".xml") trong thư mục $CATALINA_BASE/conf/[enginename]/[hostname]/. Tên của tệp (ít phần mở rộng .xml) sẽ được sử dụng làm đường dẫn ngữ cảnh. Đường dẫn ngữ cảnh đa cấp có thể được xác định bằng #, ví dụ: foo # bar.xml cho đường dẫn ngữ cảnh của/foo/bar. Ứng dụng web mặc định có thể được định nghĩa bằng cách sử dụng một tệp có tên ROOT.xml.
  • Chỉ khi tệp ngữ cảnh không tồn tại cho ứng dụng trong $CATALINA_BASE/conf/[enginename]/[hostname]/, trong một tệp riêng lẻ tại /META-INF/context.xml bên trong tệp ứng dụng. Nếu ứng dụng web được đóng gói như một WAR thì /META-INF/context.xml sẽ được sao chép sang $CATALINA_BASE/conf/[enginename]/[hostname]/ và được đổi tên để khớp với đường dẫn ngữ cảnh của ứng dụng. Khi tệp này tồn tại, nó sẽ không được thay thế nếu một WAR mới với một mới hơn /META-INF/context.xml được đặt trong appBase của máy chủ.

Vì vậy, khi bạn bó một META-INF/context.xml, các tập tin được đổi tên thành tên của WAR và tên này trở thành đường dẫn ngữ cảnh, không phân biệt bất kỳ path quy định tại các yếu tố Context.

Tôi thấy như vậy, hai lựa chọn ở đây:

  1. Hoặc thiết lập tên của cuộc chiến tranh tạo ra để một tên ngắn hơn (Tôi đề nghị sử dụng <finalName> qua <warName> mà bị phản đối AFAIK):

    <project> 
        ... 
        <build> 
        <finalName>mycontext</finalName> 
        ... 
        </build> 
        ... 
    </project> 
    
  2. Hoặc sử dụng maven-tomcat-plugin để triển khai và đặt đường dẫn ngữ cảnh trong cấu hình plugin:

    <project> 
        ... 
        <build> 
        ... 
        <plugins> 
         ... 
         <plugin> 
         <groupId>org.codehaus.mojo</groupId> 
         <artifactId>tomcat-maven-plugin</artifactId> 
         <version>1.0-SNAPSHOT</version> 
         <configuration> 
          <path>/mycontext</path> 
         </configuration> 
         </plugin> 
         ... 
        </plugins> 
        ... 
        </build> 
        ... 
    </project> 
    
+1

Cảm ơn đoạn mã. Câu dưới đây rất quan trọng đối với nội dung của tôi. Chú thích/tham chiếu được thêm vào tệp context.xml như là cảnh báo cho các nhà phát triển tiếp theo. "Khi tệp này tồn tại, nó sẽ không được thay thế nếu một WAR mới với /META-INF/context.xml mới hơn được đặt trong appBase của máy chủ." – argatxa

4

Bạn có thể đặt thuộc tính path của thành phần <Context> trong số META-INF/context.xml của mình.

Ngoài ra, bạn có thể cấu hình maven để tạo ra các vật chiến tranh với một tên tùy chỉnh:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.0</version> 
      <configuration> 
       <warName>yourCustomWarName</warName> 
      </configuration> 
     </plugin> 
     ........ 
    </plugins> 
</build> 
+4

Xin lỗi vì đã là một kỷ lục bị phá vỡ ở đây, nhưng thiết lập các đường dẫn không thực sự làm việc trong Tomcat (thử nghiệm trên 6.0.28), như mô tả của Pascal trên. – John

+1

Tôi muốn downvote cho câu thứ nhất vì nó đơn giản là không đúng, đường dẫn ngữ cảnh đến từ tên tệp WAR, nhưng phần còn lại của câu trả lời là tốt – chrisbunney

+0

@chrisbunney đường dẫn ngữ cảnh đến từ tên tệp chiến tranh theo mặc định, nhưng có thể được ghi đè – Bozho

2

Trong dự án của bạn có một thư mục META-INF, trong thư mục đó có một tập tin context.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/myproject" /> 
+0

Tôi muốn sử dụng approche này, nhưng khi tomcat giải nén chiến tranh của tôi, nó tạo một thư mục với cùng tên với chiến tranh, cộng với nó tạo một tệp .xml trong /opt/apache-tomcat-6.0.29/conf/Catalina/localhost/, là bản sao của tệp context.xml được định nghĩa như bạn đã đề cập. Bạn có hiểu tại sao không? – benzen

+0

Tôi đồng ý - cách tiếp cận này chắc chắn không hoạt động trong Tomcat 6.0.28 vì những lý do được mô tả bởi Pascal – John

+0

@ John chắc chắn nó hoạt động cho tôi khi tôi biên soạn một cuộc chiến. – Mark

5

Tôi đã tìm thấy một giải pháp dễ dàng để giữ tên tệp chiến tranh và chọn ngữ cảnh.

Bạn chỉ cần triển khai chiến dịch của mình bên ngoài Máy chủ appBase và tạo liên kết bên trong thư mục appBase.

Ví dụ: :

ln -sf ${CATALINA_HOME}/wars/myapp-0.0.8-SNAPSHOT.war ${CATALINA_HOME}/webapps/myapp.war 

Ektor

+0

Các liên kết tượng trưng mang lại lợi ích bổ sung cho việc khôi phục nhanh bằng cách thay đổi liên kết tượng trưng. –

+1

Giải pháp này cũng giúp tự động hóa http://java.dzone.com/articles/super-quick-tomcat-app –

Các vấn đề liên quan