2010-10-27 26 views
16

Tài liệu nói nếu bạn có một tập tin bối cảnh ở đây:Tại sao tomcat thay thế context.xml trên redeploy?

$CATALINA_HOME/conf/Catalina/localhost/myapp.xml 

nó sẽ KHÔNG được thay thế bằng một tệp ngữ cảnh ở đây:

mywebapp.war/META-INF/context.xml 

Nó được viết ở đây: http://tomcat.apache.org/tomcat-6.0-doc/config/context.html

Chỉ nếu tệp ngữ cảnh không tồn tại cho ứng dụng trong $ CATALINA_BASE/conf/[enginename]/[tên máy chủ] /, trong một tệp riêng lẻ tại /META-INF/context.xml bên trong tệp ứng dụng es.

Nhưng mỗi khi tôi triển khai lại chiến tranh, nó sẽ thay thế tệp myapp.xml này bằng /META-INF/context.xml!

Tại sao lại thực hiện và làm cách nào để tránh?

Thanx

+0

Bạn đang triển khai thủ công hoặc bằng một plugin IDE? – BalusC

+0

Cá nhân, tôi sẽ không đặt một context.xml trên máy chủ ứng dụng. Tôi không vì tôi hiếm khi phụ thuộc vào việc có quyền truy cập vào tập tin đó. Tôi thường giữ nó cục bộ vào tệp WAR của tôi. – duffymo

+0

Tôi đang triển khai thủ công bằng cách đặt mywebapp.war vào $ CATALINA_HOME/webapps. Tôi giữ các thiết lập mặc định của mình trong WAR, nhưng tôi muốn có thể thay đổi các thiết lập đó trên cơ sở từng cá thể mà không sửa đổi chính bản thân chiến dịch - đó là lý do tại sao tôi muốn ngữ cảnh của tôi trong thư mục conf không đổi – artemb

Trả lời

6

Khai báo một phần của triển khai xóa ứng dụng và ngữ cảnh liên quan.xml.

Nếu bạn sử dụng tomcat maven cắm bạn có thể tránh xóa context.xml nếu bạn triển khai ứng dụng của bạn với lệnh như thế này:

mvn tomcat:deploy-only -Dmaven.tomcat.update=true 

Thông tin thêm ở đây: http://mojo.codehaus.org/tomcat-maven-plugin/deploy-only-mojo.html

Bạn có thể sử dụng triển khai chỉ với chế độ tham số để triển khai context.xml.

+2

Đối với những người theo dõi ở nhà: 'mvn tomcat7: chỉ triển khai-chỉ -Dmaven.tomcat.update = true -Dmaven.tomcat.mode = cả hai -Dmaven.tomcat.contextFile =/foo/context.xml' thực hiện thủ thuật. Buồn ... nhưng hiệu quả trong tomcat7. –

0

Trên tomcat7, cũng woth autoDeploy = false tệp sẽ bị xóa khi không triển khai. Đây là tài liệu và không phải là một lỗi (mặc dù nó tránh được triển khai tự động tốt với cấu hình cố định phía máy chủ).

Tôi tìm thấy một workaround mà giải quyết được vấn đề đối với tôi:

  • tạo ra một tập tin/context.xml META-INF trong webapp của bạn có chứa
  • trên máy chủ tạo ra một bối cảnh thứ hai "/ config- context "trong server.xml và đặt tất cả các tham số cấu hình phía máy chủ của bạn tại đó
  • về việc sử dụng ứng dụng context.getContext ("/config-context "). getInitParameter (...) để truy cập vào cấu hình ở đó.

Điều này cho phép cấu hình máy chủ lưu trữ độc lập với cuộc chiến được triển khai.

Cũng có thể thêm cấu hình theo ngữ cảnh bằng cách thêm ngữ cảnh như "/ config-context-MYPATH". Trong ứng dụng của bạn, bạn có thể sử dụng đường dẫn ngữ cảnh oth ứng dụng để tính toán đường dẫn ngữ cảnh của ứng dụng cấu hình.

+4

Tại sao các nhà phát triển tomcat lõi lại thiếu hiểu biết về triển khai thực tiễn tốt nhất? Tôi mất cơ bản một đêm để giải quyết vấn đề ở đây và tất cả các công việc xung quanh đều là chống mẫu, nhưng các nhà phát triển TC bị từ chối và sẽ không thừa nhận rằng đây là một cách tiếp cận hợp lý để cài đặt JNDI phù hợp và nguồn trên máy chủ, không biên dịch chúng vào SCM và chiến tranh. https://issues.apache.org/bugzilla/show_bug.cgi?id=34840 –

2

Câu trả lời ngắn:

Chỉ cần làm cho TOMCATHOME/conf/Catalina/localhost dir read-only, và tiếp tục đọc để biết thêm chi tiết:

  • Đối chế độ triển khai nhanh chóng (Dự án web động của Eclipse, kết nối trực tiếp Tomcat , v.v.) trên máy chủ Tomcat cục bộ/không chia sẻ, bạn chỉ có thể xác định nguồn dữ liệu JDBC của mình (hoặc bất kỳ tài nguyên web khác ' ) nào bằng cách sử dụng META-INF/context.xml tệp bên trong tệp tin WAR. Dễ dàng và nhanh chóng trong môi trường địa phương của bạn, nhưng không thích hợp cho dàn dựng, QA hoặc sản xuất.
  • Đối với chế độ triển khai xây dựng (thường là cho dàn dựng, bảo đảm chất lượng, hoặc prod), JDBC datasources và các chi tiết khác 'tài nguyên web' được định nghĩa bởi nhóm QA/sản xuất, không phải là đội ngũ phát triển nữa. Do đó, họ phải chỉ định trong máy chủ Tomcat chứ không phải bên trong tệp WAR nữa. Trong trường hợp này, xác định chúng trong file TOMCATHOME/conf/Catalina/localhost/context.xml (thay đổi Catalina bởi động cơ, và localhost bởi máy chủ, và BỐI CẢNH bởi bối cảnh của bạn cho phù hợp) . Tuy nhiên, Tomcat sẽ xóa tệp này trên mỗi lần triển khai. Để ngăn chặn việc xóa này, chỉ cần làm cho thư mục này chỉ đọc; trong Linux bạn có thể gõ:

    chmod a-w TOMCATHOME/conf/Catalina/localhost 
    

    Voila! Chào mừng bạn.

Câu trả lời dài

  • Vì lý do lịch sử Tomcat cho phép bạn xác định tài nguyên web (datasources JDBC, và những người khác) trong bốn nhiều nơi khác nhau (đọc bốn tập tin khác nhau) một cách rất cụ thể thứ tự ưu tiên, nếu bạn tình cờ xác định cùng một tài nguyên nhiều lần. Những cái có tên trong câu trả lời ngắn ở trên là phù hợp hơn hiện nay cho mỗi mục đích, mặc dù bạn vẫn có thể sử dụng những người khác (nah ... có thể bạn không muốn). Tôi sẽ không để thảo luận về những người khác ở đây trừ khi ai đó yêu cầu nó.
+0

Tôi sẽ yêu cầu ;-) – djKianoosh

+0

Điều này sẽ không hoạt động khi autodeploy được bật cho tomcat và bạn sử dụng tomcat7: undeploy nó sẽ khiếu nại rằng nó không thể xóa các tập tin mô tả bối cảnh – Chad

+0

Với tùy chọn này, triển khai của tôi thất bại với thông báo lỗi "Không thể gọi người quản lý Tomcat: Connection reset' vì lý do được đề cập trong bình luận của Chad. Thay vào đó, tôi đã sử dụng tùy chọn bằng cách sử dụng context.xml từ WEB-INF và tài nguyên jndi tùy chọn (bên ngoài) từ máy chủ.xml như được mô tả trong câu trả lời đầu tiên [ở đây] (http://stackoverflow.com/questions/7142365/how-to-provide-a-context-configuration-for-a-web-application-in-tomcat) – tareq

0

Theo tài liệu (http://tomcat.apache.org/tomcat-8.0-doc/config/automatic-deployment.html#Deleted_files) khi redeploy tomcat phát hiện việc xóa (undeploy) của ứng dụng của bạn. Vì vậy, nó sẽ bắt đầu một quá trình dọn dẹp xóa thư mục và xml cũng. Điều này độc lập với triển khai tự động - vì vậy nó sẽ xảy ra khi triển khai lại thông qua trình quản lý và sửa đổi chiến tranh.Có 3 trường hợp ngoại lệ:

  • nguồn lực toàn cầu không bao giờ xóa
  • nguồn lực bên ngoài không bao giờ xóa
  • nếu WAR hoặc DIR đã được sửa đổi sau đó các tập tin XML chỉ xóa nếu copyXML là đúng và deployXML là true

Tôi không biết tại sao, nhưng copyXML = "false" deployXML = "false" sẽ không hữu ích.

Thứ hai: Làm cho thư mục chỉ đọc chỉ làm cho tomcat ném một ngoại lệ và sẽ không bắt đầu.

Bạn có thể thử hợp nhất các tệp $ CATALINA_BASE/conf/Catalina/localhost/myapp-1.xml, $ CATALINA_BASE/conf/Catalina/localhost/myapp-2.xml, vv của mình thành $ CATALINA_BASE/conf/context.xml (chỉ hoạt động nếu bạn đảm bảo ứng dụng của mình không triển khai cấu hình ngữ cảnh của riêng mình, như myapp-1.xml)

Nếu ai đó có thể biết "tài nguyên bên ngoài" thường giải quyết được vấn đề gì.

0

Quá trình triển khai lại có nghĩa là hai phần: không triển khai và triển khai.

Undeployment loại bỏ các conf/Catalina/yourhost/yourapp.xml

<Host name="localhost" appBase="webapps" unpackWARs="true" 

      autoDeploy="true">  <!-- means autoUndeploy too!!! --> 

</Host> 

Thay đổi autoDeploy="false" và Tomcat có không theo thứ tự nữa để loại bỏ các conf/Catalina/yourhost/yourapp.xml.

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