2011-11-28 26 views
8

Tại công ty của tôi, chúng tôi đang sử dụng Java Web Start để phân phối phần mềm ứng dụng khách cho khách hàng. Họ đang sử dụng các phiên bản Windows khác nhau: XP, Vista và 7.Java Web Start luôn lưu trữ tệp JNLP trên Windows XP

Chúng tôi đã triển khai phiên bản qua JWS với các sự cố tối thiểu trong quá khứ. Bản phát hành mới nhất của chúng tôi bao gồm một số thay đổi về tệp, một số lọ đã biến mất, một số khác đã xuất hiện, v.v.

Chúng tôi phát hiện ra rằng việc nâng cấp trên máy Windows XP không thành công vì JWS vẫn cố tra cứu các tệp jar không khả dụng trên web nữa máy chủ. Tôi đã kiểm tra nhật ký máy chủ HTTP của mình và tệp JNLP không bao giờ được truy cập từ các máy XP trong khi khởi động ứng dụng. Nếu tôi thử tương tự trên Vista hoặc Windows 7 mọi thứ hoạt động tốt, JWS tìm nạp bộ mô tả JNLP và tải xuống sự khác biệt khi có bản cập nhật. Vì vậy, trên các máy XP chỉ các tệp jar đã biết mới được cập nhật và JWS ném một lỗi nếu nó không tìm thấy thứ gì đó từ tệp bộ nhớ cache của JNLP.

Tôi đã viết một servlet tạo thủ công tệp JNLP. Tôi đang sử dụng cấu hình tiêu đề sau trong mã servlet của tôi.

response.setDateHeader("Last-Modified", lastModification); 
// IE won't download JNLP file if Cache-Control header presents 
//response.setHeader("Cache-Control", "no-cache, must-revalidate"); 
response.setHeader("Expires", "Mon, 26 Jul 1990 05:00:00 GMT"); 

Điều này làm cho tệp JNLP luôn lỗi thời, điều này sẽ kích hoạt kiểm tra lại tệp mỗi khi khách hàng bắt đầu qua JWS. Tôi thậm chí có thể thấy ngày này trong trình xem bộ nhớ cache trên XP:

Cache Viewer

Tôi đã tìm thấy một vấn đề không bao giờ giải quyết về vấn đề này trên trang web về báo cáo lỗi của Oracle: Bug ID: 6189106 Chỉ cần thử nghiệm tương tự với Java7 trên Windows XP nhưng vấn đề này vẫn còn tồn tại. Nhưng chỉ trên XP vì các ký tự khoảng trắng trong đường dẫn của bộ nhớ cache triển khai ("Tài liệu và cài đặt" bạn biết). Ai đó nói rằng nếu tôi thay đổi đường dẫn của bộ nhớ cache triển khai thành một thứ không có ký tự khoảng trống, nó sẽ giải quyết vấn đề. Vâng, nó không phải là một giải pháp thực tế bởi vì người dùng khó có thể viết thư cho các địa điểm khác ngoài hồ sơ của họ.

Vì lỗi này tồn tại trong một thời gian dài nên tôi đoán có một số cách giải quyết khác. Tôi không muốn nói với khách hàng mọi lúc để xóa bộ đệm Java và cài đặt lại ứng dụng từ web. Chúng tôi muốn chuyển sang chu kỳ phát hành nhanh hơn trong tương lai, điều này sẽ làm cho điều này trở nên tồi tệ hơn. Tôi hy vọng ai đó có một ý tưởng tốt cho việc này. : |

+0

Từ tùy chọn java trong ngăn điều khiển, bạn có thể bỏ chọn nhãn "giữ tệp tạm thời" không? – hurtledown

+0

Anh ấy không muốn khách hàng gây rối với Bảng điều khiển –

Trả lời

5

Sự cố nằm trong đường dẫn đến bộ đệm ẩn của webstart java. Nếu nó chứa không gian (chính xác là trường hợp trong XP) thì đường dẫn được truyền theo định dạng sai cho các javaws và điều này sẽ chặn việc kiểm tra cập nhật của tệp jnlp.

Thay đổi đường dẫn này trong deployment.properties nộp như thế này:

deployment.user.cachedir = C \: \ \ đường dẫn của bạn - con đường này không được chứa khoảng trắng.

P.S. sạch bộ nhớ cache java trước đó.

gia tăng: Vấn đề dường như được xuất hiện sau khi cập nhật 21.

+1

Tôi chấp nhận câu trả lời này vì nó thực sự thực hiện thủ thuật. Tuy nhiên chúng tôi không thể thực sự làm điều này bởi vì các quản trị viên tổ chức phải thay đổi cấu hình trên mọi máy trạm mà không phải là một cách có thể đi được. Để giải quyết một phần vấn đề này, chúng tôi đã thay đổi cấu trúc dự án của mình để đóng gói mọi thứ cần thiết vào một JAR. Bằng cách này, XP không lưu trữ tệp JNLP, vì danh sách tệp sẽ luôn giống nhau. Chúng tôi yêu cầu khách hàng tải lại dự án một lần nữa. Không phải là một giải pháp thanh lịch nhưng nó hoạt động. – NagyI

5

Tôi đã tìm ra một giải pháp hacky các loại:

  1. Đặt một số phiên bản trong tập tin JNLP của bạn, đi qua nó làm đối số cho phương pháp chính của bạn (ví dụ: <argument>1.0</argument>). Hoặc bạn có thể vượt qua dấu thời gian rõ ràng.

  2. Kiểm tra) thuộc tính hệ thống java.version hoặc javawebstart.version để xem ứng dụng của bạn có đang chạy trên bất kỳ thứ gì từ 1.6.0_22 đến 1.7.0_2 (bao gồm) hay không; và b) kiểm tra thuộc tính hệ thống deployment.user.cachedir để xem nó có bất kỳ khoảng trống nào trong đó không. Nếu a) và b) không đúng cả hai, có thể không có điểm nào trong việc tiếp tục với các bước bên dưới, vì Java Web Start nên đã kiểm tra tệp JNLP để tự cập nhật.

  3. Khi khởi động, trước khi hiển thị bất kỳ biểu mẫu nào, hãy tải tệp JNLP của bạn xuống bộ nhớ (ví dụ: sử dụng new URL(jnlpUrlString).openStream() v.v.). Tôi chuyển URL của tệp JNLP vào ứng dụng của tôi dưới dạng đối số từ chính tệp JNLP, giống như cho số phiên bản.

  4. Kiểm tra tệp JNLP để xem tệp có chứa số phiên bản đã được chuyển vào phương thức chính của bạn hay không (ví dụ: tìm kiếm chuỗi đơn giản cho "<argument>" + versionNumberPassedIntoMainMethod + "</argument>"). Nếu có, bạn tốt, khi bạn đang chạy phiên bản mới nhất. Nếu không, hãy tiếp tục:

  5. Lưu tệp JNLP trong thư mục tạm thời (ví dụ: sử dụng File.createTempFile(...)).

  6. Tải hệ thống để mở tệp JNLP từ thư mục tạm thời, ví dụ: với java.awt.Desktop.getDesktop().open(jnlpFile) nếu bạn đang nhắm mục tiêu Java 1.6 trở lên.

  7. System.exit(0) để đóng phiên bản lỗi thời của ứng dụng và để phiên bản cập nhật tiếp quản.

Tôi cũng lưu trữ và kiểm tra ngày tải xuống cuối cùng trong sổ đăng ký (sử dụng java.util.prefs.Preferences) để ngăn nhiều lần tải xuống hoặc mở lại liên tiếp. Ý tưởng là để giảm cơ hội của một lỗi trong mã của tôi gây ra một cái gì đó quá khó chịu như một vòng lặp vô hạn của kiểm tra mở-reopen-check-reopen-kiểm tra vv Và tôi tải về tập tin JNLP với một thời gian chờ để kết nối chậm có thể ' t ngăn ứng dụng mở quá lâu. Nhưng đó chỉ là tính năng bổ sung tùy chọn.

Khi ứng dụng của tôi chạy với <security><all-permissions/><security/>, không có sự cố khi tải xuống tệp JNLP, lưu tệp đó vào máy tính và mở nó bằng chương trình mặc định. Có thể tìm cách giải quyết cho từng bước trong số đó bằng cách sử dụng thư viện javax.jnlp, do đó bạn không cần tất cả các quyền, nhưng tôi không quá chắc chắn về điều đó.

Nhìn chung, cách tiếp cận này dường như hoạt động rất tốt. Nhưng tôi vẫn hy vọng một ngày khi các lỗi Java Web Start như thế này là một điều của quá khứ, vì loại vô nghĩa này thực sự không cần thiết.

+0

Cảm ơn bạn đã chia sẻ nó! Tôi có âm thanh thực sự khó khăn:/​​Tôi chắc chắn sẽ cung cấp cho nó một thử nếu giải pháp hiện tại của chúng tôi (xem bình luận của câu trả lời chấp nhận) không cho một số loại lý do. – NagyI

+0

Trạng thái hiện tại là gì, bạn có biết? –

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