簡體   English   中英

JavaFX 和 OpenJDK

[英]JavaFX and OpenJDK

我正在嘗試決定是否可以為我的 Java 應用程序的用戶界面切換到 JavaFX。 我的大多數用戶將使用 Oracle JRE,這些天集成了 JavaFX。 但是,有些人正在使用 OpenJDK(在 linux 上)。 這個(舊的)問題表明 OpenJDK 對 JavaFX 的處理非常糟糕。 根據這個問題,替代 OpenJFX 只會在版本 9 中完全集成到 OpenJDK 中。所以我的問題是雙重的:

  • OpenJDK 對 JavaFX 的支持還這么差嗎?
  • 如果是這樣,是否有任何 Linux 發行版已經提供了 OpenJFX 包,這樣用戶就不必 自己構建它了

JavaFX 是 OpenJDK 的一部分

JavaFX 項目本身是開源的,是OpenJDK 項目的一部分

但是,OpenJDK 項目包括許多項目,包括孵化項目和其他項目,例如 OpenJFX,其源代碼和實現不作為某些 JDK/JRE 發行版的一部分(例如 Oracle JDK 11+ 實現和許多開源 JDK Linux 包)安裝不包括 JavaFX 運行時)。

現代 JavaFX 發行版是模塊

JavaFX 不是大多數 JDK 11+ 下載的一部分,它通常由開發人員作為模塊或單獨的 SDK 下載。

專門針對 JavaFX 11+,詳見https://openjfx.io網站:

JavaFX 運行時可作為特定於平台的 SDK、多個 jmod 或 Maven Central 中的一組工件提供。

這意味着通過在運行時模塊路徑中包含適當的 JavaFX 模塊(可從 openjfx 或 Maven Central 獲得),可以從在受支持平台上運行的任何現代 JDK 使用 JavaFX。

openjfx 提供的所有 JavaFX 模塊都是開源實現,不包含封閉源代碼。

對於向最終用戶分發基於 JavaFX 的應用程序,建議打包一個基於 JDK 和 JavaFX 模塊 + 所需依賴庫代碼和應用程​​序代碼的運行時映像分發。 對此包裝的完整討論超出了此答案的范圍,但如果需要,可以創建一個純粹基於開源 JDK+JavaFX+庫+應用程序代碼的發行版。 請參閱有關運行時映像的openjfx.io 文檔以獲取更多(盡管不全面)信息。

2021 年 9 月更新

另外,請參閱相關問題:

其中涵蓋了有關 Java 8 以及一些更高版本的信息。

2019 年 12 月更新

有關如何使用開源 JavaFX 的當前信息,請訪問https://openjfx.io 這包括有關使用 JavaFX 作為從現有 JDK(例如Open JDK 安裝)訪問的模塊化庫的說明。

JavaFX 的開源代碼存儲庫位於https://github.com/openjdk/jfx

在鏈接的源位置,您可以找到開放 JavaFX 的許可證文件(當前此許可證與 OpenJDK 的許可證匹配:GPL+類路徑例外)。

該項目的 wiki 位於: https ://wiki.openjdk.java.net/display/OpenJFX/Main

如果您想快速開始使用開放式 JavaFX,Bellsoft 的Liberica JDK發行版提供了預構建的 OpenJDK 二進制文件,其中包括適用於各種平台的 OpenJFX。

對於作為自包含應用程序的分發,Java 14 計划實施JEP 343:打包工具,它“支持原生打包格式,為最終用戶提供自然的安裝體驗。這些格式包括 Windows 上的 msi 和 exe,macOS 上的 pkg 和 dmg,以及 Linux 上的 deb 和 rpm。”,用於使用本機安裝程序部署基於 OpenJFX 的應用程序,並且沒有額外的平台依賴項(例如預安裝的 JDK)。


隨着時間的推移可能會過時的舊信息

從 OpenJDK 存儲庫構建 JavaFX

您可以完全從不依賴於 Oracle JDK 或封閉源代碼的源代碼構建OpenJDK(包括 JavaFX)的開放版本

更新:使用從 OpenJDK 源預構建的 JavaFX 發行版

如對此問題的評論和另一個答案中所述,Debian Linux 發行版提供了基於 OpenJDK 的 JavaFX 二進制發行版:

(據我所知,目前這只適用於 Java 8)。

Open JDK 和 Oracle JDK 在 JavaFX 方面的差異

以下信息是針對 Java 8 提供的。從 Java 9 開始, JavaFX 不推薦使用 VP6 編碼,並且也不推薦使用Oracle WebStart/Browser 嵌入式應用程序部署技術 因此,JavaFX 的未來版本,即使它們由 Oracle 分發,也可能不包含任何非開源技術。

Oracle JDK 包含一些不能從 OpenJDK 使用的軟件。 與 JavaFX 相關的組件:

  • ON2 VP6 視頻編解碼器歸谷歌所有,谷歌尚未開源。
  • Oracle WebStart/Browser Embedded 應用程序部署技術。

這意味着 JavaFX 的開放版本無法播放 VP6 FLV 文件。 這不是一個很大的損失,因為很難找到 VP6 編碼器或以 VP6 編碼的媒體。

其他更常見的視頻格式,例如 H.264 可以在 JavaFX 的開放版本中正常播放(只要您在目標機器上預裝了適當的編解碼器)。

WebStart/Browser Embedded 部署技術的缺乏實際上與 OpenJDK 本身有關,而不是專門與 JavaFX 有關。 該技術可用於部署非 JavaFX 應用程序。

如果開源社區為 Java(和其他軟件)開發一種部署技術,完全取代 WebStart 和 Browser Embedded 部署方法,從而為應用程序分發提供輕量級、低影響的用戶體驗,那就太好了。 我相信已經有一些項目開始服務於這樣的目標,但它們還沒有達到很高的成熟度和采用水平。

就個人而言,我覺得 WebStart/Browser Embedded 部署是遺留技術,目前有更好的方法來部署許多 JavaFX 應用程序(例如自包含應用程序)。

2019 年 12 月更新:

已開發出適用於 JDK 11+ 的 WebStart 開源版本,可在https://openwebstart.com獲得。

誰需要創建包含 JavaFX 的 Linux OpenJDK 發行版

由為基於 OpenJDK(例如 Redhat、Ubuntu 等)的 Linux 發行版創建軟件包的人來為包含 JavaFX 的 JDK 和 JRE 創建 RPM。 那些軟件發行商然后需要將生成的包放在他們的標准發行代碼庫(例如fedora/red hat network yum 庫)中。 目前這還沒有完成,但如果 Java 8 Linux 軟件包在 2014 年 3 月發布 Java 8 時不包含 JavaFX,我會感到非常驚訝。

2019 年 12 月更新

現在,JavaFX 已經從大多數二進制 JDK 和 JRE 發行版(包括 Oracle 發行版)中分離出來,取而代之的是,它可以作為獨立的 SDK、jmod 集或作為可從中央 Maven 存儲庫獲得的庫依賴項(如概述為https://openjfx.io ),標准 Linux OpenJDK 發行版不再需要包含 JavaFX。

如果您想要一個包含 JavaFX 的預構建 JDK,請考慮為各種平台提供的Liberica JDK 發行版

部署大量應用程序的建議

我建議使用 Java 的自包含應用程序部署模式。

這種部署模式的描述是:

應用程序安裝在本地驅動器上,並使用 Java 和 JavaFX 運行時的私有副本作為獨立程序運行。 該應用程序可以以與該操作系統的其他本機應用程序相同的方式啟動,例如使用桌面快捷方式或菜單項。

您可以從 Oracle JDK 發行版或從包含 JavaFX 的 OpenJDK 構建構建一個獨立的應用程序。 目前使用 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 年 4 月更新:有關 Oracle 當前未來發展政策的信息

對我來說,這很有效。

$ sudo apt-get install openjfx

作為一種快速的解決方案,您可以復制 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 或更高版本

同時回答這個問題:

我在哪里可以獲得 OpenJDK (Windows) 的預構建 JavaFX 庫

在 Linux 上它不是一個真正的問題,但在 Windows 上它不是那么容易,特別是如果你想分發 JRE。

您實際上可以在 Windows 上將 OpenJFX 與 OpenJDK 8 一起使用,您只需自己組裝它:

從這里下載 OpenJDK: https ://github.com/AdoptOpenJDK/openjdk8-releases/releases/tag/jdk8u172-b11

從這里下載 OpenJFX: https ://github.com/SkyLandTW/OpenJFX-binary-windows/releases/tag/v8u172-b11

從 JDK 頂部的 OpenFX zip 中復制所有文件,瞧,你有一個帶有 JavaFX 的 OpenJDK。

更新

幸運的是,Azul 現在有一個 OpenJDK+OpenJFX 構建,可以在他們的社區頁面下載: https ://www.azul.com/downloads/zulu-community/?&version=java-8-lts&os=windows&package=jdk-fx

嘗試obuildfactory

需要修改這些腳本(包含錯誤並且不完全執行所需的“事情”),我將在接下來的幾天上傳從 obuildfactory 分叉的我的腳本。 所以我也會相應地更新我的答案。

在那之前享受吧,先生:)

我需要在需要 Java FX 的 Windows 中運行 .jar。 我也不需要 JDK 部分。

注意:我沒有費心更改PATH / JAVA_HOME變量,因為在我的情況下不需要它,有關更完整的演練,請參閱: 如何在 Windows 上安裝 OpenJDK 11?

  1. 下載 OpenJDK 和 Java FX (jmods)(此示例的版本為 17.0.2)

https://jdk.java.net/17/

https://gluonhq.com/products/javafx/

  1. 解壓下載的文件。 將 .jmod 文件從 Java FX 目錄復制/移動到 OpenJDK 目錄(jmods 子目錄)。

  2. 使用 jlink 創建 JRE,使用此 Web 應用程序獲取確切的命令行選項: https ://justinmahar.github.io/easyjre/

PowerShell 片段:

$Version = '17.0.2'
$DownDir = 'path\to\dir\with\.zip'
$JdkDir = "jdk-${Version}"
$JavaFxDir = "javafx-jmods-${Version}"
$NewDir = "jre-${Version}+javafx"
$ProgramFilesDir = "$env:ProgramFiles\OpenJDK\${NewDir}"
Set-Location -Path $DownDir

# Unzip archives
Expand-Archive -Path "openjfx-${Version}_windows-x64_bin-jmods.zip" -Destination .
Expand-Archive -Path "openjdk-${Version}_windows-x64_bin.zip" -Destination .

# Create a custom runtime image using jlink, excluding all modules that start with 'jdk.'
Copy-Item -Path "${JavaFxDir}\*.jmod" -Destination "${JdkDir}\jmods"
$Mods = Get-Item -Path "$JdkDir\jmods\*.jmod" | ? { !($_.Name -like 'jdk.*') }
$Mods = $Mods.Name -replace '.jmod$' -join ','
& "${JdkDir}\bin\jlink.exe" --output $NewDir --compress=2 --no-header-files --no-man-pages --module-path "${JdkDir}\jmods" --add-modules $Mods

# (Optional) Delete unzipped directories
Remove-Item -Path $JdkDir,$JavaFxDir -Recurse

# Test if the .jar works
$jar = Get-Item "\path\to\.jar"
& "${NewDir}\bin\javaw.exe" -jar $jar

# (Optional) Copy the new directory to Program Files (requires admin privileges), zip it to distribute to other computers and delete it
Copy-Item -Path $NewDir -Destination $ProgramFilesDir -Recurse
Compress-Archive -Path $NewDir -DestinationPath "openjdk-${Version}_jre+javafx_windows-x64_bin.zip"
Remove-Item -Path $NewDir -Recurse

# (Optional) Create shortcut in Desktop
$Lnk = "$env:USERPROFILE\Desktop\Shortcut.lnk"
$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($Lnk)
$Shortcut.TargetPath = "${ProgramFilesDir}\bin\javaw.exe"
$Shortcut.WorkingDirectory = $jar.DirectoryName
$Shortcut.Arguments = '-jar "' + $jar.FullName + '"'
$Shortcut.Save()

根據 Oracle 將在 2014 年第一季度集成 OpenJDK 和 javaFX(參見路線圖: http ://www.oracle.com/technetwork/java/javafx/overview/roadmap-1446331.html)。 所以,對於第一個問題,答案是你必須等到那時。 對於第二個問題,沒有其他辦法。 因此,現在使用 java swing 或啟動 javaFX 並等待

我使用了 Amazon Coretto JDK。 這包含了我需要的所有 FX 組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM