2009-11-17 33 views
6

Tôi có một số ứng dụng, có khả năng tự cập nhật. Nó tải xuống tệp jar từ mạng và sau đó cố gắng thay thế jar đã sử dụng để chạy ứng dụng này bằng cách tải xuống một tệp. Nhưng tôi không thể làm điều đó, bởi vì tập tin bị khóa bởi các cửa sổ, bởi vì ứng dụng vẫn đang chạy.Cách xóa tập tin được sử dụng/khóa bởi các cửa sổ trong java

Có ai biết một số cách giải quyết khác không?

Trả lời

4

Một trong những giải pháp phổ biến cho việc này là chạy trình cập nhật của bạn chương trình riêng biệt. Bạn đã bao giờ nhận thấy rằng Firefox phải khởi động lại khi nó được cập nhật chưa? Vâng đó là bởi vì một quá trình riêng biệt (updater.exe) đang cập nhật các tập tin, sau đó khởi động lại Firefox.

Bạn có thể thử phương pháp này. Trở ngại duy nhất tôi thấy trong cách là cố gắng để tự động hóa chương trình MAIN để đóng chính nó. Cách di động duy nhất để thực hiện điều này (trong đầu của tôi) là cho ứng dụng chính chờ tín hiệu giết thông qua một ổ cắm cục bộ và trình cập nhật có thể gửi lệnh thông qua mạng cục bộ. Một điều nữa bạn phải xem xét là trình cập nhật phải chạy trong một tiến trình java riêng biệt. Nếu chương trình chính của bạn vừa tạo ra một đối tượng Updater mới, Updater sẽ cùng tồn tại với JVM của chương trình chính, nó sẽ đưa bạn trở lại hình vuông.

2

Tôi nghĩ rằng điều chính xác cần làm ở đây là để khởi động lại ứng dụng. Sự kiện nếu bạn có thể cập nhật bình tại thời gian chạy , tất cả các loại lỗi có thể xảy ra sau vì phiên bản lớp, các lớp khác nhau, triển khai khác nhau, v.v.

0

Cách điển hình để thực hiện việc này là viết trình cập nhật riêng biệt sẽ được chương trình chính của bạn gọi khi thấy bản cập nhật. Tại thời điểm này, chương trình chính của bạn có thể khởi động trình cập nhật trong một quy trình mới và thoát. Bạn cập nhật có thể chờ chương trình chính thoát ra, tải xuống và sao chép các tệp đã cập nhật và khởi động lại chương trình chính của bạn

2

Đó là sự cố đã được giải quyết bởi OSGi.

Vấn đề thực sự không phải là tải phiên bản jar mới. Điều này có thể được thực hiện với trình nạp lớp của riêng bạn để giải phóng khóa tệp. Vấn đề thực sự là làm thế nào để handle instances of different versions of the same class.

Khởi động lại sẽ bỏ qua những vấn đề này. Nếu bạn thực sự cần các phiên bản jar khác nhau trong một ứng dụng sử dụng OSGi.

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