2011-06-13 28 views
16

Tôi muốn có thể triển khai các thay đổi mã cho Tomcat (gần ngay lập tức), trong khi tôi đang phát triển trong Eclipse.Tomcat và Eclipse Zero triển khai quay vòng

Cho đến nay, tôi có đầu ra của mình từ Eclipse đặt các lớp dựng sẵn trong thư mục WEB-INF/classes của ứng dụng web của tôi.

Tôi cũng có ngữ cảnh có thể tải lại, với tài nguyên được xem là web.xml. Mọi chỉnh sửa/lưu vào tệp này sẽ tải lại ứng dụng web của tôi, chỉ mất hơn một giây - nhanh hơn nhiều so với việc tạo tệp chiến tranh mới và triển khai tệp đầy đủ.

Tuy nhiên, những gì tôi muốn làm là kích hoạt triển khai lại khi tôi chỉnh sửa bất kỳ tệp nguồn nào. Khi các tệp .class đang được sửa đổi trong Tomcat, có vẻ như tôi chỉ cần theo dõi bất kỳ thay đổi nào trong thư mục WEB-INF/classes và đó là các con.

Tôi đã đọc rằng tôi có thể thêm tài nguyên đã xem bổ sung vào số context.xml của Tomcat. Tuy nhiên, điều này dường như không hoàn toàn là gì - trừ khi có thể chỉ định thư mục sẽ được theo dõi (bao gồm theo dõi đệ quy thư mục con và tệp))?

<Context> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <WatchedResource>WEB-INF/someother.file</WatchedResource> 
    <Manager pathname=""/> 
</Context> 

Vì vậy, về cơ bản, câu hỏi của tôi là tôi có thể xem toàn bộ thư mục lớp học (không bao gồm mỗi WatchedResource rõ ràng) để kích hoạt một redeploy trong Tomcat?

Nếu không, tôi có thể định cấu hình Eclipse thành touch tệp web.xml, bất cứ khi nào tôi lưu tệp nguồn trong dự án đó? Tôi đang phát triển trên một hệ thống Windows. :(


PS Tôi không quan tâm đến các sản phẩm JRebel. Bất kỳ câu trả lời phải là một giải pháp miễn phí .


Cập nhật

Theo Tomcat documentation, nên theo dõi thư mục lớp học bằng cách đặt bối cảnh thành có thể tải lại:

Đặt thành true nếu bạn muốn Catalina đến các lớp giám sát trong/WEB-INF/classes/ và/WEB-INF/lib để thay đổi và tự động tải lại trang web ứng dụng nếu phát hiện thay đổi.

Chỉ những thay đổi đối với web.xml dường như kích hoạt tải lại. Đây có phải là lỗi hoặc thiết lập của tôi không chính xác không?

Ngoài ra, tôi đã đọc về cách thiết lập các thuộc tính docBase cho một bối cảnh cụ:

docBase="webapps/someExample" 

này dường như được gần gũi với những gì tôi cần, như tôi sau đó có thể tái xuất trong Eclipse một cách nhanh chóng. Vấn đề duy nhất của tôi là tôi yêu cầu một số ứng dụng web/servlet để chạy trong Tomcat đồng thời, trên cùng một cổng, v.v.

Trả lời

5

Đối với những trường hợp này, tôi đặt đầu ra xây dựng nhật thực thành WEB-INF/classes như bạn đã làm và tạo tệp ngữ cảnh bằng docBase được đặt thành thư mục webapp (mẹ của WEB-INF) trong dự án. Điều này được đặt thủ công trong conf/Catalina/localhost (giả định cấu hình mặc định cho một số phần tử của server.xml). Kết quả cuối cùng là tomcat kết thúc phục vụ từ thư mục phát triển. Vì vậy, thay đổi một servlet hoặc lớp khác và nó được cập nhật vào thư mục lớp. Lưu jsp và nó có sẵn ngay lập tức.

Nếu dự án có cấu trúc như sau:

src 
|-main 
    |-webapp 
    |-images 
    |-js 
    |-WEB-INF 
     |-jsp 
     |-classes 

Sau đó, bối cảnh sẽ như thế nào:

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/path" reloadable="true" 
    docBase="<pathtoproject>/src/main/webapp" /> 
+0

Bạn có biết có cách nào để thực hiện việc này với nhiều ứng dụng web đang chạy trên Tomcat không? (Chỉ một người cần phải ở trong con đường 'xây dựng đầu ra') – Mikaveli

+0

Tôi không chắc chắn tôi theo bạn. Bạn có nhiều dự án web độc lập mà bạn muốn hành xử theo cùng một cách trong quá trình phát triển không? Hoặc, bạn có nhiều dự án web đang sử dụng cùng một thư viện được chia sẻ và bạn muốn biên dịch thư viện được chia sẻ thành thư mục lớp dự án web không? Nếu các dự án độc lập, thì bạn chỉ cần một tệp ngữ cảnh cho mỗi dự án (đặt tên tệp là .xml). Nếu các dự án sử dụng cùng một mã chia sẻ và bạn muốn biên dịch vào thư mục lớp web, thì tôi không chắc chắn bạn sẽ làm như thế nào. – philwb

+0

Tôi có nhiều ứng dụng web phải chạy trong cùng một phiên bản của Tomcat - Tôi không cần hành vi 'triển khai nóng' tương tự từ chúng. – Mikaveli

2

Có thể dự án công cụ Web của Eclipse đã tự động triển khai lại sẽ giúp bạn? Thêm một máy chủ, các thuộc tính mở và trong phần Xuất bản, bạn sẽ thấy một nút vô tuyến nói "Tự động xuất bản khi thay đổi tài nguyên".Điều này sẽ dẫn đến một redeploy nếu các lớp thay đổi nếu không chỉ ghi đè tài nguyên. Bạn có thể cài đặt WTP thông qua một trang web cập nhật được xây dựng (chỉ dành cho Eclipse), vì vậy hãy kiểm tra các bản cập nhật phần mềm của bạn. Nó hoàn toàn miễn phí cho hầu hết các máy chủ nhưng nó không hỗ trợ một số tính năng Websphere nhất định?

+0

Tôi đã sử dụng WTP. Một bản tái bản đầy đủ của dự án của tôi sẽ mất vài phút, đó là những gì tôi đang cố gắng tránh. – Mikaveli

+0

Có phải vì quá trình triển khai lại mất quá nhiều thời gian? Tôi có nghĩa là khởi động lại bối cảnh servlet và khởi động bộ đệm (mùa xuân, vv) mất thời gian. Hoặc những gì đang dùng quá nhiều thời gian? – toomasr

+0

Vì có quá nhiều lớp và tệp, việc xây dựng trong Eclipse mất nhiều thời gian để làm sạch và tái xuất bản. Nếu tôi sửa đổi các lớp như tôi đi, sau đó chỉ cần tải lại bối cảnh, đây là _much_ nhanh hơn. Ngoài ra, vui lòng xem cập nhật của tôi. Cảm ơn. – Mikaveli

0

Hãy thử Spring Loaded đại lý JVM tôi đã mô tả trong các câu trả lời sau đây: https://stackoverflow.com/a/37064672/1034436

Trong khi đã làm việc cho ứng dụng web mùa xuân của tôi, điều này sẽ làm việc với vani Eclipse + WTP + Tomcat + Ứng dụng web động ns kể từ khi Spring Loaded hoạt động trên cấp độ JVM/classloading.

Bạn sẽ vẫn cần sử dụng "Tự động xuất bản khi tài nguyên thay đổi" như được đề cập bởi @toomasr trong câu trả lời của mình. Tuy nhiên, bạn cũng phải tắt tùy chọn "Tự động tải lại mô-đun theo mặc định". Nếu bạn đã thêm/xuất bản các mô-đun từ Eclipse vào Tomcat, thì hãy tắt "Tự động Nạp lại" cho từng mô-đun web (thông qua tab Mô-đun của trang cấu hình Tomcat). Điều đó sẽ ngăn Tomcat tải lại ứng dụng khi một tệp lớp duy nhất được cập nhật, mà tôi nghi ngờ là tất cả những gì tải lại/thời gian chờ đợi đó là.

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