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


93

Tôi là người mới Tomcat. Chúng tôi có một máy phát triển với khoảng 5 ứng dụng đang chạy. Mặc dù đó là nhà phát triển, nó được khách hàng của chúng tôi sử dụng khá nhiều trong quá trình thử nghiệm.

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 WARtệp (và thư mục ứng dụng web), triển khai lại WARtệp mới và khởi động lại Tomcat.

Tất nhiên, điều này khiến một số người khó chịu vì nó 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 để làm điều này? Ý 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 phát triển không?

Cảm ơn.


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

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

Liên quan đến hoán đổi nóng chỉ các lớp, hãy xem stackoverflow.com/questions/32459047/…
rogerdpack

Câu trả lời:


59

Bạn đã thử sử dụng ứng dụng Tomcat's Manager chưa? Nó cho phép bạn hủy triển khai / triển khai các tệp chiến tranh mà không cần tắt Tomcat.

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 ứng dụng web, Tomcat sẽ hủy triển khai ứng dụng sau một khoảng thời gian ngắn. Sau đó, bạn có thể sao chép lại tệp chiến tranh vào thư mục và Tomcat sẽ triển khai tệp chiến tranh.

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

Nếu bạn hoàn toàn không thể có bất kỳ thời gian chết nào, bạn có thể muốn xem các triển khai Song song của Tomcat 7 Bạn có thể triển khai nhiều phiên bản của một ứng dụng web với cùng một đường dẫn ngữ cảnh cùng một lúc. Các quy tắc được sử dụng để đối sánh các yêu cầu với một 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 từng phiên bản để tìm phiên phù hợp và nếu 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 khớp nào, hãy sử dụng phiên bản mới nhất.

Đó cũng là một gợi ý hay. Tôi chưa bao giờ nghe nói về ứng dụng người quản lý cho đến hôm nay. Có, chúng tôi sử dụng Windows. Một mối quan tâm của tôi khi xóa tệp WAR và chờ đợi là khách hàng của chúng tôi thường xuyên mong đợi "các bản sửa lỗi nhỏ". 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 xảy ra các bản sửa lỗi nhỏ này và bao lâu trước khi ai đó nhận thấy. Trong cả hai trường hợp, sẽ có một khoảng thời gian nhỏ mà ứng dụng không khả dụng. Nó phụ thuộc vào phần cứng / ứng dụng của bạn mà thời gian đó là bao lâu. Nhưng nó được đo bằng giây, tôi thường nói là 5-10 trên các ứng dụng của chúng tôi. Nhưng mileage của bạn có thể thay đổi :)
Steve K

1
Chà. Tôi đã học được rất nhiều kể từ khi tôi hỏi câu hỏi này. Vâng, bây giờ chúng tôi triển khai các ứng dụng Tomcat mà không cần gỡ bỏ hoàn toàn Tomcat. Một điều tôi đã làm là đảm bảo tất cả ghi nhật ký (ứng dụng và Tomcat) không ghi nhật ký BÊN TRONG thư mục ứng dụng web / ứng dụng. Hoặc, cấu hình Tomcat để không khóa cũng hoạt động. Vì vậy, chúng tôi đặt đăng nhập ở một vị trí trung tâm bên ngoài thư mục của Tomcat. Hoạt động như một giấc mơ. Nhưng câu trả lời của bạn là hữu ích nhất. Cảm ơn!
cbmeeks

5
Khi triển khai lại mà không khởi động lại, bạn sẽ phải cẩn thận với việc rò rỉ bộ nhớ - thường thì trình nạp lớp sẽ làm rò rỉ các tham chiếu và bạn cần khởi động lại toàn bộ quá trình Tomcat để giải phóng bộ nhớ khỏi phiên bản cũ của ứng dụng. LiveRebel (được đề cập trong một câu trả lời khác) có thể tự động hóa tất cả những điều đó cho bạn.
Neeme Praks

3
Bạn không cần phải xóa cuộc chiến để triển khai lại. Chỉ cần sao chép chiến tranh cũ và đợi vài giây.
peceps

30

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 tệp jar cụ thể trong WEB-INF / lib và sau đó chạm vào web.xml, thay vì xây dựng toàn bộ tệp chiến tranh và triển khai lại.

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

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

  3. Sao chép qua một "thư mục" đã phát nổ vào thư mục ứng dụng web của bạn


1
Hữu ích khi biết rằng phương thức 'chạm' không tải lại các lớp. IOW, nó không xóa và tải lại hệ thống phân cấp trình tải lớp cho ứng dụng web
Rondo

2
Xem 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 để biết các thay đổi. Các tài nguyên khác có thể dễ dàng được liệt kê ở đó khi cần thiết.
Kevin

21

Trong thư mục conf của apache tomcat, bạn có thể tìm thấy 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 khởi động lại máy chủ


Thay vào đó, ưu tiên ứng dụng người quản lý. Đây là một hoạt động tốn kém cho ram.
Sorter
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.