Apa cara terbaik untuk mendistribusikan aplikasi Java? [Tutup]

115

Java adalah salah satu bahasa pemrograman pilihan saya. Saya selalu mengalami masalah meskipun mendistribusikan aplikasi saya ke pengguna akhir.

Memberi pengguna JAR tidak selalu semudah yang saya inginkan dan menggunakan Java WebStart mengharuskan saya memelihara server web.

Apa cara terbaik untuk mendistribusikan aplikasi Java? Bagaimana jika aplikasi Java perlu menginstal artefak ke komputer pengguna? Apakah ada sistem penginstalan / pengemasan Java yang bagus di luar sana?

Laplie Anderson
sumber
Java WebStart dapat digunakan dari URL apa pun seperti sistem file seperti CD atau drive jaringan. Memang itu tidak memberi Anda banyak. Catatan: eclipse tidak menggunakan penginstal, Anda cukup membukanya dan menjalankannya. Mungkin Anda tidak membutuhkan penginstal.
Peter Lawrey
1
Saat ini sangat mudah untuk menerapkan aplikasi Java WebStart seperti misalnya Google Application Engine.
Thorbjørn Ravn Andersen
6
Sayang sekali pertanyaan ini ditutup. Saya tidak setuju dengan alasan yang dinyatakan 'sebagai terutama berdasarkan opini'. Jawaban yang diberikan tidak berdasarkan pendapat tetapi berdasarkan pengalaman. Saya selalu menerima jawaban yang baik berdasarkan pengalaman. Mereka yang tidak bisa belajar dari sejarah ditakdirkan untuk mengulanginya.
bouvierr
Anda dapat menggunakan jlink (diperkenalkan dengan JDK 9) untuk mendistribusikan Aplikasi Java. Itu datang dengan JDK. Ini akan membangun JRE khusus untuk Anda. Anda tidak perlu menginstal java di mesin klien.
blueray

Jawaban:

89

Ada berbagai solusi, tergantung pada kebutuhan distribusi Anda.

  1. Gunakan saja stoples. Ini mengasumsikan bahwa pengguna telah menginstal versi java yang benar, jika tidak, pengguna akan mendapatkan pengecualian "versi format file kelas". Ini bagus untuk distribusi internal di dalam perusahaan.

  2. Gunakan launch4j dan penginstal seperti NSIS. Ini memberi Anda lebih banyak kontrol, meskipun pengguna masih dapat melakukan hal-hal bodoh seperti membatalkan instalasi java runtime. Ini mungkin pendekatan yang paling populer, dan yang saat ini saya gunakan.

  3. Gunakan Webstart. Ini juga mengasumsikan bahwa pengguna telah menginstal versi java yang benar, tetapi jauh lebih mudah untuk memulainya. Pengalaman saya adalah bahwa ini baik-baik saja untuk lingkungan intranet yang dikontrol dengan ketat, tetapi menjadi masalah dengan penerapan yang lebih besar karena memiliki beberapa kegagalan yang aneh. Mungkin menjadi lebih baik dengan teknologi plug-in baru di Java 1.7.

  4. Gunakan kompiler kode asli seperti Excelsior JET dan distribusikan sebagai file yang dapat dieksekusi, atau bungkus dalam penginstal. Mahal, dan umumnya mengikat Anda ke versi java yang sedikit lebih lama, dan ada beberapa masalah dengan pemuatan kelas dinamis, tetapi sangat efektif untuk penerapan skala besar di mana Anda perlu meminimalkan kerepotan dukungan Anda.

Noel Grandin
sumber
4
Sekadar catatan di Webstart: Selama pengguna memiliki versi Java yang diinstal yang bukan dari zaman batu (misalnya 1.2), webstart dapat diminta untuk mengunduh dan menginstal versi Java yang lebih baru dari yang Anda butuhkan untuk program Anda tidak ada di sana namun. Lihat sintaks file .jnlp. Tentu saja itu masih cukup mencolok menunjukkan bahwa Anda menggunakan Java yang mungkin tidak sesuai tergantung pada klien yang Anda tangani. Dalam kasus tersebut, Anda memang harus semacam penginstal / format file "asli" dan menyembunyikan detail implementasi sejauh mungkin.
Daniel Schneller
10
Saya tidak suka Webstart. Ini memiliki terlalu banyak branding Java / Sun. Sulit untuk membuatnya bekerja dengan benar. Menyiapkan penandatanganan kode lebih merepotkan daripada nilainya dan pengguna tidak memahami manfaat keamanan dan pesannya. Jika Anda ingin melakukan sesuatu pada sistem pengguna Anda harus membayar sertifikat penandatanganan kode Anda untuk menghilangkan peringatan menakutkan Itu melakukan banyak caching rumit yang dapat menyebabkan masalah. Mungkin OSGi atau modul Java yang akan datang akan menawarkan manfaat pembaruan otomatis yang serupa. Saya menggunakan variasi # 2 dan membuat DMG / Packager untuk mac semua dari Ant.
Kal
Saya menggunakan NSIS seperti yang Anda sarankan. Saya juga melihat launch4j. Mengapa Anda merekomendasikan menggunakan keduanya?
jacknad
1
@JackN NSIS adalah generator pemasang. Launch4j secara khusus untuk mempermudah peluncuran / memulai program java. Ada beberapa fungsi yang tumpang tindih, tetapi mereka ditargetkan ke bagian masalah yang berbeda.
Noel Grandin
+1 jawaban bagus. Apakah Anda punya pengalaman dengan Excelsior JET? Apakah itu hanya mendukung arsitektur x86 dan tidak dapat memuat perpustakaan jar realtime?
KJW
6

penginstal lanjutan memudahkan untuk mengemas aplikasi java sebagai windows executable, dan ini cukup fleksibel dalam cara Anda mengaturnya. Saya telah menemukan bahwa untuk mendistribusikan aplikasi java ke klien windows, ini adalah cara termudah untuk melakukannya.

karatyshelf
sumber
5

JSmooth adalah program sederhana yang mengambil jar Anda dan membungkusnya dalam file executable windows standar. Muncul dengan GUI sederhana yang memungkinkan Anda untuk mengkonfigurasi JVM yang diperlukan, menggabungkannya dengan aplikasi atau memberikan opsi untuk mengunduhnya jika belum diinstal. Anda dapat mengirim file exe apa adanya atau zip dengan kemungkinan dependensi (atau biarkan program mendownload dependensi tambahan dari internet saat startup). Ini juga gratis, seperti dalam bir dan pidato, yang mungkin (atau mungkin tidak) merupakan hal yang baik.

stian
sumber
4

Itu tergantung pada seberapa canggih pengguna target Anda. Dalam kebanyakan kasus, Anda ingin mengisolasi mereka dari fakta bahwa Anda menjalankan aplikasi berbasis Java. Beri mereka penginstal asli yang melakukan hal yang benar (buat entri menu mulai, peluncur, daftar dengan program tambah / hapus, dll.) Dan sudah menggabungkan runtime Java (sehingga pengguna tidak perlu mengetahui atau memedulikannya). Saya ingin menyarankan alat instalasi lintas platform kami, BitRock InstallBuilder. Meskipun tidak berbasis Java, ini biasanya digunakan untuk memaketkan aplikasi Java. Ini dapat dengan mudah diintegrasikan dengan Ant dan Anda dapat membangun penginstal Windows dari Unix / Linux / Mac dan sebaliknya. Karena pemasang yang dihasilkan adalah asli, mereka tidak memerlukan langkah ekstraksi mandiri atau JRE untuk sudah ada di sistem target, yang berarti pemasang yang lebih kecil dan tidak membuat Anda pusing. Saya juga ingin menyebutkan bahwa kami memiliki lisensi gratis untuk proyek sumber terbuka

Daniel Lopez
sumber
3

Jika ini adalah aplikasi pengguna akhir yang memiliki GUI, Anda harus mengabaikan bahasa tempat Anda menulis program (Java) dan menggunakan penginstal asli untuk setiap platform yang Anda pilih. Orang-orang Mac menginginkan .dmg dan di windows a .msi atau penginstal .exe adalah cara yang tepat. Di Windows, saya lebih suka NSIS dari NullSoft hanya karena kurang disukai daripada InstallShield atau InstallAnywhere. Di OSX Anda dapat mengandalkan JVM yang sudah ada. Di Windows, Anda harus memeriksa dan menginstalnya jika perlu. Orang Linux tidak akan menjalankan aplikasi Java GUI, dan sedikit yang akan tahu apa yang harus dilakukan dengan file .jar yang dapat dieksekusi.

Ry4an Brase
sumber
3
Betulkah? orang linux tidak akan menjalankan aplikasi gui? maka saya kira programnya tidak berguna bagi mereka untuk membuat seluruh perdebatan diskusi.
Matt
@Matt mengapa Anda menganggap aplikasi asli adalah aplikasi GUI? Saya telah menginstal banyak aplikasi java baris perintah di Linux, dan aplikasi yang muncul sebagai .deb atau .rpms sangat dihargai.
Ry4an Brase
1
Judul aslinya mengatakan GUI. Selain itu, jika webstart telah dimunculkan, ada baiknya itu adalah aplikasi gui. Terakhir, mengatakan bahwa pengguna linux tidak menggunakan aplikasi GUI sama sekali tidak benar.
Matt
Saya tidak mengatakan orang linux tidak menjalankan aplikasi GUI. Saya mengatakan mereka tidak akan menjalankan aplikasi "Java GUI", dan di luar NetBeans dan Eclipse (yang saya bahas di bawah "beberapa yang akan, tahu apa yang harus dilakukan dengan toples yang dapat dieksekusi") Saya tidak dapat memikirkan satu pun yang banyak digunakan Aplikasi Java di Linux (Open Office, dll. Adalah C ++ dan menggunakan Java hanya untuk plugin).
Ry4an Brase
pernah mendengar tentang SQLDeveloper? Atau salah satu alat manajemen oracle? Semua kode di java (meskipun sqldeveloper akhirnya dibundel sebagai .exe, tapi itu java)
Matt
3

Meskipun saya sendiri belum pernah menggunakan NSIS (Nullsoft Scriptable Installer System), ada skrip penginstalan yang akan memeriksa apakah JRE yang diperlukan telah diinstal pada sistem target atau tidak.

Banyak contoh skrip tersedia dari Contoh Kode dan halaman Pemasang Dunia Nyata , seperti:

(Harap perhatikan bahwa saya belum benar-benar menggunakan skrip apa pun, jadi tolong jangan menganggapnya sebagai dukungan.)

burung coobird
sumber
2

Saya membutuhkan cara untuk mengemas proyek saya dan ketergantungannya ke dalam satu file jar.

Saya menemukan apa yang saya butuhkan dengan menggunakan plugin Maven2 Assembly : plugin Maven2 Assembly

Ini tampaknya menduplikasi fungsionalitas one-jar , tetapi tidak memerlukan konfigurasi tambahan untuk menjalankannya.

David Carlson
sumber
1

Untuk aplikasi Java sederhana saya suka menggunakan Jar. Sangat mudah untuk mendistribusikan satu file yang pengguna cukup klik (Windows), atau

java -jar jarname.jar

IMHO, jar adalah cara yang harus ditempuh ketika kesederhanaan adalah persyaratan utama.

jjnguy
sumber
Coba ini pada pemula dan Anda akan menemukannya tidak akan bekerja dengan baik.
rhody
1

Saya mengembangkan aplikasi eclipse RCP. Biasanya untuk memulai aplikasi gerhana, peluncur yang dapat dieksekusi disertakan. Saya menyertakan mesin virtual java di dalam folder aplikasi di sub direktori / jre untuk memastikan bahwa versi java yang benar akan digunakan.

Kemudian kami mengemas dengan Inno Setup untuk instalasi pada mesin pengguna.

Mario Ortegón
sumber
1

Apa cara terbaik untuk mendistribusikan aplikasi Java? Bagaimana jika aplikasi Java perlu menginstal artefak ke komputer pengguna? Apakah ada sistem penginstalan / pengemasan Java yang bagus di luar sana?

Dalam pengalaman saya (dari mengevaluasi sejumlah opsi ), install4j adalah solusi yang bagus. Ini membuat installer asli untuk platform apa pun, dan secara khusus diarahkan untuk menginstal aplikasi Java. Untuk detailnya, lihat " Fitur " di situsnya.

install4j adalah alat komersial. Terutama jika kebutuhan Anda relatif sederhana (hanya mendistribusikan aplikasi dan menginstal beberapa artefak), banyak pilihan yang baik lainnya ada, termasuk yang gratis (seperti izPack atau telah disebutkan Lauch4j ). Tapi Anda meminta cara terbaik , dan sepengetahuan saya install4j adalah salah satunya, terutama untuk mendistribusikan aplikasi Java (EE) yang lebih besar atau lebih rumit.

Jonik
sumber
Apakah Anda tahu cara memaksanya menjalankan JVM 5.0 di Mac OS? Dengan windows Anda hanya memaketkan JRE, tetapi di mac mungkin saja mereka memiliki JVM default lain yang dikonfigurasi. Jadi saya tidak yakin bagaimana memaksanya secara eksplisit untuk menggunakan versi JVM tertentu yang Anda inginkan ...
Stephane Grenier
@Stephane, saya belum benar-benar membuat penginstal OS X menggunakan install4j, tetapi saya pikir itu seharusnya tidak menjadi masalah mengingat opsi bundling / deteksi JRE yang fleksibel yang dimilikinya. Untuk lebih lanjut tentang mereka, periksa tautan dalam jawaban ini: stackoverflow.com/questions/995881/…
Jonik
Karena Mac mendukung pembuatan bundel aplikasi Java, Anda dapat menentukan JRE di info.plist seperti ini ... <key> JVMVersion </key> <string> 1.5+ </string> Anda dapat menghapus plus untuk meminta versi tertentu . Ini adalah bagaimana saya melakukannya tetapi saya tidak menggunakan install4j. Ada banyak halaman yang menjelaskan membuat budles Mac App di web. Saya juga, merekomendasikan hanya melihat bagaimana limewire atau vuze (aplikasi java) melakukannya. Anda juga dapat melihat skrip build yang mereka gunakan untuk membuat app bundle dan file dmg karena bersifat open source!
Kal
0

Jawaban terbaik tergantung pada platformnya. Untuk penerapan di Windows, saya mendapatkan hasil yang bagus menggunakan kombinasi one-jar dan launch4j . Butuh sedikit waktu untuk menyiapkan lingkungan build saya dengan benar (skrip semut, kebanyakan) tetapi sekarang cukup tidak menyakitkan.

kualidafial
sumber
0

Nah dari sudut pandang saya mekanisme distribusi yang unggul adalah dengan menggunakan sesuatu seperti ClickOnce , atau WebStart teknologi . Anda hanya menerapkan versi ke server dan itu secara otomatis ke klien saat versi dirilis. Juga platform Eclipse RCP berisi UpdateManager yang melakukan apa yang dilakukan WebStart, tetapi juga lebih banyak lagi.

Karena saya menggunakan Maven2 untuk membangun, penerapannya sangat mudah: salin jar yang dibangun ke lokasi di server, perbarui file jnlp jika perlu dan Anda selesai.

Petr Macek
sumber
0

installanywhere bagus tapi mahal - saya belum menemukan yang gratis bagus

Tom
sumber
Lihat ini untuk alternatif InstallAnywhere, termasuk beberapa yang gratis (serta yang komersial yang harganya jauh lebih terjangkau): stackoverflow.com/questions/759855/…
Jonik
-2

Saya akan zip file jar bersama dengan toples dependen lainnya, file konfigurasi dan dokumentasi bersama dengan run.bat / run.sh. Pengguna akhir harus dapat mengekstraknya ke lokasi mana pun dan mengedit run.bat jika diperlukan (Ini harus berjalan tanpa mengedit di sebagian besar kasus). Penginstal mungkin berguna jika Anda ingin membuat entri di menu mulai, desktop, baki sistem, dll.

Sebagai pengguna, saya lebih suka unzip dan menjalankan jenis instalasi (mohon jangan masukkan menu start). Namun Orang-orang di luar industri TI mungkin memiliki preferensi yang berbeda. Jadi jika aplikasi sebagian besar ditargetkan untuk pengembang rute zip-run.bat dan aplikasi untuk masyarakat umum dapat diinstal menggunakan penginstal.

Rejeev Divakaran
sumber
Ini tidak akan berhasil untuk pemula.
rhody