JavaFX และ OpenJDK


111

ฉันกำลังพยายามตัดสินใจว่าจะเปลี่ยนไปใช้ JavaFX สำหรับอินเทอร์เฟซผู้ใช้ของแอปพลิเคชัน Java ได้หรือไม่ ผู้ใช้ส่วนใหญ่ของฉันจะใช้ Oracle JRE ซึ่งมี JavaFX รวมอยู่ในทุกวันนี้ อย่างไรก็ตามบางคนกำลังใช้ OpenJDK (บน linux) นี้ (เดิม) คำถามที่แสดงให้เห็นว่าข้อเสนอที่ OpenJDK แย่มากกับ JavaFX จากคำถามนี้ OpenJFX ทางเลือกจะรวมเข้ากับ OpenJDK ในเวอร์ชัน 9 เท่านั้นดังนั้นคำถามของฉันจึงเป็นสองเท่า:

  • การรองรับ JavaFX ใน OpenJDK ยังแย่ขนาดนี้หรือเปล่า?
  • ถ้าเป็นเช่นนั้นมีลีนุกซ์รุ่นใดบ้างที่เสนอแพ็กเกจ OpenJFX แล้วผู้ใช้จะไม่ต้องสร้างเอง ?

แอปพลิเคชันของคุณโหมดการดำเนินการคืออะไร(ใช้งานอย่างไร)
jewelsea

@jewelsea มันทำงานเป็นโปรแกรมแบบสแตนด์อโลน
mdriesen

@docM มันจะเป็นวิธีแก้ปัญหาในการเปลี่ยนไปใช้ oracle- (sun) -jdk สำหรับเครื่อง Ubuntu หรือไม่? webupd8.org/2012/01/…
nyyrikki

@nyyrikki นั่นคือตัวเลือก แต่ฉันอยากจะใช้ Java Swing ถ้า JavaFX และ OpenJDK ไม่ผสมกัน
mdriesen

2
@Yngve ฉันพอร์ตทุกอย่างไปที่ JavaFX เมื่อ Ubuntu และ Debian เริ่มต้นรวมถึงแพ็คเกจ
mdriesen

คำตอบ:


101

JavaFX เป็นส่วนหนึ่งของ OpenJDK

โครงการ JavaFX ตัวเองเป็นโอเพนซอร์สและเป็นส่วนหนึ่งของโครงการ OpenJDK

อัปเดตธันวาคม 2019

สำหรับข้อมูลที่เป็นปัจจุบันเกี่ยวกับวิธีการใช้ Open Source JavaFX เยี่ยมชมhttps://openjfx.io ซึ่งรวมถึงคำแนะนำในการใช้ JavaFX เป็นไลบรารีแบบโมดูลาร์ที่เข้าถึงได้จาก JDK ที่มีอยู่ (เช่นการติดตั้ง Open JDK )

พื้นที่เก็บข้อมูลรหัสที่มาเปิดให้บริการสำหรับ JavaFX ที่https://github.com/openjdk/jfx

ที่ตำแหน่งต้นทางที่ลิงก์คุณจะพบไฟล์ไลเซนส์สำหรับ JavaFX แบบเปิด (ปัจจุบันไลเซนส์นี้ตรงกับไลเซนส์สำหรับ OpenJDK: GPL + คลาสพา ธ ข้อยกเว้น)

วิกิสำหรับโครงการอยู่ที่: https://wiki.openjdk.java.net/display/OpenJFX/Main

หากคุณต้องการเริ่มต้นใช้งาน JavaFX แบบเปิดอย่างรวดเร็วการแจกแจง Belsoft Liberica JDKจะให้ไบนารีที่สร้างไว้ล่วงหน้าของ OpenJDK ซึ่ง (ปัจจุบัน) รวม JavaFX แบบเปิดสำหรับแพลตฟอร์มที่หลากหลาย

สำหรับการแจกจ่ายเป็นแอปพลิเคชันที่มีอยู่ในตัว Java 14 มีกำหนดจะใช้JEP 343: Packaging Toolซึ่ง "รองรับรูปแบบบรรจุภัณฑ์ดั้งเดิมเพื่อให้ผู้ใช้ปลายทางได้รับประสบการณ์การติดตั้งที่เป็นธรรมชาติรูปแบบเหล่านี้รวมถึง msi และ exe บน Windows, pkg และ dmg บน macOS และ deb และ rpm บน Linux "สำหรับการปรับใช้แอปพลิเคชันที่ใช้ OpenJFX กับโปรแกรมติดตั้งแบบเนทีฟและไม่มีการอ้างอิงแพลตฟอร์มเพิ่มเติม (เช่น JDK ที่ติดตั้งไว้ล่วงหน้า)


ข้อมูลเก่าซึ่งอาจล้าสมัยเมื่อเวลาผ่านไป

การสร้าง JavaFX จากที่เก็บ OpenJDK

คุณสามารถสร้างOpenJDK เวอร์ชันเปิด (รวมถึง JavaFX) ได้อย่างสมบูรณ์จากซอร์สซึ่งไม่มีการพึ่งพา Oracle JDK หรือซอร์สโค้ดแบบปิด

อัปเดต: การใช้การแจกจ่าย JavaFX ที่สร้างไว้ล่วงหน้าจากแหล่ง OpenJDK

ตามที่ระบุไว้ในความคิดเห็นของคำถามนี้และในคำตอบอื่นการแจกแจง Debian Linux เสนอการแยกแยะไบนารี JavaFX ตาม OpenJDK:

(ตอนนี้ใช้ได้เฉพาะกับ Java 8 เท่าที่ฉันรู้)

ความแตกต่างระหว่าง Open JDK และ Oracle JDK ที่เกี่ยวกับ JavaFX

ข้อมูลต่อไปนี้จัดเตรียมไว้สำหรับ Java 8 สำหรับ Java 9 การเข้ารหัส VP6 เลิกใช้งานสำหรับ JavaFXและเทคโนโลยีการปรับใช้แอ็พพลิเคชันแบบฝังตัว Oracle WebStart / Browser ก็เลิกใช้เช่นกัน ดังนั้น JavaFX เวอร์ชันในอนาคตแม้ว่าจะเผยแพร่โดย Oracle แต่ก็น่าจะไม่มีเทคโนโลยีใด ๆ ที่ไม่ใช่โอเพ่นซอร์ส

Oracle JDK มีซอฟต์แวร์บางตัวที่ไม่สามารถใช้งานได้จาก OpenJDK มีสององค์ประกอบหลักที่เกี่ยวข้องกับ JavaFX

  1. ตัวแปลงสัญญาณวิดีโอ ON2 VP6 ซึ่งเป็นของ Google และ Google ไม่ได้เปิดแหล่งที่มา
  2. เทคโนโลยีการปรับใช้แอปพลิเคชัน Oracle WebStart / Browser Embedded

ซึ่งหมายความว่า JavaFX เวอร์ชันเปิดไม่สามารถเล่นไฟล์ VP6 FLV ได้ นี่ไม่ใช่การสูญเสียครั้งใหญ่เนื่องจากเป็นการยากที่จะค้นหาตัวเข้ารหัส VP6 หรือสื่อที่เข้ารหัสใน VP6

รูปแบบวิดีโอทั่วไปอื่น ๆ เช่น H.264 จะเล่นได้ดีกับ JavaFX เวอร์ชันเปิด (ตราบเท่าที่คุณมีตัวแปลงสัญญาณที่เหมาะสมติดตั้งไว้ล่วงหน้าบนเครื่องเป้าหมาย)

การขาดเทคโนโลยีการปรับใช้ WebStart / Browser Embedded นั้นเป็นสิ่งที่เกี่ยวข้องกับ OpenJDK มากกว่า JavaFX โดยเฉพาะ เทคโนโลยีนี้สามารถใช้เพื่อปรับใช้แอปพลิเคชันที่ไม่ใช่ JavaFX

จะดีมากถ้าชุมชน OpenSource พัฒนาเทคโนโลยีการปรับใช้งานสำหรับ Java (และซอฟต์แวร์อื่น ๆ ) ซึ่งแทนที่วิธีการปรับใช้ WebStart และ Browser Embedded โดยสิ้นเชิงทำให้ได้รับประสบการณ์การใช้งานที่มีน้ำหนักเบาและมีผลกระทบต่ำสำหรับการแจกจ่ายแอปพลิเคชัน ฉันเชื่อว่ามีบางโครงการที่เริ่มบรรลุเป้าหมายดังกล่าวแล้ว แต่พวกเขายังไม่ถึงระดับที่มีวุฒิภาวะสูงและการนำไปใช้

โดยส่วนตัวแล้วฉันรู้สึกว่าการปรับใช้ WebStart / Browser Embedded เป็นเทคโนโลยีเดิมและปัจจุบันมีวิธีที่ดีกว่าในการปรับใช้แอปพลิเคชัน JavaFX จำนวนมาก (เช่นแอปพลิเคชันในตัว)

อัปเดตธันวาคม 2019:

รุ่นเปิดแหล่งที่มาของ WebStart สำหรับ JDK 11 + ได้รับการพัฒนาและสามารถใช้ได้ในhttps://openwebstart.com

ใครต้องการสร้าง Linux OpenJDK Distributions ซึ่งรวมถึง JavaFX

ขึ้นอยู่กับผู้ที่สร้างแพ็คเกจสำหรับการกระจาย Linux โดยใช้ OpenJDK (เช่น Redhat, Ubuntu และอื่น ๆ ) เพื่อสร้าง RPM สำหรับ JDK และ JRE ที่มี JavaFX จากนั้นผู้จัดจำหน่ายซอฟต์แวร์เหล่านั้นจำเป็นต้องวางแพ็กเกจที่สร้างขึ้นในที่เก็บรหัสการแจกจ่ายมาตรฐาน (เช่นที่เก็บ yum ของเครือข่าย fedora / red hat) ขณะนี้ยังไม่เสร็จสิ้น แต่ฉันจะค่อนข้างแปลกใจถ้าแพ็คเกจ Java 8 Linux ไม่รวม JavaFX เมื่อ Java 8 ออกในเดือนมีนาคม 2014

อัปเดตธันวาคม 2019 :

ตอนนี้ JavaFX ถูกแยกออกจากการแจกแจงไบนารี JDK และ JRE ส่วนใหญ่แล้ว (รวมถึงการกระจายของ Oracle) และมีให้ใช้งานเป็น SDK แบบสแตนด์อะโลนชุด jmods หรือการอ้างอิงไลบรารีที่พร้อมใช้งานจากที่เก็บ Maven ส่วนกลาง (ตามที่ระบุไว้ว่าhttps://openjfx.io ) มีความจำเป็นน้อยกว่าสำหรับการกระจาย Linux OpenJDK มาตรฐานเพื่อรวม JavaFX

หากคุณต้องการ JDK ที่สร้างไว้ล่วงหน้าซึ่งรวมถึง JavaFX ให้พิจารณาการแจกแจง Liberica JDKซึ่งมีให้สำหรับแพลตฟอร์มที่หลากหลาย

คำแนะนำในการปรับใช้สำหรับการใช้งานที่สำคัญ

ฉันแนะนำให้ใช้โหมดการปรับใช้แอปพลิเคชันในตัวของ Java

คำอธิบายของโหมดการปรับใช้นี้คือ:

แอปพลิเคชันถูกติดตั้งบนไดรฟ์ภายในเครื่องและรันเป็นโปรแกรมแบบสแตนด์อโลนโดยใช้สำเนาส่วนตัวของ Java และ JavaFX runtimes แอปพลิเคชันสามารถเปิดใช้งานได้ในลักษณะเดียวกับแอปพลิเคชันเนทีฟอื่น ๆ สำหรับระบบปฏิบัติการนั้นเช่นใช้ทางลัดบนเดสก์ท็อปหรือรายการเมนู

คุณสามารถสร้างแอปพลิเคชันในตัวได้จากการแจกจ่าย Oracle JDK หรือจากรุ่น OpenJDK ซึ่งรวมถึง JavaFX ปัจจุบันทำได้ง่ายกว่าด้วย Oracle JDK

เนื่องจากเวอร์ชันของ Java มาพร้อมกับแอปพลิเคชันของคุณคุณจึงไม่ต้องสนใจว่า Java เวอร์ชันใดที่อาจได้รับการติดตั้งไว้ล่วงหน้าในเครื่องมีความสามารถใดบ้างและเข้ากันได้กับโปรแกรมของคุณหรือไม่ แต่คุณสามารถทดสอบแอปพลิเคชันของคุณกับเวอร์ชันรันไทม์ Java ที่แน่นอนและแจกจ่ายด้วยแอปพลิเคชันของคุณ ประสบการณ์ของผู้ใช้ในการปรับใช้แอปพลิเคชันของคุณจะเหมือนกับการติดตั้งแอปพลิเคชันดั้งเดิมบนเครื่องของตน (เช่นติดตั้ง windows .exe หรือ. msi, OS X .dmg, linux .rpm หรือ. deb)

หมายเหตุ:คุณลักษณะแอปพลิเคชันในตัวมีให้ใช้งานสำหรับ Java 8 และ 9 เท่านั้นไม่ใช่สำหรับ Java 10-13 Java 14 ผ่านJEP 343: Packaging Toolมีกำหนดจะให้การสนับสนุนคุณลักษณะนี้อีกครั้งจากการแจกแจง OpenJDK

อัปเดตเมษายน 2018: ข้อมูลเกี่ยวกับนโยบายปัจจุบันของ Oracle ต่อการพัฒนาในอนาคต


@Emmanuel ขอบคุณที่ทำงานนี้ JavaFX เป็นส่วนหนึ่งของ JDK ดังนั้น (อย่างน้อยก็จนกว่า JDK จะกลายเป็นโมดูลาร์) ฉันไม่แน่ใจว่าทำไมจึงต้องมีแพ็คเกจ OpenJFX แยกต่างหากแทนที่จะรวมไฟล์รันไทม์ที่จำเป็นทั้งหมดในแพ็คเกจ OpenJDK มาตรฐาน (ตามที่ทำกับ การแจกแจง Oracle JDK) รายชื่อผู้รับจดหมายเปิด JFXจะเป็นสถานที่ที่ดีถ้าการอภิปรายต่อไปจะต้อง
jewelsea

แพ็กเกจแยกต่างหากให้ความยืดหยุ่นในระดับหนึ่งหากมีผู้สนใจ JDK แต่ไม่ได้อยู่ใน JavaFX Modularization ไม่ใช่วัตถุประสงค์สำหรับ Java 9 ใช่หรือไม่? :)
Emmanuel Bourg

11
"ขณะนี้ยังไม่เสร็จสิ้น แต่ฉันจะค่อนข้างแปลกใจถ้าแพ็คเกจ Java 8 Linux ไม่รวม JavaFX เมื่อ Java 8 ออกในเดือนมีนาคม 2014" คุณต้องแปลกใจเพราะ OpenJDK 8 ไม่รวม OpenJFX

2
Arch Linux ยังมีแพ็คเกจสำหรับ openjfx: archlinux.org/packages/?name=java-openjfx
Maciek Łoziński

2
@NoBugs นี่อาจจะช้าไปหน่อยสำหรับคำตอบที่เป็นประโยชน์ แต่ Ubuntu 14.04 ไม่รวม OpenJDK 8 ซึ่งเป็นสาเหตุที่คุณไม่พบแพ็คเกจ JFX ที่เกี่ยวข้อง ฉันจำไม่ได้ว่า Ubuntu รุ่นใดเปิดตัว แต่มีให้ใช้งานใน Ubuntu 16.04 อย่างแน่นอนพร้อมกับแพ็คเกจ "openjfx"
Mike Allen

50

สำหรับฉันสิ่งนี้ได้ผล

$ sudo apt-get install openjfx

3
อาจเป็นวิธีที่ง่ายที่สุดในการเพิ่ม JavaFX ลงใน Linux JDK
Reimeus

แม้ว่านี่จะเป็นคำตอบที่ถูกต้องสำหรับหลาย ๆ คน แต่ระบบปฏิบัติการบางระบบก็ไม่มีแพ็คเกจนี้ สำหรับผู้ที่ไม่ติดตั้งwebupd8 PPAUbuntu และfedyเดสก์ท็อปสำหรับ Fedora มีสองวิธีที่รวดเร็วในการตั้งค่า Oracle JDK / JRE ล่าสุดซึ่งรวมถึง JavaFX
tresf

3
สำหรับ Ubuntu 18.04 นั้นยังคงขึ้นอยู่กับ Java 8 แต่ค่าเริ่มต้นคือ java 10 หากคุณติดตั้งคุณจะได้รับ 2 javas
jgomo3

ตามวิธีการติดตั้ง openjfx พร้อมกับ openjdk-11? สำหรับ Java เวอร์ชัน 11+ หากต้องการใช้ JavaFX แทนapt-get install openjfx(ซึ่งปัจจุบันใช้ได้เฉพาะกับ Java 8 เท่านั้น) คุณสามารถใช้คำแนะนำจากเว็บไซต์openjfx.ioโดยที่ JavaFX "พร้อมใช้งานเป็น SDK เฉพาะแพลตฟอร์มเป็นตัวเลข ของ jmods และเป็นชุดของสิ่งประดิษฐ์ใน maven central ".
jewelsea

แพ็คเกจ Debian openjfx ได้รับการเผยแพร่สำหรับ OpenJDK-11 ที่tracker.debian.org/pkg/openjfxดังนั้นอาจเป็นวิธีนี้ sudo apt-get install openjfxจะยังคงได้รับการสนับสนุนและใช้งานได้กับ JavaFX และ ubuntu รุ่นใหม่ในภายหลัง โปรดทราบว่าแพคเกจ Debian openjfx ดูเหมือนจะไม่ได้รับการอัปเดตบ่อยเท่ากับไลบรารีที่แจกจ่ายโดย openjfx.io ดังนั้นหากคุณต้องการใช้เวอร์ชันล่าสุดคุณควรใช้การแจกจ่าย openjfx.io
jewelsea

12

ในการแก้ปัญหาอย่างรวดเร็วคุณสามารถคัดลอกไฟล์ JavaFX รันไทม์ JAR และไฟล์ที่อ้างอิงจากOracle JRE (JDK)หรือแอพพลิเคชั่นในตัวที่ใช้ JavaFX (เช่นJavaFX Scene Builder 2.0 ):

cp <JRE_WITH_JAVAFX_HOME>/lib/ext/jfxrt.jar     <JRE_HOME>/lib/ext/
cp <JRE_WITH_JAVAFX_HOME>/lib/javafx.properties <JRE_HOME>/lib/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libprism_*  <JRE_HOME>/lib/amd64/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libglass.so <JRE_HOME>/lib/amd64/
cp <JRE_WITH_JAVAFX_HOME>/lib/amd64/libjavafx_* <JRE_HOME>/lib/amd64/

เพียงให้แน่ใจว่าคุณมี GTK 2.18 หรือสูงกว่า


ฉันไม่พบตำแหน่งที่ติดตั้ง openjfx ใน Ubuntu 18.04 แต่ฉันขโมยขวดเหล่านี้และไฟล์อื่น ๆ จากโปรแกรมอื่นที่ติดตั้งในฮาร์ดดิสก์ของฉัน (คุณสามารถตรวจสอบบางอย่างเช่น phpstorm หรือ clion :)) และทำงานได้อย่างมีเสน่ห์ ขอบคุณ
Heichou

ฉันคัดลอกไฟล์จาก JDK1.8.0_251 (Oracle Java 1.8) ไปยัง java-8-openjdk-amd64 (ที่เก็บอูบุนตู OpenJDK 8) ยังไม่สามารถรันไฟล์ jar ด้วย JavaFX แต่เมื่อฉันเชื่อมโยงกับ jfxrt.jar เป็น jar ไลบรารีภายนอกในเส้นทางการสร้าง Eclipse ของฉันโปรแกรมต่างๆจะทำงานภายในบริบท Eclipse การเรียกใช้ "apt-cache policy libgtk2.0-0" ให้ "Installed: 2.24.32-1ubuntu1"
Phil Freihofner

7

ยังตอบคำถามนี้:

ฉันจะหาไลบรารี JavaFX ที่สร้างไว้ล่วงหน้าสำหรับ OpenJDK (Windows) ได้ที่ไหน

บน Linux ไม่ใช่ปัญหาจริงๆ แต่ใน Windows นั้นไม่ใช่เรื่องง่ายโดยเฉพาะอย่างยิ่งหากคุณต้องการแจกจ่าย JRE

คุณสามารถใช้ OpenJFX กับ OpenJDK 8 บน windows ได้จริงคุณต้องประกอบเอง:

ดาวน์โหลด OpenJDK จากที่นี่: https://github.com/AdoptOpenJDK/openjdk8-releases/releases/tag/jdk8u172-b11

ดาวน์โหลด OpenJFX จากที่นี่: https://github.com/SkyLandTW/OpenJFX-binary-windows/releases/tag/v8u172-b11

คัดลอกไฟล์ทั้งหมดจาก OpenFX zip ที่ด้านบนของ JDK, voila คุณมี OpenJDK พร้อม JavaFX

อัปเดต :

โชคดีที่ Azul มีรุ่น OpenJDK + OpenJFX ซึ่งสามารถดาวน์โหลดได้ที่หน้าชุมชนของพวกเขา: https://www.azul.com/downloads/zulu-community/?&version=java-8-lts&os=windows&package=jdk-fx


ขอบคุณ. ฉันตรวจสอบไซต์ AdoptOpenJDK github แต่มันขึ้นว่า "ที่เก็บเดิม" คุณรู้หรือไม่ว่า OpenJFX-binary ที่ใหม่กว่าสามารถจับคู่กับบิลด์ของ repo ใหม่github.com/AdoptOpenJDK/openjdk8-binaries/releases ได้อย่างไร
Houtman

3

ลองobuildfactory

จำเป็นต้องแก้ไขสคริปต์เหล่านี้ (มีข้อผิดพลาดและไม่ได้ทำตามที่ "ต้องการ" อย่างถูกต้อง) ฉันจะอัปโหลดสคริปต์ของฉันที่แยกมาจาก obuildfactory ในอีกไม่กี่วันข้างหน้า ดังนั้นฉันจะอัปเดตคำตอบตามนั้น

จนกว่าจะสนุกนะครับ :)


1
น่าเสียดายที่ไม่มี Windows สำหรับ OpenJFX
madduci

0

ตามการรวม OpenJDK & javaFX ของ Oracle จะอยู่ในไตรมาสที่ 1 ปี 2557 (ดูแผนงาน: http://www.oracle.com/technetwork/java/javafx/overview/roadmap-1446331.html ) ดังนั้นสำหรับคำถามแรกคำตอบคือคุณต้องรอจนกว่าจะถึงตอนนั้น สำหรับคำถามที่ 2 ไม่มีวิธีอื่น ตอนนี้ไปกับ java swing หรือเริ่ม javaFX แล้วรอ


ลิงก์ในคำตอบของคุณเสีย สิ่งที่ปิดฉันมาที่หน้าคล้ายกันคือoracle.com/us/corporate/press/1854982
ILMostro_7

@ ILMostro_7 ลิงก์ในความคิดเห็นของคุณเสีย
Blake

มันเก่าพอสมควร ฉันแน่ใจว่าพวกเขาเปลี่ยนไซต์เมื่อมีแผนใหม่เป็นรูปเป็นร่าง
ILMostro_7

ไซต์ต่อไปนี้ระบุว่า javafx จะเป็นไลบรารีแบบสแตนด์อโลนที่เริ่มต้นด้วย java-11 oracle.com/technetwork/java/java-se-support-roadmap.html
ILMostro_7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.