天天看点

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