2011-07-05 6 views
77

Tôi mới đến Tomcat. Chúng tôi có một máy dev với khoảng 5 ứng dụng đang chạy. Mặc dù nó là dev, nó được sử dụng bởi các khách hàng của chúng tôi khá nhiều trong quá trình thử nghiệm.Làm cách nào để cập nhật ứng dụng web Tomcat mà không cần khởi động lại toàn bộ dịch vụ?

Vì vậy, giả sử chúng ta cần thực hiện một thay đổi nhỏ trên một tệp lớp. Ngay bây giờ, chúng tôi phải tắt Tomcat (ảnh hưởng đến bốn ứng dụng khác), xóa tệp WAR (và thư mục ứng dụng web), triển khai lại tệp WAR mới và khởi động lại Tomcat.

Tất nhiên, điều này làm rối loạn một số người vì nó phá hủy tất cả các phiên đăng nhập cho tất cả các ứng dụng.

Có cách nào tốt hơn để thực hiện việc này không? Ý tôi là, có cách nào để chỉ tải lại CLASS đã thay đổi thay vì mọi thứ trên máy tính không?

Cảm ơn.

+0

Thay đổi quản lý phiên của bạn để cái gì đó vẫn tồn tại để nộp? Xin lỗi không thể cưỡng lại :) – rogerdpack

+0

@rogerdpack Tôi đã học được rất nhiều về Tomcat kể từ khi tôi hỏi câu hỏi này hơn sáu năm trước đây. Nhưng dù gì cũng cảm ơn. – cbmeeks

+0

Về các lớp trao đổi nóng chỉ, xem https://stackoverflow.com/questions/32459047/how-to-enable-hot-deploy-in-tomcat – rogerdpack

Trả lời

49

Bạn đã cố gắng sử dụng Tomcat's Manager application? Nó cho phép bạn undeploy/triển khai các tập tin chiến tranh với ra đóng Tomcat xuống.

Nếu bạn không muốn sử dụng ứng dụng Trình quản lý, bạn cũng có thể xóa tệp chiến tranh khỏi thư mục webapps, Tomcat sẽ không triển khai ứng dụng sau một khoảng thời gian ngắn. Sau đó bạn có thể sao chép một tập tin chiến tranh trở lại vào thư mục, và Tomcat sẽ triển khai tập tin chiến tranh.

Nếu bạn đang chạy Tomcat trên Windows, bạn có thể cần configure Ngữ cảnh của bạn để không khóa các tệp khác nhau.

Nếu bạn hoàn toàn không thể có thời gian chết, bạn có thể muốn xem Tomcat 7's Parallel deployments Bạn có thể triển khai nhiều phiên bản ứng dụng web với cùng một đường dẫn ngữ cảnh cùng một lúc. Quy tắc được sử dụng để khớp với yêu cầu đối với phiên bản ngữ cảnh như sau:

  • Nếu không có thông tin phiên nào trong yêu cầu, hãy sử dụng phiên bản mới nhất.
  • Nếu thông tin phiên có trong yêu cầu, hãy kiểm tra trình quản lý phiên của mỗi phiên bản cho phiên phù hợp và nếu phiên được tìm thấy, hãy sử dụng phiên bản đó.
  • Nếu thông tin phiên có trong yêu cầu nhưng không tìm thấy phiên phù hợp nào, hãy sử dụng phiên bản mới nhất.
+0

Đó cũng là một gợi ý hay. Tôi chưa bao giờ nghe nói về ứng dụng quản lý cho đến hôm nay. Có, chúng tôi sử dụng Windows. Một mối quan tâm tôi có với việc xóa tệp WAR và chờ đợi là các khách hàng của chúng tôi đang mong đợi "các bản sửa lỗi nhỏ" thường xuyên. Những đề xuất đó có phù hợp với kịch bản đó không? – cbmeeks

+1

@cbmeeks - Tùy thuộc vào tần suất các bản sửa lỗi nhỏ này xảy ra và bao lâu trước khi có ai đó thông báo. Trong cả hai trường hợp, sẽ có một khoảng thời gian nhỏ mà ứng dụng không có sẵn. Nó phụ thuộc vào phần cứng/ứng dụng của bạn trong bao lâu. Nhưng nó được đo bằng giây, tôi thường nói 5-10 trong các ứng dụng của chúng tôi. Nhưng số dặm của bạn có thể thay đổi :) –

+0

@SteveK Tôi đang sử dụng tomcat + IIS, vì vậy các ứng dụng web được triển khai có ngữ cảnh khác nhau (các trang web khác nhau) và chắc chắn không nằm trong thư mục webapps của tomcat và do đó ứng dụng trình quản lý không thể xem chúng. Bất kì giải pháp nào ? –

3

Đối với phát triển ....

http://www.zeroturnaround.com/jrebel/current/

+0

Công cụ JRebel đó trông giống như một người chiến thắng. Tôi đã hy vọng cho một kỹ thuật miễn phí nhưng vì thời gian là tiền bạc, việc quản lý xung quanh đây có thể là mùa xuân cho điều đó. Bạn có thấy chi phí đáng giá không? Chúng tôi có thể có 3 trường hợp JVM trên 2 máy chủ. Cảm ơn – cbmeeks

+3

mặc dù đây là một câu hỏi cũ: tôi đã thấy rằng JRebel KHÔNG thực sự đáng giá tiền của nó - nó chỉ tiết kiệm một vài giây và có những lợi thế nhỏ so với triển khai nóng. Trường hợp triển khai nóng/tải lại không thành công JRebel cũng không làm tốt hơn, trên thực tế tôi có khá nhiều lỗi lạ, do lỗi của JRebel "agent" (reloader-daemon) ... phần mềm này chỉ có giá trị nếu bạn ' tái làm LOTS của tái triển khai và/hoặc thử nghiệm địa phương, mà có thể chỉ là một dấu hiệu của một quá trình làm việc thiếu sót .... chỉ cần nói. – specializt

19

Trong thư mục conf của tomcat apache, bạn có thể tìm tệp context.xml. Trong thẻ chỉnh sửa đó là < Context reloadable = "true">. điều này sẽ giải quyết vấn đề và bạn không cần phải khởi động lại máy chủ

16

Có nhiều cách dễ dàng.

  1. Chỉ cần chạm vào web.xml của bất kỳ ứng dụng web nào.

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml 
    

Bạn cũng có thể cập nhật một file jar đặc biệt trong WEB-INF/lib và sau đó chạm vào web.xml, chứ không phải là xây dựng tập tin toàn bộ chiến tranh và triển khai nó một lần nữa.

  1. Xóa thư mục webapps/YOUR_WEB_APP, Tomcat sẽ bắt đầu triển khai chiến tranh trong vòng 5 giây (giả sử tệp chiến tranh của bạn vẫn tồn tại trong thư mục webapps).

  2. Nói chung ghi đè tệp chiến tranh với phiên bản mới sẽ được tự động triển khai lại bởi tomcat. Nếu không, bạn có thể chạm vào web.xml như đã giải thích ở trên.

  3. Copy trên một đã phát nổ "thư mục" vào thư mục webapps của bạn

+1

Hữu ích khi biết rằng phương pháp 'chạm' không tải lại các lớp học. IOW, nó không thanh lọc và tải lại hệ thống phân cấp bộ nạp lớp cho webapp – Rondo

+2

Xem lý do tại sao tác phẩm này có thể đọc trong '$ CATALINA_BASE/conf/context.xml'. WEB-INF/web.xml được theo dõi để thay đổi. Các tài nguyên khác có thể dễ dàng được liệt kê ở đó nếu cần. – Kevin