专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  我有点想用JDK17了 ·  5 天前  
芋道源码  ·  这款轻量级规则引擎,真香!! ·  5 天前  
51好读  ›  专栏  ›  芋道源码

做了个java打包工具,可以双击启动了!

芋道源码  · 公众号  · Java  · 2025-01-10 09:48

正文

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7411745719226482738


我日常工作主要使用Java进行开发,业余时间也热衷于技术研究,喜欢用Java的GUI库Swing开发一些实用的小工具。

但是用Swing开发软件相比C/C++的一个很大的劣势就是,Java打包出来的文件不能直接运行,需要使用JRE(Java runtime environment)才能运行,如果使用软件的人没有JRE,也不能运行软件,所以基本上没有人会考虑使用Java来开发桌面应用。

当前Java程序打包分发的几种方案:

  • 使用当下最火的GraalVM,将Jar包编译成二进制可执行文件。
  • 使用JLink打包,将jar包编译成二进制可执行文件。
  • 使用Exe4J生成启动器,然后使用压缩软件制作自解压的压缩包。
  • 编写批处理,然后再用压缩软件制作自解压的压缩包。
  • 仅分发Jar包,让使用者安装JRE,然后使用命令启动Jar包。

以上方案都有不同的优缺点:

技术方案优点缺点
GraalVM性能提升,减少资源损耗,安全性高构建耗时,调试困难,不好支持反射
Jlink二进制文件,比携带环境更轻量级构建复杂,调试困难,体积大
Exe4J降低使用门槛,有更好的体验,便于调试体积大,需要JRE运行1,不适合做小工具
批处理降低使用门槛,配置灵活,易于更新,便于调试体积大,需要JRE运行,不适合做小工具
仅Jar包分发文件小,容易更新没有JRE的电脑上不能运行,需要命令启动,使用门槛高,体验不好

以上方案中,二进制文件分发会调试困难,jar包形式分发会影响使用体验,现在我综合上边的几种方案,用Winform制作一个打包工具,用以将Java程序打包成二进制可执行文件,软件界面如下:

软件使用如下:

现有一个Swing程序如下:

pom.xml文件


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0modelVersion>

    <groupId>org.helloswinggroupId>
    <artifactId>HelloSwingartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <maven.compiler.source>17maven.compiler.source>
        <maven.compiler.target>17maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>com.formdevgroupId>
            <artifactId>flatlafartifactId>
            <version>3.5.1version>
        dependency>

    dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-assembly-pluginartifactId>
                <version>3.7.1version>
                <configuration>
                    
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependenciesdescriptorRef>
                    descriptorRefs>
                    
                    <appendAssemblyId>falseappendAssemblyId>
                    
                    <archive>
                        <manifest>
                            <mainClass>org.hellloswing.HelloSwingmainClass>
                        manifest>
                    archive>
                configuration>
                <executions>
                    <execution>
                        <id>make-assemblyid>
                        
                        <phase>packagephase>
                        <goals>
                            <goal>singlegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
project>

HelloSwing.java文件

package org.hellloswing;

import com.formdev.flatlaf.FlatDarkLaf;
import com.formdev.flatlaf.FlatLightLaf;

import javax.swing.*;
import java.awt.*;

public class HelloSwing {

    public static void main(String[] args) throws UnsupportedLookAndFeelException {
        // 初始化皮肤
        FlatLightLaf.install();
        UIManager.setLookAndFeel( new FlatDarkLaf());
        // 初始化窗口
        JFrame jFrame = new JFrame("Hello Swing!");
        // 设置大小
        jFrame.setSize(500500);
        // 关闭窗口后退出
        jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // 设置居中
        jFrame.setLocationRelativeTo(null);
        // 设置元素
        JPanel jPanel = new JPanel(new BorderLayout());
        jPanel.add(new JLabel("Hello Swing!", JLabel.CENTER), BorderLayout.CENTER);
        jFrame.getContentPane().add(jPanel);
        // 显示窗口
        jFrame.setVisible(true);
    }
}

将其打包成胖JAR后,导出精简JRE,然后使用打包工具打包,将JAR文件于JRE打包成exe文件。之后就可以双击运行了。

特此做个记录。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)