zoukankan      html  css  js  c++  java
  • 打包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打包。这里我们以一个实例项目做说明:

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

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

      MDgFPS.png

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

      [MDgk8g.md.png](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包的名字),然后就可以点击运行了

  • 相关阅读:
    Ubuntu下使用Sysvinit实现自定义服务(简单研究)
    Linux初始化init系统-Sysvinit、Upstart、Systemd
    Ubuntu查看系统版本的方法
    Linux查看文件内容命令:more(转)
    Linux查看文件内容命令:less(转)
    Ubuntu 16.04下MySQL 5.7.18取消开机启动(解决无法使用Sysvinit(update-rc.d/sysv-rc-conf)脚本关闭)
    为什么说Ubuntu的运行级别为2
    Ubuntu 16.04开机进入命令行(tty1)+分辨率调节+字体颜色设置+中文乱码解决(解决虚拟终端Ctrl+Alt+F1分辨率太大)
    Linux运行级别研究(转)
    Linux服务管理(Ubuntu服务管理工具sysv-rc-conf)(转)
  • 原文地址:https://www.cnblogs.com/jiading/p/11875889.html
Copyright © 2011-2022 走看看