打包JavaFX11桌面应用程序
打包JavaFX11桌面应用程序
这是JavaFX系列的第二弹,第一弹在这里
在第一弹中,我们使用的是OpenJDK8,但是OpenJDK8和Oracle Java JDK不一样,它没有内置JavaFX模块,需要自己引入,而使用Oracle版的JDK直接import就好了。但是到了java11的时候无论是OpenJDK还是Oracle版都已经把JavaFX剥离开来了,javaFX现在由OpenJFX项目维护和更新。
第一弹中我使用的是OpenJDK8,后来想想,还是要顺应时代发展潮流,所以在这里转为使用OpenJDK11了,但是这对JavaFX技术的使用应该是没有区别的。
我们现在面对的主要问题是不能用Paxkager打包项目,原因是packager被从JFX11中除去了,咱也不知道为什么要这么干。但是我们如果要发布一个Java桌面程序的话,打包是必不可少的。我们在这里可以使用maven打包。这里我们以一个实例项目做说明:
在IDEA中创建一个JavaFX项目
用screenbuilder稍微修改一下、创建一个页面样式,这样等程序执行的时候好看效果

为项目添加Maven框架支持
因为我们使用的OpenJDK11没有JavaFX,我们使用maven进行openjfx包的安装和管理
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>13</version>
</dependency>
我的项目中还涉及到了一个ojdbc7,这个包说来有趣,maven repository中有这个包,但是它不在maven的中央仓库中,所以直接把maven repository里的dependency拷贝进来是不行的。我们可以进行手动安装到maven本地仓库:首先下载ojdbc7的jar包,然后执行命令:
mvn install:install-file -Dfile=D:/ojdbc7-12.1.0.2.jar -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.2 -Dpackaging=jar
然后就可以将maven repository里的内容粘贴到dependencies里了,注意groupId、artifactId、version要和命令中的保持一致。
然后我们点击run,会爆出一个错误:Error:java: 错误: 不支持发行版本 5。这需要我们在pom文件中配置一下java版本以及源码和目标代码的版本:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>11</java.version>
</properties>
这一段加在version标签后面就好
然后调整一下IDEA的配置:Settings->Build->Compiler->Java Compiler->Target bytecode version,将其改为8
然后再运行,发现又报错了:
Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x630188e7) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x630188e7。关于这个错误,有位博主在博客中已经解决了:解决方法就是单独再写一个启动类AppMain:package sample; import javafx.application.Application; public class AppMain {
public static void main(String[] args) {
Application.launch(Main.class,args);
}
}
然后就可以成功运行了
其实现在已经可以使用maven来build了,在IDEA的Termial中输入mvn clean install,我们就可以看到生成了target目录,里面就有一个jar包。但是这个jar包很小啊,而且点击也不能直接运行。这是因为maven默认的build方法并没有把依赖包打进去,而我们的目标是创建一个桌面应用程序,是需要一个包含依赖的jar包的。解决办法就是不使用maven默认的打包方法,有关这个可以见这篇博文.我们在这里使用的是maven-assembly-plugin的打包方法:
这里我们要修改maven的pom.xml配置页面中Build的方法,在刚才的dependencies之后加上以下的内容:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>make-assembly</id>
<!-- 绑定到package生命周期 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>sample.AppMain</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
然后我们继续执行
mvn clean install就可以看到在生成的target目录下有了一个很大的jar包,大概几MB吧。打开终端,输入
chomd 777 xxx.jar(xxx是jar包的名字),然后就可以点击运行了
打包JavaFX11桌面应用程序的更多相关文章
- 将现有vue项目基于electron打包成桌面应用程序
一.前言 项目本来打算采用B/S架构去做的,浏览器网址方式打开还是让用户不方便: 二.使用electron集成桌面应用 本身项目是使用vue-cli开发的,在使用electron之前,需要将本身的项目 ...
- electron打包成桌面应用程序的详细介绍
1.前提条件 a. 安装了node b.安装了electron c.你知道自己写的东西(js,css,html等等)放在那个文件夹(假设这个文件夹命名为 app,下面会用到)中 2.安装electro ...
- 使用node-webkit(v0.35.5)和innosetup(3.6.1)打包将web程序打包为桌面客户端(安装包)
这边主要是有一个客户,需要在电视机上安装一个客户端,含有视频直播功能:刚开始我们采用的webapp打包成apk安装在电视机上,发现摄像头监控画面根本无法播放(apk在手机上可以正常播放视频):排除一些 ...
- C#—使用InstallerProjects打包桌面应用程序
前言 打包桌面应用程序实在是一个不常使用的东西,偶尔使用起来经常会忘东忘西的耽误时间,因此,这篇文章多以图片记录过程,也是用于备忘. 下载打包工具 C#打包桌面应用程序有很多种方法,这里介绍一种使用M ...
- Electron打包H5网页为桌面运行程序
一.安装配置环境 Electron(一种桌面应用程序运行时),Electron 把 Chromium 和 Node 合并到一个单独的运行时里面,很适合开发桌面 web 形式的应用程序,通过Node它提 ...
- nodejs打包成桌面程序(exe)的进阶之路
nodejs打包成桌面程序(exe)的进阶之路 node js bat 前端 计划任务 前言:最近的研究,请大佬们细品 第一篇 - 任务计划程序篇 说真的研究到将nodejs打包成可执行的exe文件是 ...
- 将python项目打包为可运行的windows桌面exe程序
---恢复内容开始--- 步骤大概如下: 1.需要一个python文件/项目.也就是我们想要打包的文件 2.安装pyinstaller,目的是将我们的python文件生成为exe可执行程序. 3.使用 ...
- electron之Windows下使用 html js css 开发桌面应用程序
1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...
- nodejs+chromium 创建桌面应用程序
直接用nodejs+javascript+html+css也可以创建桌面应用程序啦,前端开发的同学应该都比较感兴趣. 生成的应用程序自带nodejs环境和chrome浏览器环境. github的ato ...
随机推荐
- Flutter移动电商实战 --(13)ADBanner组件的编写
1.AdBanner组件的编写 我们还是把这部分单独出来,需要说明的是,这个Class你也是可以完全独立成一个dart文件的.代码如下: 广告图片 class AdBanner extends Sta ...
- tensorflow中一个矩阵和一个向量相加
import tensorflow as tf x=tf.constant([[1,2],[3,4]]) y=tf.constant([[1],[1]])#列向量 z=tf.constant([1,1 ...
- VC 实现程序只运行一个实例,并激活已运行的程序
转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...
- POJ2513:Colored Sticks(字典树+欧拉路径+并查集)
http://poj.org/problem?id=2513 Description You are given a bunch of wooden sticks. Each endpoint of ...
- Hander创建消息
每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能.Android消息机制中引入了消息池.Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池 ...
- RabbitMQ学习之:(四)回头看刚才写的程序 (转贴+我的评论)
转自:http://lostechies.com/derekgreer/2012/03/18/rabbitmq-for-windows-hello-world-review/ 我的心得: 1. 在创建 ...
- 转 MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法
http://blog.sina.com.cn/s/blog_637e04c9010117ri.html 1 问题 [root@localhost mysql]# /etc/rc.d/init.d/m ...
- Turbine Netflix
Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况. 本实例是在consul做为服务发现时的配置. Turbine聚合器: 可以参照:https:// ...
- 运行python程序不显示cmd方法
运行python程序不显示cmd方法 Pythonw xxx.py 将*.py改成*.pyw,然后执行*.pyw Python.exe和pythonw.exe不同: 执行时没有控制台窗口 所有向原有的 ...
- Hadoop HDFS命令学习笔记
cat Usage: hadoop fs -cat [-ignoreCrc] URI [URI ...] Copies source paths to stdout. Options The -ign ...
](