打包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打包。这里我们以一个实例项目做说明:

  1. 在IDEA中创建一个JavaFX项目

  2. 用screenbuilder稍微修改一下、创建一个页面样式,这样等程序执行的时候好看效果

  3. 为项目添加Maven框架支持

    [](https://imgchr.com/i/MDgFPS)

  4. 因为我们使用的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>
  5. 我的项目中还涉及到了一个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要和命令中的保持一致。

  6. 然后我们点击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);
    }
    }

    然后就可以成功运行了

  7. 其实现在已经可以使用maven来build了,在IDEA的Termial中输入mvn clean install,我们就可以看到生成了target目录,里面就有一个jar包。但是这个jar包很小啊,而且点击也不能直接运行。这是因为maven默认的build方法并没有把依赖包打进去,而我们的目标是创建一个桌面应用程序,是需要一个包含依赖的jar包的。解决办法就是不使用maven默认的打包方法,有关这个可以见这篇博文.我们在这里使用的是maven-assembly-plugin的打包方法:

  8. 这里我们要修改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>
  9. 然后我们继续执行mvn clean install就可以看到在生成的target目录下有了一个很大的jar包,大概几MB吧。

  10. 打开终端,输入chomd 777 xxx.jar(xxx是jar包的名字),然后就可以点击运行了

打包JavaFX11桌面应用程序的更多相关文章

  1. 将现有vue项目基于electron打包成桌面应用程序

    一.前言 项目本来打算采用B/S架构去做的,浏览器网址方式打开还是让用户不方便: 二.使用electron集成桌面应用 本身项目是使用vue-cli开发的,在使用electron之前,需要将本身的项目 ...

  2. electron打包成桌面应用程序的详细介绍

    1.前提条件 a. 安装了node b.安装了electron c.你知道自己写的东西(js,css,html等等)放在那个文件夹(假设这个文件夹命名为 app,下面会用到)中 2.安装electro ...

  3. 使用node-webkit(v0.35.5)和innosetup(3.6.1)打包将web程序打包为桌面客户端(安装包)

    这边主要是有一个客户,需要在电视机上安装一个客户端,含有视频直播功能:刚开始我们采用的webapp打包成apk安装在电视机上,发现摄像头监控画面根本无法播放(apk在手机上可以正常播放视频):排除一些 ...

  4. C#—使用InstallerProjects打包桌面应用程序

    前言 打包桌面应用程序实在是一个不常使用的东西,偶尔使用起来经常会忘东忘西的耽误时间,因此,这篇文章多以图片记录过程,也是用于备忘. 下载打包工具 C#打包桌面应用程序有很多种方法,这里介绍一种使用M ...

  5. Electron打包H5网页为桌面运行程序

    一.安装配置环境 Electron(一种桌面应用程序运行时),Electron 把 Chromium 和 Node 合并到一个单独的运行时里面,很适合开发桌面 web 形式的应用程序,通过Node它提 ...

  6. nodejs打包成桌面程序(exe)的进阶之路

    nodejs打包成桌面程序(exe)的进阶之路 node js bat 前端 计划任务 前言:最近的研究,请大佬们细品 第一篇 - 任务计划程序篇 说真的研究到将nodejs打包成可执行的exe文件是 ...

  7. 将python项目打包为可运行的windows桌面exe程序

    ---恢复内容开始--- 步骤大概如下: 1.需要一个python文件/项目.也就是我们想要打包的文件 2.安装pyinstaller,目的是将我们的python文件生成为exe可执行程序. 3.使用 ...

  8. electron之Windows下使用 html js css 开发桌面应用程序

    1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...

  9. nodejs+chromium 创建桌面应用程序

    直接用nodejs+javascript+html+css也可以创建桌面应用程序啦,前端开发的同学应该都比较感兴趣. 生成的应用程序自带nodejs环境和chrome浏览器环境. github的ato ...

随机推荐

  1. pm2 配置方式

    1.命令生产默认示例配置文件pm2 ecosystem或pm2 init,运行默认会生成ecosystem.config.js配置文件 module.exports = { apps: [ { nam ...

  2. SQL-W3School-基础:SQL 简介

    ylbtech-SQL-W3School-基础:SQL 简介 1.返回顶部 1. SQL 是用于访问和处理数据库的标准的计算机语言. 什么是 SQL? SQL 指结构化查询语言 SQL 使我们有能力访 ...

  3. wpf相关好资源

    Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF.aspx Odys ...

  4. jQuery.extend函数

    http://www.cnblogs.com/luckboy/archive/2009/06/25/1510870.html 1.扩展jQuery静态方法. 1$.extend({ 2test:fun ...

  5. 小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下

    笔记 4.Feign结合Hystrix断路器开发实战<下>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况     1.feign结合Hystrix       ...

  6. 分布式存储ceph介绍(1)

    一.Ceph简介: Ceph是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环 ...

  7. iscsi序列二、iscsi多路径配置方式

    一.ISCSI多路径应用 如果存储服务器到交换机只有一条线路的时候,那么一条线路出线故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障 如上图,如果SAN服务器与客户端交换机只有一条线路 ...

  8. Java中传入一个时间范围,取出该时间范围内所有日期的集合

    直接上代码: import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; impor ...

  9. jenkins配置jdk、git、maven

    进入首页->系统管理->全局工具配置 配置jdk 查找jdk安装路径 如果是容器版jenkins,就登进容器里面查看jdk路径 [root@test2 ~]# echo $JAVA_HOM ...

  10. laravel redis存数组并设置过期时间

    $data = [ 'zoneList'=>$zoneList, 'eqList' => $eqList, 'mdateList' => $mdateList ]; Redis::s ...