引言:

现在制作自解压安装包主要有两种方式,一种是通过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格式可安装程序包相关推荐

  1. 关于msi格式的程序包的安装

    关于msi格式的程序包的安装 最近几天安装msi格式的程序包时,会报错.然后想了一下,想试一试利用命令行的方式: 首先以管理员身份打开命令提示符(直接右键win图标你就会看到的~) 输入如下指令: m ...

  2. SpringBoot 项目打成可安装程序包

    SpringBoot 项目打成可安装程序包 前言 准备 准备工作 开始 前言 近期做了一个前后端合并的spring boot项目,但是要求达成exe文件,提供给不懂电脑的小白安装使用,就去研究了半天, ...

  3. 程序包管理rpm、yum与简单编译安装程序

    Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...

  4. 2018-3-24Linux系统管理(13)程序包管理(3)yum前端配置及编译

    我们在这一章当中继续讲述yum命令,而后我们简单讲述一下源代码安装包的编译及使用. 一.yum的命令行选项 我们在yum的配置文件中,一旦gpgckeck=1时,就意味着我们安装程序包时,必须要检查g ...

  5. Linux学习笔记:rpm程序包管理

    以CentOS为例,rpm程序包管理器的相关内容如下: CentOS的程序包管理器:     程序包的命名规则:         源代码包:             software_name-VER ...

  6. C# 批处理制作静默安装程序包

    使用批处理+WinRAR制作静默安装程序包 @echo 安装完窗口会自动关闭!!! @echo off start /wait Lync.exe /Install /Silent start /wai ...

  7. 云开发表情包制作神器微信小程序源码下载,支持各种自定义

    该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...

  8. 【小程序源码】云开发表情包制作神器微信小程序源码下载,支持各种自定义

    该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...

  9. 小程序源码:云开发表情包制作神器微信小程序

    该款小程序是一个表情包制作 内容毕竟丰富,另外自定义制作方面也是特别的自由 支持自主上传图片,自定义文章,另外拥有多种素材模板以供选择 这是一款云开发的小程序,但是安装还是挺简单的 搭建教程: 首先使 ...

最新文章

  1. 微博:推动世界的力量(第2版)
  2. DPDK 应用层对网卡进行配置(二十四)
  3. value proposition canvas
  4. Tensorflow2.x.x全卷积神经网络(CNN)
  5. Qt 清空QPixMap
  6. OpenGL framebuffer 帧缓冲区的实例
  7. Flask扩展系列(八)–用户会话管理
  8. 前端学习(2691):重读vue电商网站12之获取选中节点的keys:
  9. 懒汉式(线程安全,同步代码块儿)
  10. android开发适配深色模式,手机不支持深色模式,如何用软件解决深色模式的问题?(附有系统全局深色模式实现方法...
  11. linux文件操作命令介绍(一)
  12. [Linux][Ubuntu][14.04.3LTS]安装NVidia显卡驱动
  13. 使用Intent Filter来响应隐式Intent
  14. Python 根据图片url,批量下载图片
  15. 将日期格式格式化为XXXX/XX/XX
  16. 四性检测功能在档案系统中的实现
  17. 中国互联网20年简史(1998-2018),告诉你本质是什么、规律是什么
  18. 嵌入式开发有年龄限制吗_32岁入门晚不晚?来听听这位70后程序员的故事
  19. pyqt5 失焦 监听无操作 定时器
  20. 同城聚合平台v59.4.0 本地同城 同城信息 同城商家

热门文章

  1. 【人工智能学习笔记】初识人工智能
  2. SQL Server数据库的管理及维护
  3. android 模拟自动点击,自动点击器(模拟点击)
  4. AD18导出BOM清单报错
  5. (10.1.3.2)浅谈扁平化设计—– keep it simple
  6. 喜欢听音乐的小伙伴看过来
  7. 云脉H5文档管理系统之文件管理的共享与协作
  8. HTML5验证表单内容是否为空
  9. python名片识别_基于Python的名片识别接口调用代码实例
  10. Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务