Cách tốt nhất để phân phối các ứng dụng Java là gì? [đóng cửa]


115

Java là một trong những ngôn ngữ lập trình mà tôi lựa chọn. Tôi luôn gặp phải vấn đề khi phân phối ứng dụng của mình cho người dùng cuối.

Việc cung cấp cho người dùng một JAR không phải lúc nào cũng thân thiện với người dùng như tôi muốn và việc sử dụng Java WebStart yêu cầu tôi phải duy trì một máy chủ web.

Cách tốt nhất để phân phối một ứng dụng Java là gì? Điều gì sẽ xảy ra nếu ứng dụng Java cần cài đặt tạo tác vào máy tính của người dùng? Có bất kỳ hệ thống đóng gói / cài đặt Java tốt nào không?


Java WebStart có thể được sử dụng ngoài bất kỳ URL nào, chẳng hạn như hệ thống tệp như CD hoặc ổ đĩa mạng. Cho rằng nó không cung cấp cho bạn nhiều. Lưu ý: nhật thực không sử dụng trình cài đặt, bạn chỉ cần giải nén và chạy nó. Có lẽ bạn không cần trình cài đặt.
Peter Lawrey

1
Ngày nay, rất đơn giản để triển khai một ứng dụng Java WebStart như Google Application Engine.
Thorbjørn Ravn Andersen

6
Thật tiếc khi câu hỏi này bị đóng lại. Tôi không đồng ý với lý do được nêu là 'chủ yếu dựa trên quan điểm'. Các câu trả lời được cung cấp không dựa trên quan điểm mà dựa trên kinh nghiệm. Tôi luôn hoan nghênh những câu trả lời hay dựa trên kinh nghiệm. Những người không thể học từ lịch sử sẽ phải lặp lại nó.
bouvierr

Bạn có thể sử dụng jlink (được giới thiệu với JDK 9) để phân phối các ứng dụng Java. Nó đi kèm với JDK. Nó sẽ xây dựng một JRE dành riêng cho bạn. Bạn không cần phải cài đặt java trên các máy khách.
blueray

Câu trả lời:


89

Có nhiều giải pháp khác nhau, tùy thuộc vào yêu cầu phân phối của bạn.

  1. Chỉ cần sử dụng một cái lọ. Điều này giả định rằng người dùng đã cài đặt đúng phiên bản java, nếu không người dùng sẽ nhận được ngoại lệ "phiên bản định dạng tệp lớp". Điều này tốt cho việc phân phối nội bộ trong một công ty.

  2. Sử dụng launcher4j và trình cài đặt như NSIS. Điều này cho phép bạn kiểm soát nhiều hơn, mặc dù người dùng vẫn có thể làm những việc ngu ngốc như hủy cài đặt thời gian chạy java. Đây có lẽ là cách tiếp cận phổ biến nhất và là cách tôi hiện đang sử dụng.

  3. Sử dụng Webstart. Điều này cũng giả định rằng người dùng đã cài đặt đúng phiên bản java, nhưng sẽ dễ dàng hơn rất nhiều. Kinh nghiệm của tôi là điều này tốt cho các môi trường mạng nội bộ được kiểm soát chặt chẽ, nhưng sẽ trở thành một vấn đề với các triển khai lớn hơn vì nó có một số lỗi kỳ lạ. Nó có thể trở nên tốt hơn với công nghệ plug-in mới trong Java 1.7.

  4. Sử dụng trình biên dịch mã gốc như Excelsior JET và phân phối dưới dạng tệp thực thi hoặc gói nó trong trình cài đặt. Đắt tiền và nó thường ràng buộc bạn với một phiên bản java cũ hơn một chút và có một số khó khăn khi tải lớp động, nhưng nó rất hiệu quả để triển khai quy mô lớn, nơi bạn cần giảm thiểu sự phức tạp hỗ trợ của mình.


4
Chỉ cần một lưu ý trên Webstart: Miễn là người dùng đã cài đặt phiên bản Java không phải từ thời kỳ đồ đá (ví dụ: 1.2) thì có thể yêu cầu webstart tải xuống và cài đặt phiên bản Java mới hơn của phiên bản mà bạn yêu cầu cho chương trình của mình. chưa. Nhìn vào cú pháp tệp .jnlp. Tất nhiên, nó vẫn hiển thị khá nổi bật rằng bạn đang sử dụng Java, điều này có thể không phù hợp tùy thuộc vào khách hàng mà bạn giao dịch. Trong những trường hợp đó, bạn thực sự nên sử dụng một số loại định dạng tệp / trình cài đặt "gốc" và ẩn chi tiết triển khai càng nhiều càng tốt.
Daniel Schneller

10
Tôi không thích Webstart. Nó có quá nhiều thương hiệu Java / Sun. Thật khó để làm cho nó hoạt động đúng. Việc thiết lập ký mã rắc rối hơn mức đáng có và người dùng không hiểu những lợi ích và thông điệp bảo mật. Nếu bạn muốn làm bất cứ điều gì trên hệ thống người dùng, bạn sẽ phải trả tiền cho chứng chỉ ký mã của mình để thoát khỏi những cảnh báo đáng sợ Nó thực hiện rất nhiều bộ nhớ đệm phức tạp có thể gây ra sự cố. Có thể OSGi hoặc các mô-đun Java sắp tới sẽ cung cấp các lợi ích cập nhật tự động tương tự. Tôi sử dụng một biến thể của # 2 và tạo DMG / Packager cho mac tất cả từ Ant.
Cal

Tôi đã sử dụng NSIS như bạn đề xuất. Tôi cũng đã xem xét khởi động4j. Tại sao bạn khuyên bạn nên sử dụng cả hai?
jacknad

1
@JackN NSIS là một trình tạo trình cài đặt. Launch4j đặc biệt giúp khởi chạy / khởi động các chương trình java dễ dàng hơn. Có một số trùng lặp trong chức năng của chúng, nhưng chúng được nhắm mục tiêu đến các phần khác nhau của vấn đề.
Noel Grandin

+1 câu trả lời tuyệt vời. Bạn có bất kỳ kinh nghiệm với Excelsior JET? Nó chỉ hỗ trợ kiến ​​trúc x86 và không thể tải thư viện jar thời gian thực?
KJW

6

trình cài đặt nâng cao giúp bạn dễ dàng đóng gói các ứng dụng java dưới dạng tệp thực thi cửa sổ và nó khá linh hoạt theo cách bạn có thể thiết lập. Tôi thấy rằng để phân phối các ứng dụng java cho các máy khách windows, đây là cách dễ nhất để thực hiện.


5

JSmooth là một chương trình đơn giản lấy jar của bạn và gói nó trong một tệp thực thi windows tiêu chuẩn. Nó đi kèm với một GUI đơn giản cho phép bạn định cấu hình JVM cần thiết, gói nó với ứng dụng hoặc cung cấp một tùy chọn để tải xuống nếu nó chưa được cài đặt. Bạn có thể gửi tệp exe như hiện tại hoặc nén nó với các phụ thuộc có thể có (hoặc để chương trình tải xuống các phụ thuộc bổ sung từ mạng khi khởi động). Nó cũng miễn phí, như trong bia và bài phát biểu, có thể (hoặc có thể không) là một điều tốt.


4

Nó phụ thuộc vào mức độ tinh vi của người dùng mục tiêu của bạn. Trong hầu hết các trường hợp, bạn muốn tách biệt chúng khỏi thực tế là bạn đang chạy một ứng dụng dựa trên Java. Cung cấp cho họ một trình cài đặt gốc thực hiện đúng chức năng (tạo các mục nhập menu bắt đầu, trình khởi chạy, đăng ký thêm / xóa chương trình, v.v.) và đã đóng gói thời gian chạy Java (vì vậy người dùng không cần biết hoặc quan tâm đến nó). Tôi muốn đề xuất công cụ cài đặt đa nền tảng của chúng tôi, BitRock InstallBuilder. Mặc dù nó không dựa trên Java, nhưng nó thường được sử dụng để đóng gói các ứng dụng Java. Nó có thể được tích hợp dễ dàng với Ant và bạn có thể xây dựng các trình cài đặt Windows từ Unix / Linux / Mac và ngược lại. Bởi vì các trình cài đặt được tạo là bản địa, chúng không yêu cầu bước tự trích xuất hoặc JRE đã có trong hệ thống đích, có nghĩa là các trình cài đặt nhỏ hơn và giúp bạn đỡ đau đầu. Tôi cũng muốn đề cập rằng chúng tôi có giấy phép miễn phí cho các dự án mã nguồn mở



3

Nếu đó là một ứng dụng người dùng cuối có GUI thực sự, bạn nên bỏ qua quy tắc mà bạn đã viết chương trình (Java) và sử dụng trình cài đặt gốc cho mỗi nền tảng bạn đã chọn. Người dùng Mac muốn có .dmg và trên windows, bạn nên sử dụng trình cài đặt .msi hoặc .exe. Trên Windows, tôi thích NSIS từ NullSoft chỉ vì nó ít bị phản đối hơn InstallShield hoặc InstallAnywhere. Trên OSX, bạn có thể tin tưởng vào JVM đã có ở đó. Trên Windows, bạn sẽ cần kiểm tra và cài đặt nó cho họ nếu cần. Người dùng Linux sẽ không chạy các ứng dụng Java GUI và số ít sẽ biết phải làm gì với .jar có thể thực thi.


3
có thật không? Linux mọi người sẽ không chạy các ứng dụng gui? thì tôi đoán rằng chương trình của anh ấy là vô dụng đối với họ khi hiển thị toàn bộ cuộc thảo luận.
Matt

@Matt tại sao bạn lại cho rằng ứng dụng gốc là ứng dụng GUI? Tôi đã cài đặt nhiều ứng dụng java dòng lệnh trên Linux và những ứng dụng dưới dạng .deb hoặc .rpms được đánh giá cao đặc biệt.
Ry4an Brase,

1
Tiêu đề ban đầu cho biết GUI. Hơn nữa, nếu webstart đã được đưa lên, thì tốt nhất đó là một ứng dụng gui. Cuối cùng, nói người dùng linux không sử dụng các ứng dụng GUI là hoàn toàn sai sự thật.
Matt

Tôi không nói mọi người linux không chạy các ứng dụng GUI. Tôi đã nói rằng họ sẽ không chạy các ứng dụng "Java GUI" và bên ngoài NetBeans và Eclipse (mà tôi đã đề cập trong phần "số ít sẽ, biết phải làm gì với một jar thực thi") Tôi không thể nghĩ ra một ứng dụng được sử dụng rộng rãi Ứng dụng Java trên Linux (Open Office, v.v. là C ++ và chỉ sử dụng Java cho plugin).
Ry4an Brase

bao giờ nghe nói về SQLDeveloper? Hoặc bất kỳ công cụ quản lý oracle nào? Tất cả được mã hóa trong java (mặc dù sqldeveloper cuối cùng được đóng gói dưới dạng .exe, nhưng đó là java)
Matt

3

Mặc dù tôi chưa sử dụng NSIS (Nullsoft Scriptable Installer System), có những tập lệnh cài đặt sẽ kiểm tra xem JRE cần thiết có được cài đặt trên hệ thống đích hay không.

Nhiều tập lệnh mẫu có sẵn từ các trang Code ExamplesReal World Installers , chẳng hạn như:

(Xin lưu ý rằng tôi chưa thực sự sử dụng bất kỳ tập lệnh nào, vì vậy vui lòng không coi nó như một sự chứng thực.)


2

Tôi cần một cách để đóng gói dự án của mình và các phụ thuộc của nó vào một tệp jar duy nhất.

Tôi đã tìm thấy những gì tôi cần bằng cách sử dụng plugin Maven2 Assembly: Maven2 Assembly Maven2 Assembly

Điều này dường như sao chép chức năng của one-jar , nhưng không yêu cầu cấu hình bổ sung để hoạt động.


1

Đối với các ứng dụng Java đơn giản, tôi thích sử dụng Jar. Rất đơn giản để phân phối một tệp mà người dùng có thể chỉ cần nhấp vào (Windows) hoặc

java -jar jarname.jar

IMHO, jar là cách để đi khi sự đơn giản là yêu cầu chính.


Hãy thử điều này trên người mới và bạn sẽ thấy nó không hoạt động tốt.
rhody

1

Tôi phát triển các ứng dụng RCP nhật thực. Thông thường, để khởi động một ứng dụng nhật thực, một trình khởi chạy thực thi được bao gồm. Tôi bao gồm máy ảo java bên trong thư mục ứng dụng trong thư mục con / jre để đảm bảo rằng phiên bản java phù hợp sẽ được sử dụng.

Sau đó, chúng tôi đóng gói với Inno Setup để cài đặt trên máy của người dùng.


1

Cách tốt nhất để phân phối một ứng dụng Java là gì? Điều gì sẽ xảy ra nếu ứng dụng Java cần cài đặt tạo tác vào máy tính của người dùng? Có bất kỳ hệ thống đóng gói / cài đặt Java nào tốt không?

Theo kinh nghiệm của tôi (từ việc đánh giá một số tùy chọn ), install4j là một giải pháp tốt. Nó tạo ra các trình cài đặt gốc cho bất kỳ nền tảng nào và đặc biệt hướng tới việc cài đặt các ứng dụng Java. Để biết chi tiết, hãy xem " Tính năng " trên trang web của nó.

Tuy nhiên, install4j là một công cụ thương mại. Đặc biệt nếu nhu cầu của bạn tương đối đơn giản (chỉ cần phân phối một ứng dụng và cài đặt một số hiện vật), nhiều tùy chọn tốt khác tồn tại, bao gồm cả những tùy chọn miễn phí (như izPack hoặc Lauch4j đã được đề cập ). Nhưng bạn đã yêu cầu cách tốt nhất và theo hiểu biết hiện tại của tôi thì install4j là cách, đặc biệt để phân phối các ứng dụng Java (EE) lớn hơn hoặc phức tạp hơn.


Bạn có biết cách buộc nó chạy JVM 5.0 trên Mac OS không? Với các cửa sổ, bạn chỉ cần gói JRE, nhưng trên mac có thể chúng đã được định cấu hình JVM mặc định khác. Vì vậy, tôi không chắc chắn làm thế nào để buộc một cách rõ ràng để sử dụng phiên bản cụ thể JVM bạn muốn ...
Stephane Grenier

@Stephane, tôi chưa thực sự tạo trình cài đặt OS X bằng install4j, nhưng tôi nghĩ đó không phải là vấn đề với các tùy chọn phát hiện / gói JRE linh hoạt mà nó có. Để biết thêm về chúng, hãy kiểm tra các liên kết trong câu trả lời này: stackoverflow.com/questions/995881/…
Jonik

Vì Mac hỗ trợ tạo các gói ứng dụng Java, bạn chỉ có thể chỉ định JRE trong info.plist như vậy ... <key> JVMVersion </key> <string> 1.5+ </string> Bạn có thể xóa dấu cộng để yêu cầu một phiên bản cụ thể . Đây là cách tôi thực hiện nhưng tôi không sử dụng install4j. Có rất nhiều trang giải thích về việc tạo Mac App xuất hiện trên web. Tôi cũng khuyên bạn chỉ nên xem cách Lemonwire hoặc vuze (ứng dụng java) làm điều đó. Bạn cũng có thể xem các tập lệnh xây dựng mà họ sử dụng để tạo các gói ứng dụng và tệp dmg vì chúng là mã nguồn mở!
Cal

0

Câu trả lời tốt nhất phụ thuộc vào nền tảng. Để triển khai trên Windows, tôi đã có kết quả tốt khi sử dụng kết hợp một-jarkhởi chạy4j . Phải mất một chút thời gian để thiết lập môi trường xây dựng của tôi đúng cách (chủ yếu là tập lệnh kiến) nhưng bây giờ nó khá dễ dàng.


0

Theo quan điểm của tôi, cơ chế phân phối ưu việt là sử dụng một cái gì đó như ClickOnce hoặc WebStart công nghệ . Bạn chỉ cần triển khai phiên bản cho máy chủ và nó sẽ tự động đến máy khách khi phiên bản được phát hành. Ngoài ra, nền tảng Eclipse RCP chứa UpdateManager thực hiện những gì WebStart làm, nhưng còn nhiều hơn thế nữa.

Vì tôi đang sử dụng Maven2 để xây dựng, nên việc triển khai chỉ là một miếng bánh: sao chép jar đã xây dựng vào vị trí trên máy chủ, cập nhật tệp jnlp nếu cần và bạn đã hoàn tất.


0

cài đặt ở đâu tốt nhưng đắt tiền - tôi chưa tìm thấy (như) cái miễn phí tốt


Xem phần này để biết các lựa chọn thay thế InstallAnywhere, bao gồm một số lựa chọn miễn phí (cũng như các lựa chọn thương mại có giá hợp lý hơn nhiều): stackoverflow.com/questions/759855/…
Jonik

-2

Tôi sẽ nén tệp jar cùng với các lọ phụ thuộc khác, tệp cấu hình và tài liệu cùng với run.bat / run.sh. Người dùng cuối sẽ có thể giải nén nó vào bất kỳ vị trí nào và chỉnh sửa run.bat nếu cần (Nó sẽ chạy mà không cần chỉnh sửa trong hầu hết các trường hợp). Trình cài đặt có thể hữu ích nếu bạn muốn tạo các mục nhập trong menu bắt đầu, màn hình nền, khay hệ thống, v.v.

Là một người dùng, tôi thích giải nén và chạy kiểu cài đặt (vui lòng không có mục menu bắt đầu). Tuy nhiên, những người bên ngoài ngành CNTT có thể có những sở thích khác nhau. Vì vậy, nếu ứng dụng chủ yếu được nhắm mục tiêu cho các nhà phát triển tuyến đường zip-run.bat và các ứng dụng cho công chúng có thể được cài đặt bằng trình cài đặt.


Điều này sẽ không bao giờ hiệu quả đối với người mới.
rhody
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.