天天看點

javafx 與java_我的Java(定制你的Java/JavaFX Runtime)

最新的JDK 11釋出了,撒花

新版本的JDK終于有了openjdk的build提供下載下傳鳥,總算可以讓oracle jdk去死一死了,建議所有使用者全部轉向openjdk以避免oracle那幫閑着無聊的法務部的騷擾和監視//crossing my fingers

嗯,随着JDK 11的釋出,一些重大的變化也開始顯現出來,一個明顯的問題就是,在JavaFX相關的群裡,不斷會有萌新問,找不到runtime blablabla,嗯,因為JavaFX在新版本中已經從标準JDK中拆除出來,成為了一個獨立的項目,這個是他們現在的網址:https://openjfx.io/​openjfx.io

那我們下面說一下如何用最新版本的JavaFX,說實話,看到這麼多人用JavaFX讓我異常意外,不是說好的這玩意沒前途嘛?必死無疑嘛?這麼多人冒出來是腫麼肥四?

看來隻要是Java的東西,天生就會有一大堆開發者群體,隻要做得好,就不愁使用者

好了,程式員嘛,有問題解決問題,既然我們知道了問題,那下面就說一下怎麼解決問題

如果你隻是想在idea中用上javafx的話,那參考一下上面網址中的maven項目,照着做就可以了,很簡單,唯一有一點點麻煩的就是在測試的時候,需要用compile exec:java -f pom.xml來啟動測試,idea中run configuration的截圖如下:

然後确定,然後輕按兩下就可以啟動了,是不是很友善呢?

然後就可以開始寫代碼啦,new一個maven的project,一路按照向導點下去,生成之後,這是測試代碼:

package com.whitewoodcity;

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.control.Label;

import javafx.stage.Stage;

public class Hello extends Application {

@Override

public void start(Stage stage) {

String javaVersion = System.getProperty("java.version");

String javafxVersion = System.getProperty("javafx.version");

Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");

Scene scene = new Scene(l, 640, 480);

stage.setScene(scene);

stage.show();

}

public static void main(String[] args) {

launch();

}

}

然後用maven來編譯,就能在target的com/whitewoodcity檔案夾下看到該Hello.class啦,然後執行剛才生成的run,就能在idea中看到效果了,ide截圖如下,參考:

但是,要發送給使用者的話,這樣做還是不夠滴,我們還需要定制我們的jre,哇哇哇,想想都激動,我的Java,聽起來像是我的世界那麼有趣,來看看腫麼操作,其實也不難

首先我們打開openjdk的壓縮包,看看它的結構,樸實無華,普通得不能再普通,你都能憑借經驗猜出來,它到底是怎麼搞的,有一個bin目錄,裡面有着所有的指令和工具,那要定制我的java或者jre,我們需要用到的是jlink這個指令,那這個指令輸入help,就能看到相關參數,latte大鳥曾經說,不懂我就help,這是個好習慣,不妨學習一下,搞挨踢就應該這樣,不懂你就help,看看指令會提示你什麼,其實看看也能猜出來是怎麼操作的

然後去http://openjfx.io上下載下傳jmods,你要做什麼作業系統上的jre,就下對應os上的jmod,比如我是macosx,那麼我就下這個JavaFX Mac OS X jmods,下載下傳完解壓縮,會看到裡面會有一些jmods檔案,如圖:

嗯,對,我更新到了MoJave,你看這名字都像是MyJava,天意?

然後我們再打開openjdk的檔案夾,會看到有一個jmods的檔案夾,那這兩個jmods檔案夾裡的jmods就是我們的原材料啦,我們會用這些jmods做出一個我們自己的jre,我的Java,myJava

第一步先拷貝javafx.*.jmods到openjdk下jmods檔案夾,mv,cp,或者打開finder拖,随便你

第二步執行指令,指令就是jlink啦,我們到Home檔案夾下,執行以下指令:

bin/jlink --module-path jmods --add-modules java.base,javafx.base,javafx.graphics,javafx.controls --output myjava

嘎吱嘎吱一陣之後,在ls一下,就能看到多了一個myjava的檔案夾,這個就是我的java啦

因為我們隻用到了java.base, javafx.base, javafx.graphics, javafx.controls四個子產品,其他的暫時用不到,如果将來你用到了,需要重新制作你的java runtime,不再贅述

第三步把javafx那三個jmods對應的jars下載下傳下來,放入剛剛做好的myjava/lib中去,jars在maven central上有,任何時候找不到jars,就去Maven Repository上搜是一個好習慣,下載下傳這幾個jars:javafx-base,javafx-controls,javafx-graphics,下載下傳下來後記得拷貝到myjava/lib裡面去//這一步似乎不是必需的,可以省略,因為有了jmod,應該不需要再有jar了,但是似乎我在某一次操作的時候遇到了沒有jar的問題,先留在這裡,留作備份

第四步拷貝,我們再把剛才maven項目中生成的com/whitewoodcity/Hello.class整個檔案夾拷貝過來,然後再把剛才做好的myjava檔案夾也拷貝過來,這樣我們就有了兩個檔案夾:

com檔案夾下面是whitewoodcity/Hello.class

再然後就簡單啦,我們已經有了我的java,那麼啟動myjava/bin/java就好啦,當然還要給這個指令喂一下參數,告訴它我們的main class在哪裡,就是剛才的Hello.class啦

myjava/bin/java com.whitewoodcity.Hello

搞定,下圖是效果:

有了指令之後,我們就可以再根據不同的os定制腳本檔案,比如win下的bat,mac/linux下的bash,随便了

然後再将bat做成exe,這個工具網絡上随便搜,大把,不做也沒啥,無非啟動時候黑一下

做成exe之後,你可以把黑一下給去掉

再然後你就可以将你的遊戲上傳steam上去,然後告訴steam分别在不同的os下該啟動哪些指令……

如果沒有steam這種平台的話,你可以做成installable files,比如macosx下的dmg,win下的exe,win下用innosetup就行了,mac下自帶有工具,網絡上搜一下也挺多教程的,不難

這個事情其實也給了我們一點點啟迪,就是将來如果打算做一個java的遊戲引擎的話,尤其是3d的圖形處理,肯定要封裝gpu相關的底層圖形庫,比如macosx下的mental,開源的vulkan(fuchsia和linux都會選擇vulkan,opengl會被deprecated掉)win下的d3d這些,那麼可以通過jmod的方式內建到runtime中去,JavaFX就是這麼幹的,可以參考JavaFX的源碼,在github上有,http://openjfx.io首頁上有連結

記得JavaFX群裡曾經有人抱怨過說,JavaFX的3d圖形api還不夠強大,尤其是缺少shader等工具,嗯,那現在就有辦法貢獻了,有識之士可以開工了

bye