java打jar包并包装成exe解压即用

news2025/3/1 23:19:56

1首先找到要加载的main方法类


    public static void main(String[] args) {
//创建该对象则调用构造方法,对象实现ActionListener则自动调用actionPerformed()方法
        new PicdealMain();
    }

2.点击 idea:File->Project Struce…(快捷键 ctrl + shift +alt +s)。如图:

在这里插入图片描述

3添加jar

在这里插入图片描述

3.1 选择启动类

在这里插入图片描述

4 编译打包

在这里插入图片描述

4.1 清理构建

在这里插入图片描述

二 下载exe4j工具

重点需要注意的如下:

在这里插入图片描述

如下图1为exe应用名字,2为图标log必须为ico格式,在32位还是64位运行自主选择

在这里插入图片描述

在这里插入图片描述

vm处可以自己设置大小
修改jvm参数可以写这个:
-Xmn128m -Xms1512m -Xmx1512m
在这里插入图片描述

在这里插入图片描述

重点来了

下方路径就是jre的路径,如果和应用同级可以直接写 .\bin (我是将jre文件夹名字改为了bin的看起好点)
在这里插入图片描述

在这里插入图片描述
前面也有设置需要是否输出日志自己选择下。
整体到此结束

这是我的一份读取图像扫描文件大小尺寸的代码

package org.example;

import com.alibaba.excel.EasyExcel;
import lombok.SneakyThrows;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.example.entity.HeadInfo;
import org.example.entity.PicInfo;
import org.example.FileUtil.ReadFile;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName: Picdeal
 * @Package: org.example
 * @Author: TangMei
 * @CreateTime: 17:10 2023/3/3
 * @Version 1.0
 * @Description: 这是一个相当有用的类
 **/
public class PicdealMain extends JFrame implements ActionListener {

    private String inpath;
    private String outpath;
    //窗口
    JFrame jf = new JFrame("计算图片大小(下方路径不可手动输入)");
    //画板
    JPanel jp = new JPanel();
    //布局卡选项
    JTabbedPane tabPane = new JTabbedPane();
    //布局1
    Container con = new Container();

    //标签
    JLabel jl1 = new JLabel("选择数据源");

    JLabel jl3 = new JLabel("选择输出目录");
    //按钮
    JButton jb1 = new JButton("···");

    JButton jb3 = new JButton("···");
    JButton jb4 = new JButton("启动程序");

    //文本
    JTextArea jt1 = new JTextArea();

    JTextArea jt3 = new JTextArea();
    //文件选择器
    JFileChooser chooser = new JFileChooser();

    public PicdealMain() {
//将画板加到窗口上
        //选择当前程序根目录
        chooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
        jf.add(jp);
//布局,将布局卡加到面板上
        jf.setContentPane(tabPane);
//设置标签,按钮,文本框的位置及大小,x,y,width,height
        jl1.setBounds(20, 20, 100, 20);
        jb1.setBounds(640, 20, 50, 20);
        jt1.setBounds(120, 20, 500, 20);

        jl3.setBounds(20, 80, 100, 20);
        jb3.setBounds(640, 80, 50, 20);
        jt3.setBounds(120, 80, 500, 20);
        jb4.setBounds(300, 140, 100, 30);

//设置按钮事件处理   this代表本身这个对象,意思是监听这个对象,所里该类必须实现ActionListener
        jb1.addActionListener(this);
        //  jb2.addActionListener(this);
        jb3.addActionListener(this);
        jb4.addActionListener(this);
//将按钮加到布局1上
        con.add(jl1);
        con.add(jt1);
        con.add(jb1);

        con.add(jl3);
        con.add(jt3);
        con.add(jb3);
        con.add(jb4);
//将布局加到布局卡内,并设置该布局的名称
        tabPane.add("计算图片大小", con);
//设置窗口属性---------------------
//窗口可见
        jf.setVisible(true);
//窗口大小
        jf.setSize(800, 400);
//关闭窗口时关闭程序
        jf.setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗口位置
        jf.setLocation(400, 150);
    }


    public static void main(String[] args) {
//创建该对象则调用构造方法,对象实现ActionListener则自动调用actionPerformed()方法
        new PicdealMain();
    }


    //事件处理,所有事件处理必须写在该方法,该方法重写自ActionListener
    @SneakyThrows
    @Override
    public void actionPerformed(ActionEvent e) {

//点击按钮后,判断是哪一个按钮
        if (e.getSource() == jb1) {
//设置文件选择器只能选择0(文件),1(文件夹)
            chooser.setFileSelectionMode(1);
//打开文件浏览器,点击取消则返回1
            int status = chooser.showOpenDialog(null);
            if (status == 1) {
                return;
            } else {
//读取选择器选择到的文件
                File file = chooser.getSelectedFile();
//获取文件绝对路径并写入到文本框内
                jt1.setText(file.getAbsolutePath());

                inpath = file.getAbsolutePath();
            }
        }

        if (e.getSource() == jb3) {
            chooser.setFileSelectionMode(1);
            int status = chooser.showOpenDialog(null);
            if (status == 1) {
                return;
            } else {
                File file = chooser.getSelectedFile();
                if (file == null) {
                    file = new File(System.getProperty("user.dir"));
                }
                jt3.setText(file.getAbsolutePath());
                outpath = file.getAbsolutePath();
            }
        }
        if (e.getSource() == jb4) {

            new Thread() {

                @Override
                public void run() {
                    JOptionPane.showMessageDialog(null, "...", "提示-正在计算运行", JOptionPane.INFORMATION_MESSAGE);

                }
            }.start();


            if (outpath == null) {
                outpath = System.getProperty("user.dir");
            }

            System.err.println("inpath:" + inpath);
            System.err.println("outpath:" + outpath);

            try {

                //读取本地文件所有图片
                File file = new File(inpath);
                //数据持久化到D盘
                writeAllFile(file);
                JOptionPane.showMessageDialog(null, "计算完毕,已将结果输出到应用根目录或指定文件夹。。。", "提示", JOptionPane.PLAIN_MESSAGE);
            } catch (Exception ee) {
                JOptionPane.showMessageDialog(null, ee.getClass().getName() + ",请确定输入输出路径无异常", "提示", JOptionPane.YES_NO_OPTION);
                ee.printStackTrace();
            }

        }
    }

    public static void writeToXlsx2(List<PicInfo> picInfoList, String outPath) throws IOException, InvalidFormatException {
        boolean isExits = true;
        String filename = outPath + "\\result.xlsx";

        File file = new File(filename);

        if (!file.exists()) {
            isExits = false;
            file.createNewFile();
        }

        if (!isExits) {
            List<HeadInfo> headInfos = new ArrayList<>();
            FileOutputStream out = new FileOutputStream(filename);
            EasyExcel.write(out, HeadInfo.class)
                    .autoCloseStream(Boolean.TRUE)
                    .sheet("Sheet1")
                    .doWrite(headInfos);
        }

        FileInputStream fileInputStream = new FileInputStream(filename);
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
        XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
        FileOutputStream fileOutputStream = new FileOutputStream(filename);

        for (PicInfo picInfo : picInfoList) {
            XSSFRow row = sheet.createRow(sheet.getLastRowNum() + 1);//新增一行
            XSSFCell cell1 = row.createCell(0);//行中的第“0+1”列
            cell1.setCellValue(picInfo.getName());//列中放的值
            XSSFCell cell2 = row.createCell(1);
            cell2.setCellValue(picInfo.getWidthCm());
            XSSFCell cell3 = row.createCell(2);
            cell3.setCellValue(picInfo.getHeightCm());
            XSSFCell cell4 = row.createCell(3);
            cell4.setCellValue(picInfo.getA401());
            XSSFCell cell5 = row.createCell(4);
            cell5.setCellValue(picInfo.getA402());
            XSSFCell cell6 = row.createCell(5);
            cell6.setCellValue(System.currentTimeMillis());
        }

        fileOutputStream.flush();
        xssfWorkbook.write(fileOutputStream);
        fileOutputStream.close();

    }

    private void writeAllFile(File file) throws IOException, InvalidFormatException {
        File[] files = file.listFiles();

        for (File f : files) {
            if (f.isDirectory()) {
                writeAllFile(f);
            } else {

                countSize(f.getAbsolutePath());
            }

        }

    }


    private void countSize(String fileNames) throws IOException, InvalidFormatException {


        List<PicInfo> PicList = new ArrayList<>();
        BufferedImage sourceImg;
        double width = 0.0;
        double height = 0.0;
        String suffix = ".JPG.JPEG.PNG.BMP";
        String s = fileNames;
        if (s.indexOf(".") == -1) {
            return;
        }

        String pos = s.substring(s.lastIndexOf(".")).toUpperCase();
        if (suffix.indexOf(pos) == -1) {
            return;
        }

        File picture = new File(s);
        PicInfo picInfo = new PicInfo();
        picInfo.setName(s);
        // 源图大小
        sourceImg = ImageIO.read(new FileInputStream(picture));

        //获取图片像素
        try {
            width = sourceImg.getWidth();
            height = sourceImg.getHeight();
        } catch (Exception e) {
            System.err.println("此扫描文件有异常已跳过:"+s);
            return;
        }

        double area = 21 * 29.7;
        //获取图片的长宽
        picInfo.setWidthInch(width / 300);
        picInfo.setHeightInch(height / 300);
        picInfo.setWidthCm(picInfo.getWidthInch() * 2.54);
        picInfo.setHeightCm(picInfo.getHeightInch() * 2.54);
        PicList.add(picInfo);

        //等比计算纸张大小(A4) --按长宽
        if (width < height) {
            int a41 = (int) (Math.ceil(picInfo.getWidthCm() / 21) * Math.ceil(picInfo.getHeightCm() / 29.7));
            int a42 = (int) Math.ceil(picInfo.getWidthCm() * picInfo.getHeightCm() / area);
            picInfo.setA401(a41);
            picInfo.setA402(a42);
        } else {
            int a41 = (int) (Math.ceil(picInfo.getWidthCm() / 29.7) * Math.ceil(picInfo.getHeightCm() / 21));
            int a42 = (int) Math.ceil(picInfo.getWidthCm() * picInfo.getHeightCm() / area);
            picInfo.setA401(a41);
            picInfo.setA402(a42);
        }

        PicdealMain.writeToXlsx2(PicList, outpath);


    }

}

   <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6.12</version>
        </dependency>
资源下载地址

https://download.csdn.net/download/weixin_44873668/87855674

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/601632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis深入学习总结(1.0)

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

3年经验,面试测试开发岗25K都拿不到了吗?这么坑?

最近后台读者说自己最近在疯狂投简历&#xff0c;有的石沉大海&#xff0c;但还好不是全军覆没。前两天好不容易熬到了阿里的四面&#xff0c;跟我聊了一下&#xff0c;面试官拿哪些题为难了他&#xff1f; 前面几题还好&#xff0c;问的是有关JVM的一些问题&#xff0c;比如说…

一道Java经典面试题 99%都有可能做错

前言 最近在面试中遇到一个关于位运算的题目 如下图 请问这个aString打印值是多少 学过位运算我们都知道 9<<4位 用2进制表示就是0000 1001 如果按照我之前的算法就是 0000 10001 向左位运算4 得到 1001 0000 这个时候我们得到的值就是 12816 144 拿到144这个值我们再…

session.upload_progress文件包含漏洞

session.upload_progress文件包含漏洞 前言 之前学习了该漏洞&#xff0c;但是没有做笔记&#xff0c;导致容易遗忘。在此用一个题目来理解session.upload_progress漏洞 基础知识 session存储 我们在phpinfo可以看到session的存储路径&#xff1a; 以下是一些session在lin…

【Python文本处理】基于运动路线记录GPX的文件解析,GPX转SRT字幕文件(不需要安装三方库)

【Python文本处理】基于运动路线记录GPX的文件解析&#xff0c;GPX转SRT字幕文件&#xff08;不需要安装三方库&#xff09; 解析和转换 GPX文件格式 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;t…

【GTest】使用CMakeLitsts.txt构建Windows和Linux的跨平台GoogleTest项目(非常详细+亲测有效)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

00): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

好久没有使用数据库&#xff0c; 连接数据库报上面的错误&#xff0c;尝试了网上的方法还是没有成功&#xff0c;思索之后想起之前手动关闭了mysql的服务&#xff0c;Windows启动时mysql服务不会自动启动&#xff0c;成功启动mysql服务后再次连接数据库&#xff0c;正常连接。 …

keil 使用问题总结

1. 编译报错 1.1 …\USER\stm32f10x.h(428): error: #67: expected a “}” ADC1_2_IRQn 18, /*!< ADC1 and ADC2 global Interrupt */*** Using Compiler V5.06 update 4 (build 422), folder: D:\keil_v537\install\ARM\ARM…

滴滴和华为5年,分享一下真实的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;之后跳槽到了滴滴&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有…

朋友圈九宫格照片怎么做?一键图片分割

相信朋友们都看过这样发朋友圈的方式&#xff0c;一张图片发出九宫格的效果&#xff1a; 或者是在各大社交平台、引流平台&#xff0c;这种发图的方法已经屡见不鲜了&#xff0c;可当自己上网搜【图片分割】、【宫格切图】等等&#xff0c;要么就是要注册账号登录才能操作&…

大数据---聚类分析概述及聚类评估

聚类概述: 什么是聚类&#xff1f; 是把数据对象集合按照相似性划分成多个子集的过程。每个子集是一个簇&#xff08;cluster&#xff09;&#xff0c;分类的最终效果&#xff1a;使得簇中的对象彼此相似&#xff0c;但与其他簇中的对象相异。聚类是无监督学习&#xff0c;因…

ses价签墨水屏折腾-01

前言 一直想玩玩墨水屏&#xff0c;这次咸鱼找了全新的ses价签&#xff0c;而且价格还很便宜&#xff0c;于是买了一个2.66寸三色&#xff0c;和一个4.2寸三色的墨水屏幕&#xff0c;经过几天的折腾终于能正常显示了。 显示效果如下&#xff1a; 折腾来折腾去&#xff0c;发…

DMES-2023第十三届数字营销与电商峰会大会 火热报名中

2023第十三届数字营销与电商峰会将于7月6-7日在上海召开&#xff01; 本次峰会线上线下同步举行&#xff0c;将通过七大热点主题帮助品牌主突破模式能力&#xff0c;回归初心、精耕细作&#xff0c;实现可持续增长&#xff1b;提升产品能力&#xff0c;实现可持续长期增长&…

智能名片如何缓解社交商务时的尴尬场景?

2023年微信月活用户已超过13.1亿&#xff0c;而小程序也成为了一个神奇的窗口。透过这个窗口&#xff0c;越来越多的人发现了微信生态内的巨大商机&#xff0c;通过小程序也涌现出许多新颖的玩法。 智能名片小程序&#xff0c;基于微信与 AI 技术开发&#xff0c;将企业名片系…

强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE 算法

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应…

MKS SERVO4257D 闭环步进电机_系列6 串口(RS485)通讯示例

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&a…

CAR-T药物|疗法适应症|市场销售-上市药品前景分析

对患有癌症的人来说&#xff0c;能够幸运地度过5年大关是一种成功&#xff0c;而能够成功地度过10年大关则是一种奇迹。Emily作为全球第一个接受CAR-T治疗成功的白血病儿童患者&#xff0c;至今已成功摆脱癌症11年之久。 ①CAR-T细胞治疗&#xff08;Emily Whitehead治疗案例时…

Benewake(北醒) 中距 TF40 40m介绍以及资料整理

目录 1 前言2 产品介绍3 产品快速测试3.1 产品规格书及使用说明书3.2 通用上位机测试说明3.3 通用指令串口助手使用说明3.4 产品快速测试说明 4 基于开源硬件的运用整理4.1 在开源Arduino上的运用 1 前言 本文包含【Benewake(北醒) 】中距 TF40 40m介绍以及资料整理 详细请参考…

Arduino软件+ ESP8266 MCU开发项目之一键式配网操作(有掉电保护),可继续开发成为--WIFI放大器项目。

下载本次ESP8266 MCU开发项目之一键式配网 代码文件 (11条消息) 配网ESP8266MUC.rar资源-CSDN文库 流程图讲解 视频展示效果 配网ESP8266 项目可待 改进/升级 的地方 1&#xff1a;配网流程UI界面单调&#xff0c;可搭配复杂UI配网界面 2&#xff1a;配网流程可看作是WIFI放…

NSS周常刷密码(2)

[GWCTF 2019]babyRSA 解答过程在脚本内 from Crypto.Util.number import * import gmpy2 import sympy import z3e 0x10001 N63658514959457474690903016018269086622290925646484729178300065183722792133723789965128794359777327094438403485892529574488072710160684141…