当前位置: 首页 > news >正文

将Java程序打包成EXE程序

Java制作可执行jar

方式一:mainClass与lib分离

1)将Java程序依赖的所有jar都拷贝在lib目录下,并添加到classpath中
2)运行时指定MainClass

pom.xml

这个pom.xml生成的jar可双击直接运行,但是因为没有将其依赖的jar都打包在一起,因此用到其他jar的时候会报错,可通过脚本将其他jar添加到环境变量,以脚本启动。

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.studio</groupId><artifactId>GenLicense</artifactId><version>1.0</version><properties><java.version>1.8</java.version><!-- 工具类相关 --><hutool.version>5.8.23</hutool.version><!-- Maven 相关 --><maven.compiler.source>${java.version}</maven.compiler.source><maven.compiler.target>${java.version}</maven.compiler.target><maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version><maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version><git-build-hook-maven-plugin.version>3.4.1</git-build-hook-maven-plugin.version><!-- 项目编码相关 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>cn.com.infosec</groupId><artifactId>licence</artifactId><scope>system</scope><version>1.0</version><systemPath>${basedir}/lib/licence.jar</systemPath></dependency><dependency><groupId>com.formdev</groupId><artifactId>flatlaf</artifactId><version>3.4.1</version></dependency></dependencies><build><plugins><!-- 打包时跳过测试 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>${maven-surefire-plugin.version}</version><configuration><skip>true</skip></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><addClasspath>true</addClasspath><mainClass>com.studio.MainFrame</mainClass></manifest></archive></configuration></plugin></plugins><resources><resource><directory>src/main/resources</directory><includes><include>**/*</include></includes></resource></resources></build>
</project>

在这里插入图片描述
在这里插入图片描述

bat脚本

@echo off
title GenLicenseSetLocal EnableDelayedExpansion
set JAVA_HOME="./jdk1.8.0_144"set PATH=%JAVA_HOME%\bin;%PATH%set CLASSPATH="%CLASSPATH%;.;./lib/*;"echo %CLASSPATH% rem 启动Java服务%JAVA_HOME%\bin\java com.studio.MainFrameEndLocal
pause

在这里插入图片描述

方法二:使用SpringBoot插件将所有依赖都打入同一个jar包

pom.xml

 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.18</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions><configuration><mainClass>com.studio.MainFrame</mainClass><includeSystemScope>true</includeSystemScope></configuration></plugin>

在这里插入图片描述
在这里插入图片描述

exe4j生成EXE

注:需要先将exe4j激活,否则生成的exe运行时会多弹出一个框。

https://exe4j.apponic.com/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:
1)上述生成exe并运行,本质原理是<Java制作可执行jar的方法一>,方法二不行,因为SpringBoot打出来的jar没有指定mainClass的地方。
2)使用exe4j生成的exe可以直接运行,但需要依赖JDK环境,在search sequence步骤,jdk要以相对路径填入,exe4j并不会将jdk打包,我们借助inno setup将jdk打包到相对路径的位置。

Inno Setup将JDK打入安装包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Inno打包脚本.iss

; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!#define MyAppName "License生成器"
#define MyAppVersion "1.0"
#define MyAppPublisher "我的公司"
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "GenLicense.exe"[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (若要生成新的 GUID,可在菜单中点击 "工具|生成 GUID")
AppId={{C6B0667C-0C65-49E7-BEC4-30458967D645}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
; 以下行取消注释,以在非管理安装模式下运行(仅为当前用户安装)。
;PrivilegesRequired=lowest
OutputDir=./output2
OutputBaseFilename=GenLicense
SetupIconFile=./icon.ico
Compression=lzma
SolidCompression=yes
WizardStyle=modern[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked[Files]
Source: "E:\Exe4j\output\GenLicense.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\user\Desktop\GenLicense\多jar包运行\jdk1.8.0_144\*"; DestDir: "{app}\jdk"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

注意

1)exe4j生成可执行exe时,需要指定EXE运行时JDK的相对路径
2)inno打包时,JDK需要拷贝到相对路径的位置

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【云原生安全篇】一文掌握Harbor集成Trivy应用实践
  • 重头开始嵌入式第四十一天(数据结构 树 哈希表)
  • 【图像拼接】基于SIFT/SURF特征算法的图像拼接,matlab实现
  • 图分类!!!
  • Linux——应用层自定义协议与序列化
  • uniapp中使用picker-view选择时间
  • HTTP 协议格式大揭秘:Fiddler 助阵,网络交互全掌握!
  • 如何使用 Python 发送带附件的电子邮件
  • 阿里云AI基础设施全面升级,模型算力利用率提升超20%
  • html 与 md 文件数据格式转换
  • Java反序列化利用链篇 | URLDNS链
  • 现代前端构建工具对比:Vue CLI、Webpack 和 Vite
  • C++【类和对象】(一)
  • Linux实用操作
  • OpenCV库学习之cv2.VideoWriter(函数)
  • ESLint简单操作
  • gitlab-ci配置详解(一)
  • JavaScript异步流程控制的前世今生
  • overflow: hidden IE7无效
  • Spring核心 Bean的高级装配
  • Vue全家桶实现一个Web App
  • 产品三维模型在线预览
  • 飞驰在Mesos的涡轮引擎上
  • 给第三方使用接口的 URL 签名实现
  • 关于使用markdown的方法(引自CSDN教程)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #QT项目实战(天气预报)
  • (10)ATF MMU转换表
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (规划)24届春招和25届暑假实习路线准备规划
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (七)Activiti-modeler中文支持
  • (四) 虚拟摄像头vivi体验
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)为C# Windows服务添加安装程序
  • (转)原始图像数据和PDF中的图像数据
  • .net core 6 集成和使用 mongodb
  • .net dataexcel winform控件 更新 日志
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET Micro Framework初体验
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .netcore 获取appsettings
  • .net分布式压力测试工具(Beetle.DT)
  • .NET框架
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ::什么意思