วิธีใดดีที่สุดในการเผยแพร่แอปพลิเคชัน Java [ปิด]


115

Java เป็นหนึ่งในภาษาโปรแกรมที่ฉันเลือก ฉันมักประสบปัญหาแม้ว่าจะแจกจ่ายแอปพลิเคชันของฉันให้กับผู้ใช้ปลายทาง

การให้ JAR แก่ผู้ใช้ไม่ได้เป็นมิตรกับผู้ใช้เสมอไปเท่าที่ฉันต้องการและการใช้ Java WebStart ต้องการให้ฉันดูแลเว็บเซิร์ฟเวอร์

วิธีใดดีที่สุดในการเผยแพร่แอปพลิเคชัน Java จะเกิดอะไรขึ้นหากแอปพลิเคชัน Java จำเป็นต้องติดตั้งสิ่งประดิษฐ์ลงในคอมพิวเตอร์ของผู้ใช้ มีระบบการติดตั้ง / บรรจุภัณฑ์ Java ที่ดีหรือไม่?


Java WebStart สามารถใช้กับ URL ใดก็ได้เช่นระบบไฟล์เช่นซีดีหรือไดรฟ์เครือข่าย จริงอยู่ที่มันไม่ได้ให้คุณมากเท่า หมายเหตุ: eclipse ไม่ได้ใช้โปรแกรมติดตั้งคุณเพียงแค่แกะมันออกมาและเรียกใช้งาน บางทีคุณไม่จำเป็นต้องติดตั้ง
Peter Lawrey

1
ทุกวันนี้การปรับใช้แอปพลิเคชัน Java WebStart เช่น Google Application Engine เป็นเรื่องง่ายมาก
Thorbjørn Ravn Andersen

6
เป็นเรื่องน่าเสียดายที่คำถามนี้ถูกปิด ฉันไม่เห็นด้วยกับเหตุผลที่ระบุว่า 'ตามความคิดเห็นเป็นหลัก' คำตอบที่ให้ไม่ได้ขึ้นอยู่กับความคิดเห็น แต่เป็นประสบการณ์ ฉันยินดีรับคำตอบที่ดีจากประสบการณ์เสมอ ผู้ที่ไม่สามารถเรียนรู้จากประวัติศาสตร์จะถึงวาระที่จะทำซ้ำ
bouvierr

คุณสามารถใช้ jlink (มาพร้อมกับ JDK 9) เพื่อแจกจ่าย Java Apps มันมาพร้อมกับ JDK จะสร้าง JRE เฉพาะสำหรับคุณ คุณไม่จำเป็นต้องติดตั้ง java บนเครื่องไคลเอนต์
blueray

คำตอบ:


89

มีโซลูชันที่หลากหลายขึ้นอยู่กับความต้องการในการจัดจำหน่ายของคุณ

  1. เพียงแค่ใช้ขวดโหล สิ่งนี้จะถือว่าผู้ใช้ติดตั้งเวอร์ชันจาวาที่ถูกต้องมิฉะนั้นผู้ใช้จะได้รับข้อยกเว้น "เวอร์ชันรูปแบบไฟล์คลาส" ใช้ได้ดีสำหรับการจัดจำหน่ายภายใน บริษัท

  2. ใช้ launch4j และตัวติดตั้งเช่น NSIS สิ่งนี้ช่วยให้คุณควบคุมได้มากขึ้นแม้ว่าผู้ใช้จะยังสามารถทำสิ่งที่โง่เขลาได้เช่นการยกเลิกการติดตั้งรันไทม์ java นี่อาจเป็นแนวทางที่ได้รับความนิยมมากที่สุดและสิ่งที่ฉันใช้อยู่ในปัจจุบัน

  3. ใช้ Webstart นอกจากนี้ยังถือว่าผู้ใช้มีการติดตั้งเวอร์ชันจาวาที่ถูกต้อง แต่จะง่ายกว่ามาก ประสบการณ์ของฉันคือสิ่งนี้ใช้ได้ดีสำหรับสภาพแวดล้อมอินทราเน็ตที่มีการควบคุมอย่างแน่นหนา แต่กลายเป็นความเจ็บปวดเมื่อมีการปรับใช้งานที่มากขึ้นเนื่องจากมีความล้มเหลวแปลก ๆ หลายอย่าง อาจดีขึ้นเมื่อใช้เทคโนโลยีปลั๊กอินใหม่ใน Java 1.7

  4. ใช้คอมไพเลอร์โค้ดเนทีฟเช่น Excelsior JET และแจกจ่ายเป็นไฟล์ปฏิบัติการหรือรวมไว้ในโปรแกรมติดตั้ง มีราคาแพงและโดยทั่วไปจะเชื่อมโยงคุณกับ java เวอร์ชันเก่ากว่าเล็กน้อยและมีความเจ็บปวดกับการโหลดคลาสแบบไดนามิก แต่มีประสิทธิภาพมากสำหรับการปรับใช้งานขนาดใหญ่ที่คุณต้องการลดความยุ่งยากในการสนับสนุน


4
หมายเหตุเกี่ยวกับ Webstart: ตราบใดที่ผู้ใช้มี Java เวอร์ชันที่ติดตั้งที่ไม่ได้มาจากยุคหิน (เช่น 1.2) สามารถบอกให้ webstart ดาวน์โหลดและติดตั้ง Java เวอร์ชันใหม่กว่าที่คุณต้องการสำหรับโปรแกรมของคุณได้ ยัง. ดูไวยากรณ์ของไฟล์. jnlp แน่นอนว่ามันยังคงแสดงให้เห็นอย่างชัดเจนว่าคุณกำลังใช้ Java ซึ่งอาจไม่เหมาะสมขึ้นอยู่กับไคลเอนต์ที่คุณจัดการ ในกรณีดังกล่าวคุณควรจัดรูปแบบตัวติดตั้ง / ไฟล์ "เนทีฟ" และซ่อนรายละเอียดการใช้งานเท่าที่จะทำได้
Daniel Schneller

10
ฉันไม่ชอบ Webstart มีตราสินค้า Java / Sun มากเกินไป มันยากที่จะทำให้มันทำงานได้อย่างถูกต้อง การตั้งค่าการลงนามรหัสเป็นปัญหามากกว่าที่ควรและผู้ใช้ไม่เข้าใจประโยชน์ด้านความปลอดภัยและข้อความอยู่ดี หากคุณต้องการทำอะไรในระบบผู้ใช้คุณจะต้องจ่ายเงินสำหรับใบรับรองการเซ็นชื่อรหัสของคุณเพื่อกำจัดคำเตือนที่น่ากลัวมันทำแคชที่ซับซ้อนจำนวนมากซึ่งอาจทำให้เกิดปัญหาได้ บางที OSGi หรือโมดูล Java ที่กำลังจะมาถึงจะให้ประโยชน์การอัปเดตอัตโนมัติที่คล้ายกัน ฉันใช้รูปแบบ # 2 และสร้าง DMG / Packager สำหรับ mac ทั้งหมดจาก Ant
แคล

ฉันใช้ NSIS ตามที่คุณแนะนำ ผมดู launch4j ด้วย ทำไมคุณถึงแนะนำให้ใช้ทั้งสองอย่าง?
jacknad

1
@JackN NSIS เป็นตัวสร้างโปรแกรมติดตั้ง Launch4j มีไว้สำหรับการเปิด / เริ่มโปรแกรมจาวาโดยเฉพาะ มีบางฟังก์ชันที่ทับซ้อนกัน แต่มีการกำหนดเป้าหมายไปยังส่วนต่างๆของปัญหา
Noel Grandin

+1 คำตอบที่ดี คุณมีประสบการณ์กับ Excelsior JET หรือไม่? รองรับเฉพาะสถาปัตยกรรม x86 และไม่สามารถโหลดไลบรารี jar แบบเรียลไทม์ได้หรือไม่?
KJW

6

โปรแกรมติดตั้งขั้นสูงทำให้ง่ายต่อการจัดแพคเกจแอป java เป็นโปรแกรมปฏิบัติการของ Windows และค่อนข้างยืดหยุ่นในแบบที่คุณสามารถตั้งค่าได้ ฉันพบว่าสำหรับการแจกจ่ายแอปพลิเคชัน java ไปยังไคลเอนต์ windows นี่เป็นวิธีที่ง่ายที่สุด


5

JSmoothเป็นโปรแกรมง่ายๆที่ใช้ jar ของคุณและรวมไว้ในไฟล์ปฏิบัติการ windows มาตรฐาน มาพร้อมกับ GUI ง่ายๆที่ให้คุณกำหนดค่า JVM ที่ต้องการรวมเข้ากับแอปพลิเคชันหรือให้ตัวเลือกในการดาวน์โหลดหากยังไม่ได้ติดตั้ง คุณสามารถส่งไฟล์ exe ตามที่เป็นอยู่หรือ zip ด้วยการอ้างอิงที่เป็นไปได้ (หรือปล่อยให้โปรแกรมดาวน์โหลดการอ้างอิงเพิ่มเติมจากเน็ตเมื่อเริ่มต้น) นอกจากนี้ยังฟรีเช่นเดียวกับเบียร์และสุนทรพจน์ซึ่งอาจ (หรือไม่ก็ได้) เป็นสิ่งที่ดี


4

ขึ้นอยู่กับความซับซ้อนของผู้ใช้เป้าหมายของคุณ ในกรณีส่วนใหญ่คุณต้องการแยกออกจากข้อเท็จจริงที่ว่าคุณใช้งานแอปที่ใช้ Java ให้โปรแกรมติดตั้งดั้งเดิมที่ทำสิ่งที่ถูกต้อง (สร้างรายการเมนูเริ่มตัวเรียกใช้งานลงทะเบียนด้วยโปรแกรมเพิ่ม / ลบ ฯลฯ ) และรวมรันไทม์ Java ไว้แล้ว (ดังนั้นผู้ใช้ไม่จำเป็นต้องรู้หรือสนใจเกี่ยวกับเรื่องนี้) ฉันขอแนะนำเครื่องมือติดตั้งข้ามแพลตฟอร์มของเราBitRock InstallBuilder. แม้ว่าจะไม่ได้ใช้ Java แต่โดยทั่วไปจะใช้เพื่อจัดแพ็คเกจแอปพลิเคชัน Java สามารถรวมเข้ากับ Ant ได้อย่างง่ายดายและคุณสามารถสร้างตัวติดตั้ง Windows จาก Unix / Linux / Mac และวิธีอื่น ๆ เนื่องจากโปรแกรมติดตั้งที่สร้างขึ้นเป็นแบบดั้งเดิมจึงไม่จำเป็นต้องมีขั้นตอนการแยกตัวเองหรือ JRE ในระบบเป้าหมายอยู่แล้วซึ่งหมายถึงตัวติดตั้งที่มีขนาดเล็กและช่วยให้คุณไม่ต้องปวดหัว ฉันอยากจะบอกด้วยว่าเรามีใบอนุญาตฟรีสำหรับโครงการโอเพ่นซอร์ส


3

ไฟล์ปฏิบัติการดีที่สุด แต่เป็นแพลตฟอร์มที่ จำกัด เช่นใช้ gcj: http://gcc.gnu.org/java/สำหรับ linux เพื่อสร้างไฟล์ปฏิบัติการและใช้ launch4j: http://launch4j.sourceforge.net/เพื่อสร้างไฟล์ปฏิบัติการของ windows ในการทำแพ็กเกจบน linux คุณสามารถใช้ rpm หรือ deb packager สำหรับ win32 ลองhttp://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System


3

หากเป็นแอปพลิเคชันผู้ใช้ปลายทางที่มี GUI จริงคุณควรละเว้น lanaguage ที่คุณเขียนโปรแกรม (Java) และใช้ตัวติดตั้งแบบเนทีฟสำหรับแต่ละแพลตฟอร์มที่คุณเลือก คน Mac ต้องการ. dmg และบน windows. msi หรือตัวติดตั้ง. exe เป็นวิธีที่จะไป บน Windows ฉันชอบ NSIS จาก NullSoft เท่านั้นเพราะมันไม่น่ารังเกียจน้อยกว่า InstallShield หรือ InstallAnywhere บน OSX คุณสามารถไว้วางใจ JVM ที่มีอยู่แล้วได้ ใน Windows คุณจะต้องตรวจสอบและติดตั้งสำหรับพวกเขาหากจำเป็น คน Linux จะไม่เรียกใช้แอปพลิเคชัน Java GUI และมีเพียงไม่กี่คนที่จะรู้ว่าจะทำอย่างไรกับ. jar ที่ปฏิบัติการได้


3
จริงๆ? คน linux จะไม่เรียกใช้แอปพลิเคชัน gui? ถ้าอย่างนั้นฉันเดาว่าโปรแกรมของเขาไม่มีประโยชน์สำหรับพวกเขาในการแสดงประเด็นการสนทนาทั้งหมด
Matt

@ แมททำไมคุณถึงคิดว่าแอปพลิเคชันเดิมเป็นแอปพลิเคชัน GUI? ฉันได้ติดตั้งแอปพลิเคชัน java บรรทัดคำสั่งจำนวนมากบน Linux และแอปพลิเคชันที่ลงมาเป็น. deb หรือ. rpm นั้นได้รับการชื่นชมเป็นพิเศษ
Ry4an Brase

1
ชื่อเดิมกล่าวว่า GUI นอกจากนี้หาก webstart ถูกนำมาใช้ก็เป็นการดีที่จะเป็นแอปพลิเคชัน gui สุดท้ายการบอกว่าผู้ใช้ linux ไม่ได้ใช้แอปพลิเคชัน GUI นั้นไม่เป็นความจริงอย่างสิ้นเชิง
Matt

ฉันไม่ได้บอกว่าคน linux ไม่เรียกใช้แอปพลิเคชัน GUI ฉันบอกว่าพวกเขาจะไม่เรียกใช้แอปพลิเคชัน "Java GUI" และภายนอก NetBeans และ Eclipse (ซึ่งฉันกล่าวถึงภายใต้ "ไม่กี่คนที่จะรู้ว่าจะทำอย่างไรกับ jar ที่ปฏิบัติการได้") ฉันไม่สามารถนึกถึงแอปพลิเคชันเดียวที่ใช้กันอย่างแพร่หลาย แอปพลิเคชัน Java บน Linux (Open Office ฯลฯ คือ C ++ และใช้ Java สำหรับปลั๊กอินเท่านั้น)
Ry4an Brase

เคยได้ยิน SQLDeveloper หรือไม่? หรือเครื่องมือจัดการ oracle ใด ๆ ? ทั้งหมดเข้ารหัสใน java (แม้ว่า sqldeveloper จะถูกรวมเป็น. exe แต่เป็น java)
แมตต์

3

แม้ว่าฉันจะไม่ได้ใช้NSIS (Nullsoft Scriptable Installer System) ด้วยตัวเอง แต่ก็มีสคริปต์การติดตั้งที่จะตรวจสอบว่ามีการติดตั้ง JRE ที่ต้องการในระบบเป้าหมายหรือไม่

สคริปต์ตัวอย่างจำนวนมากสามารถหาได้จากหน้าตัวอย่างโค้ดและหน้าโปรแกรมติดตั้งในโลกแห่งความจริงเช่น:

(โปรดทราบว่าฉันไม่ได้ใช้สคริปต์ใด ๆ จริงๆดังนั้นโปรดอย่าถือเป็นการรับรอง)


2

ฉันต้องการวิธีการรวมโปรเจ็กต์และการอ้างอิงลงในไฟล์ jar เดียว

ฉันพบสิ่งที่ต้องการโดยใช้ปลั๊กอินMaven2 Assembly : ปลั๊กอินMaven2 Assembly

ดูเหมือนว่าจะทำซ้ำฟังก์ชันการทำงานของone-jarแต่ไม่จำเป็นต้องมีการกำหนดค่าเพิ่มเติมเพื่อให้ใช้งานได้


1

สำหรับแอป Java ง่ายๆฉันชอบใช้ Jar ง่ายมากที่จะแจกจ่ายไฟล์เดียวที่ผู้ใช้สามารถคลิกที่ (Windows) หรือ

java -jar jarname.jar

IMHO โถคือหนทางที่จะไปเมื่อความเรียบง่ายเป็นข้อกำหนดหลัก


ลองใช้กับมือใหม่แล้วคุณจะพบว่ามันใช้งานได้ไม่ดี
rhody

1

ฉันพัฒนาแอปพลิเคชั่น eclipse RCP โดยปกติในการเริ่มแอปพลิเคชัน eclipse จะมีตัวเรียกใช้งานที่เรียกใช้งานได้รวมอยู่ด้วย ฉันรวมเครื่องเสมือน java ไว้ในโฟลเดอร์แอปพลิเคชันในไดเร็กทอรีย่อย a / jre เพื่อให้แน่ใจว่าจะใช้เวอร์ชัน java ที่ถูกต้อง

จากนั้นเราจัดแพ็คเกจด้วย Inno Setup เพื่อติดตั้งบนเครื่องของผู้ใช้


1

วิธีใดดีที่สุดในการเผยแพร่แอปพลิเคชัน Java จะเกิดอะไรขึ้นหากแอปพลิเคชัน Java จำเป็นต้องติดตั้งสิ่งประดิษฐ์ลงในคอมพิวเตอร์ของผู้ใช้ มีระบบการติดตั้ง / บรรจุภัณฑ์ Java ที่ดีหรือไม่?

จากประสบการณ์ของฉัน (จากการประเมินตัวเลือกต่างๆ ) install4jเป็นทางออกที่ดี สร้างโปรแกรมติดตั้งแบบเนทีฟสำหรับทุกแพลตฟอร์มและมุ่งเน้นไปที่การติดตั้งแอป Java โดยเฉพาะ สำหรับรายละเอียดโปรดดู " คุณลักษณะ " บนเว็บไซต์

install4j เป็นเครื่องมือทางการค้าแม้ว่า โดยเฉพาะอย่างยิ่งถ้าความต้องการของคุณค่อนข้างง่าย (เพียงแจกจ่ายใบสมัครและติดตั้งสิ่งประดิษฐ์บางส่วน) หลายตัวเลือกที่ดีอื่น ๆ ที่มีอยู่รวมทั้งคนฟรี (เช่นizPackหรือที่กล่าวมาแล้วLauch4j ) แต่คุณถามหาวิธีที่ดีที่สุดและสำหรับความรู้ปัจจุบันของฉัน install4j คือวิธีหนึ่งโดยเฉพาะอย่างยิ่งสำหรับการแจกจ่ายแอป Java (EE) ที่มีขนาดใหญ่ขึ้นหรือซับซ้อนมากขึ้น


คุณรู้วิธีบังคับให้รัน JVM 5.0 บน Mac OS หรือไม่? ด้วย windows คุณเพิ่งรวม JRE แต่บน Mac อาจเป็นไปได้ว่ามีการกำหนดค่า JVM เริ่มต้นอื่นไว้ ดังนั้นฉันไม่แน่ใจว่าจะบังคับให้ใช้เวอร์ชัน JVM เฉพาะที่คุณต้องการได้อย่างไร ...
Stephane Grenier

@Stephane ฉันยังไม่ได้สร้างตัวติดตั้ง OS X โดยใช้ install4j แต่ฉันคิดว่ามันไม่น่าจะเป็นปัญหาเนื่องจากมีตัวเลือกการรวม / การตรวจจับ JRE ที่ยืดหยุ่น สำหรับข้อมูลเพิ่มเติมโปรดตรวจสอบลิงก์ในคำตอบนี้: stackoverflow.com/questions/995881/…
Jonik

เนื่องจาก Mac รองรับการสร้าง Java App Bundle คุณจึงสามารถระบุ JRE ใน info.plist เช่นนั้นได้ ... <key> JVMVersion </key> <string> 1.5+ </string> คุณสามารถลบเครื่องหมายบวกเพื่อต้องการเวอร์ชันเฉพาะได้ . นี่คือวิธีที่ฉันทำ แต่ฉันไม่ได้ใช้ install4j มีหน้าเว็บมากมายที่อธิบายการสร้าง Mac App budles บนเว็บ ฉันขอแนะนำให้ดูว่า Limewire หรือ vuze (java apps) ทำอย่างไร คุณยังสามารถดูบิลด์สคริปต์ที่ใช้สร้างแอพบันเดิลและไฟล์ dmg ได้เนื่องจากเป็นโอเพนซอร์ส!
แคล

0

คำตอบที่ดีที่สุดขึ้นอยู่กับแพลตฟอร์ม สำหรับการใช้งานบน Windows, ฉันได้มีผลดีโดยใช้การรวมกันของหนึ่งขวดและlaunch4j ใช้เวลาสักครู่ในการตั้งค่าสภาพแวดล้อมการสร้างของฉันอย่างถูกต้อง (สคริปต์มดส่วนใหญ่) แต่ตอนนี้มันค่อนข้างไม่เจ็บปวด


0

จากมุมมองของฉันกลไกการกระจายที่เหนือกว่าคือการใช้บางอย่างเช่นClickOnceหรือเทคโนโลยีWebStart คุณเพียงแค่ปรับใช้เวอร์ชันกับเซิร์ฟเวอร์และจะส่งไปยังไคลเอ็นต์โดยอัตโนมัติเมื่อเวอร์ชันเผยแพร่ นอกจากนี้แพลตฟอร์ม Eclipse RCP ยังมี UpdateManager ที่ทำสิ่งที่ WebStart ทำ แต่ยังมีอีกมากมาย

เนื่องจากฉันใช้ Maven2 ในการสร้างการปรับใช้จึงเป็นเพียงส่วนหนึ่งของเค้ก: คัดลอก jar ที่สร้างขึ้นไปยังตำแหน่งบนเซิร์ฟเวอร์อัปเดตไฟล์ jnlp หากจำเป็นและคุณทำเสร็จแล้ว


0

ติดตั้งที่ไหนดี แต่แพง - ฉันไม่พบ (เป็น) ฟรีที่ดี


ดูสิ่งนี้สำหรับทางเลือก InstallAnywhere ซึ่งรวมถึงตัวเลือกฟรีบางตัว (เช่นเดียวกับตัวเลือกเชิงพาณิชย์ที่มีราคาสมเหตุสมผลกว่ามาก): stackoverflow.com/questions/759855/…
Jonik

-2

ฉันจะซิปไฟล์ jar พร้อมกับไหอื่น ๆ ไฟล์การกำหนดค่าและเอกสารประกอบพร้อมกับ run.bat / run.sh ผู้ใช้ควรจะสามารถคลายซิปไปยังตำแหน่งใดก็ได้และแก้ไข run.bat หากจำเป็น (ควรรันโดยไม่ต้องแก้ไขในกรณีส่วนใหญ่) โปรแกรมติดตั้งอาจมีประโยชน์หากคุณต้องการสร้างรายการในเมนูเริ่มเดสก์ท็อปถาดระบบเป็นต้น

ในฐานะผู้ใช้ฉันชอบการเปิดเครื่องรูดและเรียกใช้การติดตั้ง (โปรดไม่ต้องใส่รายการเมนูเริ่ม) อย่างไรก็ตามผู้ที่อยู่นอกอุตสาหกรรมไอทีอาจมีความชอบที่แตกต่างกัน ดังนั้นหากแอปพลิเคชันส่วนใหญ่กำหนดเป้าหมายสำหรับผู้พัฒนาเส้นทาง zip-run.bat และแอปพลิเคชันสำหรับบุคคลทั่วไปอาจติดตั้งโดยใช้ตัวติดตั้ง


สิ่งนี้จะไม่ได้ผลสำหรับมือใหม่
rhody
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.