制作7Z格式可安装程序包
引言:
现在制作自解压安装包主要有两种方式,一种是通过rar方式制作,另一种是通过7Z格式制作。因rar是收费的,所以使用7Z来制作自解压安装包。
具体代码如下:
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZMethod;
import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;/*** 制作exe.*/
public class MakeSfx {/*** 主入口.** @param args args* @throws IOException IOException*/public static void main(final String[] args) throws IOException {final MakeSfx makeSfx = new MakeSfx();File orgFile = null;//exe包所在路径final File directory = new File(new File("path").getAbsolutePath());for (File file : directory.listFiles()) {//找到目标exe文件if (file.getName().endsWith("exe")) {orgFile = file;System.out.println("对文件" + file.getAbsoluteFile() + "进行打包。");break;}}
// orgFile = new File("E:\\Test\\all\\143\\YG-RPA 4.0.1.9.1ALL(内部版本).exe");if (null == orgFile) {System.out.println("该文件夹没有找到包含“YG-RPA”的exe文件。");return;}final File zipFile = makeSfx.customizeRobotGen7z(orgFile);makeSfx.customizeRobotGenExe(zipFile);makeSfx.delay();FileUtils.forceDelete(zipFile);}/*** 延时.*/private void delay() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}/*** 定制机器人,添加新增授权.exe,license压缩成7z文件.** @param exeFile jar包* @return 7z文件* @throws IOException IOException*/private File customizeRobotGen7z(final File exeFile)throws IOException {System.out.println("开始生成7zip压缩包");//生成7Z包的路径final File compress7z = new File("path" + File.separator+ exeFile.getName().substring(0, exeFile.getName().lastIndexOf(".")) + ".7z");if (!compress7z.exists()) {FileUtils.forceMkdirParent(compress7z);compress7z.createNewFile();}final SevenZOutputFile outArchive = new SevenZOutputFile(compress7z);//新改动,压缩方式选择COPYoutArchive.setContentCompression(SevenZMethod.COPY);final SevenZArchiveEntry entryJar = new SevenZArchiveEntry();entryJar.setName(exeFile.getName());outArchive.putArchiveEntry(entryJar);final BufferedInputStream in = new BufferedInputStream(new FileInputStream(exeFile));final int bufSize = 1024;final byte[] buffer = new byte[bufSize];int len = 0;while (-1 != (len = in.read(buffer, 0, bufSize))) {outArchive.write(buffer, 0, len);}outArchive.closeArchiveEntry();IOUtils.closeQuietly(outArchive);System.out.println("生成7zip压缩包完成。");return compress7z;}/*** 机器人7z文件制作成可自解压的exe文件(7z方案).** @param compress7z 7z文件* @return exe文件大小* @throws IOException IOException*/private long customizeRobotGenExe(final File compress7z)throws IOException {System.out.println("开始生成exe");final String exeName = compress7z.getName().substring(0, compress7z.getName().lastIndexOf(".")) + "1" + ".exe";final File configFile = createConfig(exeName);InputStream is7zSD = null;InputStream isConfig = null;File robotExe = null;SeekableByteChannel robotExeSbc = null;SeekableByteChannel z7Sbc = null;try {is7zSD = new FileInputStream(new File("path\\7zSD.sfx"));isConfig = new FileInputStream("config.txt");
// isConfig = this.getClass().getResourceAsStream("/" + this.getClass().getName() + "/config.txt");robotExe = new File("path\\" + exeName);if (!robotExe.exists()) {robotExe.createNewFile();}FileUtils.writeByteArrayToFile(robotExe, IOUtils.toByteArray(is7zSD));FileUtils.writeByteArrayToFile(robotExe, IOUtils.toByteArray(isConfig), true);// 改动,考虑到jar可能比较大,不再采用FileUtils.writeByteArrayToFile方法robotExeSbc = Files.newByteChannel(robotExe.toPath(), StandardOpenOption.APPEND);z7Sbc = Files.newByteChannel(compress7z.toPath(), StandardOpenOption.READ);final ByteBuffer z7Bf = ByteBuffer.allocate(1024);while ((z7Sbc.read(z7Bf)) > 0) {z7Bf.flip();robotExeSbc.write(z7Bf);z7Bf.clear();}} finally {IOUtils.closeQuietly(is7zSD, isConfig, z7Sbc, robotExeSbc);}delay();FileUtils.forceDelete(configFile);System.out.println("生成exe完成");return FileUtils.sizeOf(robotExe);}/*** 创建配置文件.** @param exeName exeName* @return 配置文件* @throws IOException IOException*/private File createConfig(final String exeName) throws IOException {final File configFile = new File("config.txt");if (!configFile.exists()) {configFile.createNewFile();System.err.println(configFile.getAbsolutePath() + "已创建!");}final RandomAccessFile randomAccessFile = new RandomAccessFile(configFile, "rw");randomAccessFile.write((";!@Install@!UTF-8!\r\n"+ "Title=\"安装\"\r\n"+ "RunProgram=\"" + exeName + " /T:%%T\"\r\n"+ ";!@InstallEnd@!").getBytes("UTF-8"));if (randomAccessFile != null) {try {randomAccessFile.close();} catch (IOException e2) {e2.printStackTrace();}}return configFile;}}
制作7Z格式可安装程序包相关推荐
- 关于msi格式的程序包的安装
关于msi格式的程序包的安装 最近几天安装msi格式的程序包时,会报错.然后想了一下,想试一试利用命令行的方式: 首先以管理员身份打开命令提示符(直接右键win图标你就会看到的~) 输入如下指令: m ...
- SpringBoot 项目打成可安装程序包
SpringBoot 项目打成可安装程序包 前言 准备 准备工作 开始 前言 近期做了一个前后端合并的spring boot项目,但是要求达成exe文件,提供给不懂电脑的小白安装使用,就去研究了半天, ...
- 程序包管理rpm、yum与简单编译安装程序
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
- 2018-3-24Linux系统管理(13)程序包管理(3)yum前端配置及编译
我们在这一章当中继续讲述yum命令,而后我们简单讲述一下源代码安装包的编译及使用. 一.yum的命令行选项 我们在yum的配置文件中,一旦gpgckeck=1时,就意味着我们安装程序包时,必须要检查g ...
- Linux学习笔记:rpm程序包管理
以CentOS为例,rpm程序包管理器的相关内容如下: CentOS的程序包管理器: 程序包的命名规则: 源代码包: software_name-VER ...
- C# 批处理制作静默安装程序包
使用批处理+WinRAR制作静默安装程序包 @echo 安装完窗口会自动关闭!!! @echo off start /wait Lync.exe /Install /Silent start /wai ...
- 云开发表情包制作神器微信小程序源码下载,支持各种自定义
该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...
- 【小程序源码】云开发表情包制作神器微信小程序源码下载,支持各种自定义
该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...
- 小程序源码:云开发表情包制作神器微信小程序
该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...
最新文章
- 微博:推动世界的力量(第2版)
- DPDK 应用层对网卡进行配置(二十四)
- value proposition canvas
- Tensorflow2.x.x全卷积神经网络(CNN)
- Qt 清空QPixMap
- OpenGL framebuffer 帧缓冲区的实例
- Flask扩展系列(八)–用户会话管理
- 前端学习(2691):重读vue电商网站12之获取选中节点的keys:
- 懒汉式(线程安全,同步代码块儿)
- android开发适配深色模式,手机不支持深色模式,如何用软件解决深色模式的问题?(附有系统全局深色模式实现方法...
- linux文件操作命令介绍(一)
- [Linux][Ubuntu][14.04.3LTS]安装NVidia显卡驱动
- 使用Intent Filter来响应隐式Intent
- Python 根据图片url,批量下载图片
- 将日期格式格式化为XXXX/XX/XX
- 四性检测功能在档案系统中的实现
- 中国互联网20年简史(1998-2018),告诉你本质是什么、规律是什么
- 嵌入式开发有年龄限制吗_32岁入门晚不晚?来听听这位70后程序员的故事
- pyqt5 失焦 监听无操作 定时器
- 同城聚合平台v59.4.0 本地同城 同城信息 同城商家