如何将 Java代码打包成 EXE 可安装执行软件

一、简介

Java构建产物Jar包在类Unix系统中可以快速部署运行。但是当服务器环境是 Windows ,该如何快速、图形化、傻瓜式地部署?

二、构建最小运行环境JRE

  • SpringBoot使用了3.0或者3.0以上,开始最低支持JDK17。
  • 使用 JRE 运行 java jar程序,减少最终安装包的体积。
  • 下载 Windows架构的JDK压缩文件

  • 使用 MacOS 下的Jlink构建Windows下可运行的 JRE

export JAVA_HOME=~/Downloads/jdk-17.0.7
export PATH=$JAVA_HOME/bin:$PATH

# 使用jlink构建适用于Windows的JRE
jlink --module-path $JAVA_HOME/jmods:~/Downloads/jdk-17.0.7/jmods \
      --add-modules java.base,java.logging,java.naming,java.desktop,java.management,java.instrument,java.sql,java.security.jgss \
      --output ./windows-jre17-0-7

三、构建包含所有依赖的 Jar

使用 Maven 的构建插件 maven-assembly-plugin将所有依赖都解压打包到构建产物中;

<project>
         .....
     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.7.1</version>
                <configuration>
                    <archive>
                        <manifest>
                              <!-- 填写主类 -->
                            <mainClass>org.example.Application</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <!-- 有内置的DescriptorRef:
                                                                bin: 类似于默认打包,会将bin目录下的文件打到包中
                                                                jar-with-dependencies: 会将所有依赖都解压打包到构建产物中
                                                                src: 只将源码目录下的文件打包
                                                                project: 将整个project资源打包
                                                -->
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <!-- 绑定到package生命周期阶段上 -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
mvn clean package

bulid完成后, 在target文件夹下可以找到带 jar-with-dependencies后缀的包。

查看构建好的Jar包中文件:tar -tvf jar包

四、exe4j构建可执行exe

下载地址:https://www.ej-technologies.com/download/exe4j/files

exe4j安装配置

  • exe4有Windows、MacOS、Linux环境的安装包,故安装过程省略。本章节默认在 MacOS环境下操作,exe4j安装在/opt/exe4j9/路径下
  • exe4j配置可通过图形化界面进行设置,也可以直接通过配置文件进行操作。新手建议直接通过图形化界面(/opt/exe4j9/bin/exe4j9.app)进行配置

exe4j操作关键点

  • exe4j构建的Jave EXE可运行文件,点击 exe文件即可运行。由于是 Java应用程序,需要JDK或 JRE 运行环境。故而需要第五步骤的 Inno Setup将 JRE 集成到最终的exe安装运行文件中

exe4j配置文件释义

  • 配置文件默认在Java项目根目录

demoj2e.exe4j

<?xml version="1.0" encoding="UTF-8"?>
<!-- version指定使用的 exe4j 版本。transformSequenceNumber指定转换序列号,通常用于标识配置的版本或更新。 -->
<exe4j version="9.0" transformSequenceNumber="3">

  <!-- 设置当前目录为配置的基础目录。 -->
  <directoryPresets config="." />

  <!-- name指定应用程序名称。 distributionSourceDir 指定工作路径为当前目录。 -->
  <application name="demoj2e" distributionSourceDir="." />

    <!-- name指定可执行文件名称
       executableDir指定可执行文件所在目录,当前目录
             wrapperType指定嵌入类型,表示将 JVM 嵌入到可执行文件中
       redirectStderr、redirectStdout指定是否将标准输出、标准错误输出到文件
       stderrFile、stdoutFile指定标准输出、标准错误输出写入文件的路径。可使用相对路径,相对路径为可执行程序文件路径。
       stderrMode、stdoutMode指定标准输出、标准错误输出写入文件的方式。append表示追加,overwrite表示追加覆盖
       executableMode指定可执行文件的执行方式,可选 console 
       singleInstance指定运行模式为单实例模式、
       globalSingleInstance指定运行模式为全局单实例模式,确保系统中只有一个实例运行。 -->
  <executable name="demoj2e" 
    wrapperType="embed"
    executableMode="gui"
    singleInstance="true"
    executableDir="."
    globalSingleInstance="true"
    redirectStderr="true" 
    redirectStdout="true"
    stderrFile=".\logs\demoj2e_stderr.log" 
    stdoutFile=".\logs\demoj2e_stdout.log" 
    stderrMode="append" 
    stdoutMode="append"
  />
  <!-- mainClass指定Java程序的主类,
       vmParameters设置传递给JVM的参数,其中参数设置文件编码为 UTF-8。
       minVersion指定最低 JVM 版本要求为1.8 -->
  <java mainClass="org.example.Application" vmParameters="-Dfile.encoding=utf-8" minVersion="1.8">
    <!-- searchSequence指定JVM搜索顺序 -->
    <searchSequence>
      <directory location="./windows-jre17-0-7" />
    </searchSequence>
    <!-- classPath指定类路径 -->
    <classPath>
      <!--  location指定 jar 文件的路径,failOnError设置如果找不到指定的 jar 文件,不会失败。-->
      <archive location="./target/demoj2e-1.0-SNAPSHOT-jar-with-dependencies.jar" failOnError="false" />
    </classPath>
  </java>
</exe4j>
/opt/exe4j9/bin/exe4jc demoj2e.exe4j

此时只要将 demoj2e.exe和windows-jre17-0-7复制Windows的同级目录下,点击 exe文件即可运行。

但是预设实际情况目标 Windows 主机不会预装Java JDK或 JRE运行环境。同时希望用户点击 exe 后一步一步地在图形化界面下将整个程序安装设置完。这就需要第五步,将 JRE、exe文件集成到一起,再套一个有图形化安装步骤的 EXE 程序壳。

五、Inno Setup整合套壳

官网地址:https://jrsoftware.org

Github:https://github.com/jrsoftware/issrc

示例配置:https://github.com/jrsoftware/issrc/tree/main/Examples

文档:https://jrsoftware.org/ishelp/

  • Inno Setup安装配置
    • Inno Setup只有 Windows 安装包。没有类unix安装包。所以只能在 Windows 环境下操作exe集成 jre及套壳动作
    • 在 Windows 下的安装过程省略,安装路径默认C:\"Program Files (x86)"\"Inno Setup 6"
    • Inno Setup使用Inno Setup compiler图形化编辑器操作。但是也可以通过命令行直接操作。新手推荐在图形化编辑器中操作
    • 示例配置文件:C:\Program Files (x86)\Inno Setup 6\Examples
    • 配置指令说明书文件路径:C:\Program Files (x86)\Inno Setup 6\ISetup.chm
  • Inno Setup操作关键点
    • 给 exe 可执行程序套一个通用的图形化安装程序
    • 通过添加Files指令块将JRE集成到图形化安装程序过程中
  • 以下操作及资源文件默认为在 Windows 当前用户桌面下完成,所需文件:
    • 第二章节构建的 Windows 下最小化JRE
    • 第四章节exe4j步骤产生的exe可执行文件
    • Inno Setup配置文件

使用Inno Setup compiler加载配置文件: demoj2e.iss

; 设置变量

#define MyAppName "demoj2e"
#define MyAppVersion "1.5"
#define MyAppExeName "demoj2e.exe"
#define MyJreName "windows-jre17-0-7" 
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "https://www.example.com/"
#define MyAppAssocName MyAppName + " File"
#define MyAppAssocExt ".myp"
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt


[Setup]             ; 设置安装程序的基本信息
AppId={{F8D6C745-BAC5-4B86-82F8-0D95FBE28B68}}        ; 应用程序的唯一标识符(通常是 GUID)    
AppName={#MyAppName}                                                            ; 应用程序名称
AppVersion={#MyAppVersion}                                                ; 应用程序版本
AppPublisher={#MyAppPublisher}                                        ; 应用程序的发布者名称
AppPublisherURL={#MyAppURL}                                                ; 应用程序发布者的URL
AppSupportURL={#MyAppURL}                                                    ; 应用程序支持的URL
AppUpdatesURL={#MyAppURL}                                                    ; 应用程序更新的URL
DefaultDirName={autopf}\Demoj2e                   ; 默认安装目录。autopf内置变量路径C:\Program Files (x86)
DisableProgramGroupPage=yes                                                ; 是否禁用程序组选择页面(默认是 no)。
OutputDir=.\output                                                                ; 编译后安装程序的输出目录
OutputBaseFilename={#MyAppName}-installer                 ; 编译后输出文件的基本文件名
Compression=lzma                                                                    ; 压缩算法,常见值有lzma、zip
SolidCompression=yes                                                            ; 是否启用固实压缩(可以提高压缩比)
WizardStyle=modern                                                                ; 安装向导风格(classic、modern)
PrivilegesRequired=admin                                                    ; 安装所需的权限级别(none、poweruser、admin、lowest)。
; AllowNoIcons:是否允许不创建快捷方式(默认是 yes)。
; AlwaysRestart:是否始终在安装结束后重新启动(默认是 no)。
; PrivilegesRequiredOverridesAllowed:允许覆盖所需权限级别的条件。
; DisableDirPage:是否禁用目录选择页面(默认是 no)。
; DisableProgramGroupPage:是否禁用程序组选择页面(默认是 no)。
; CreateAppDir:是否创建应用程序目录(默认是 yes)。
; 用户界面和体验
; WizardStyle:向导风格(classic、modern)。
; WindowVisible:安装时窗口是否可见(默认是 yes)。
; ShowLanguageDialog:是否显示语言选择对话框(默认是 no)。
; ShowTasksTreeLines:是否显示任务树的线条(默认是 yes)。
; ShowUndisplayableLanguages:是否显示不可用的语言(默认是 no)。
; LanguageDetectionMethod:语言检测方法(uilanguage、locale)。
; 安全和压缩
; SignTool:签名工具的路径。
; SignToolParameters:签名工具的参数。
; SignedUninstaller:卸载程序是否签名(默认是 no)。
; UsePreviousAppDir:是否使用之前的应用程序目录(默认是 yes)。
; UsePreviousGroup:是否使用之前的程序组(默认是 yes)。
; UsePreviousTasks:是否使用之前的任务(默认是 yes)。
; UsePreviousSetupType:是否使用之前的安装类型(默认是 yes)。
; 日志和错误处理
; CreateUninstallRegKey:是否创建卸载注册表键(默认是 yes)。
; UninstallDisplayName:卸载程序在"程序和功能"中显示的名称。
; UninstallFilesDir:卸载程序文件的目录。
; UninstallDisplayIcon:卸载程序显示的图标。
; UninstallRestartComputer:卸载后是否重新启动计算机(默认是 no)。
; OutputManifestFile:输出清单文件的路径。
; LogMode:日志模式(append、overwrite、new)

[Languages] ;定义安装程序支持的语言。
Name: cn; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
Name: en; MessagesFile: "compiler:Default.isl"

[Messages]
cn.BeveledLabel = 中文
en.BeveledLabel = 英文

[CustomMessages]
cn.msgInstallMySQL = 安装 MySQL
en.msgInstallMySQL = Install MySQL

[Dirs]
Name: "{app}\logs"

[Files]            ;定义需要安装复制的文件。
; Source指源文件路径。DestDir指目标目录,{app}表示安装目录
; Flags设置文件复制选项:ignoreversion(忽略版本,NFS类似共享文件系统不能设置),recursesubdirs(递归子目录),createallsubdirs(0创建所有子目录)
Source: ".\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: ".\{#MyJreName}\*"; DestDir: "{app}\{#MyJreName}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Registry]        ;定义需要添加的注册表项
; Root:根注册表项
; Subkey:子项。
; ValueType:值类型(如 string、dword)
; ValueName:值名称
; ValueData:值数据
; Flags:标志, uninsdeletekey 表示卸载时删除键。
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: ""

[Icons]            ;定义创建的快捷方式。
; Name设置快捷方式名称, {group} 表示开始菜单组, {commondesktop} 表示公共桌面。
; Filename设置快捷方式指向的文件
; Tasks设置用于条件创建快捷方式的任务名称。
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Tasks] ;定义用户可以选择的任务。
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Run]            ;定义安装过程中和安装后的运行命令
; Filename设置要运行的文件路径。Description设置描述信息。
; Flags设置运行选项: 
;     runhidden: 隐藏运行程序
;     runminimized: 最小化运行程序
;     runmaximized: 最大化运行程序
;     waituntilterminated: 等待程序终止后再继续安装或卸载过程
;     nowait: 不等待程序终止,立即继续安装或卸载过程
;     postinstall: 仅在安装成功后运行程序
;     skipifdoesntexist: 如果程序文件不存在,则跳过运行
;     shellexec: 使用 ShellExecute API 运行程序(通常用于运行外部文件或 URL)
;     unchecked: 如果程序运行失败,不会显示错误消息
;     32bit: 在 32 位模式下运行程序(仅在 64 位 Windows 上可用)
;     64bit: 在 64 位模式下运行程序(仅在 64 位 Windows 上可用)
;     runascurrentuser: 用于在提升权限的安装程序中以当前用户身份运行程序,而不是以提升的管理员权限运行。
;     runasoriginaluser: 以原始用户身份运行程序(在提升权限的安装程序中常用)
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent

[UninstallDelete]    ;指定在卸载时的操作
; Type为filesandordirs时则删除目录及其所有内容
; Type为dirifempty时则仅在目录为空时删除
Type: filesandordirs; Name: "{app}\logs"

命令行构建 exe 安装包

C:\"Program Files (x86)"\"Inno Setup 6"\ISCC.exe ~\Desktop\demoj2e.iss

附录一:Inno Setup安装MySQL示例

  • 静默安装 MySQL 8
  • 创建 MySQL 的系统服务
  • 重置root@localhost密码
#define MyAppName                      "mysql-8.4.2"
#define MYSQL_SERVICE                  "MySQL842"
#define MYSQL_VERSION                  "8.4.2"
#define MYSQL_PORT                     "3306"
#define MYSQL_PASSWD                   "M1y2S3Q_4L"
#define MYSQL_PACKAGE                  "mysql-8.4.2-winx64"
#define MYSQL_INSTALL_DIR              "mysql-8.4.2"
#define MYSQL_DATA_DIR                 MYSQL_INSTALL_DIR+"Data"

[Setup]
AppId={{131E7842-****-****-****-0E00A8B6EB8E}}
AppName={#MyAppName}
AppVersion={#MYSQL_VERSION}
DefaultDirName={autopf}\{#MyAppName}
ChangesAssociations=yes
DisableProgramGroupPage=yes
OutputDir=.
OutputBaseFilename={#MyAppName}-installer
Compression=lzma
SolidCompression=yes
WizardStyle=modern
ShowTasksTreeLines=yes
PrivilegesRequired=admin

[Dirs]
Name: "{app}\{#MYSQL_INSTALL_DIR}\data"

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: ".\{#MYSQL_PACKAGE}\*"; DestDir: "{app}\{#MYSQL_INSTALL_DIR}"; Flags: ignoreversion createallsubdirs recursesubdirs

[Run]
Filename: "{app}\{#MYSQL_INSTALL_DIR}\bin\mysqld.exe"; Parameters: " --initialize-insecure"; Flags: runascurrentuser runhidden
Filename: "{app}\{#MYSQL_INSTALL_DIR}\bin\mysqld.exe"; Parameters: " --install {#MYSQL_SERVICE}";  Flags: runascurrentuser runhidden
Filename: sc.exe; Parameters: " start {#MYSQL_SERVICE}"; AfterInstall: AfterInstallMySQL(); Flags: runascurrentuser runhidden

[UninstallDelete]
Type: filesandordirs; Name: "{app}\logs"

[Code]
function IsMySQLAppExists(): Boolean;
var
theMySQLApp: String;
begin
  theMySQLApp := ExpandConstant('{app}\{#MYSQL_INSTALL_DIR}') + '\bin\mysql.exe';
  Result := FileExists(theMySQLApp);
end;

procedure ResetMySQLPasswd();
var
theMySQLApp: String;
theMySQLParam: String;
theSQL: String;
theCommandParam: String;
theResultCode: Integer;
begin
  theMySQLApp := ExpandConstant('{app}\{#MYSQL_INSTALL_DIR}') + '\bin\mysql.exe';
  theMySQLParam := ' -P' + ExpandConstant('{#MYSQL_PORT}') + ' -uroot -e';
  theSQL := ' "alter user ''root''@''localhost'' identified by ''' + ExpandConstant('{#MYSQL_PASSWD}') + ''';"';
  theCommandParam := theMySQLParam + theSQL;
  if not Exec(theMySQLApp, theCommandParam, '', SW_HIDE, ewWaitUntilTerminated, theResultCode) then begin
    Log('reset passwd failed, result msg:' + SysErrorMessage(theResultCode));
  end;
end;

procedure AfterInstallMySQL();
begin
  if IsMySQLAppExists() then begin
    ResetMySQLPasswd();
  end;
end;

附录二:Inno Setup配置内置变量

  • {app}:目标安装目录
  • {win}:Windows 目录(通常是 C:\Windows
  • {sys}:系统目录(通常是 C:\Windows\System32
  • {src}:当前安装源目录
  • {pf}:程序文件目录(通常是 C:\Program Files
  • {autopf}:常量会自动根据安装程序的位数选择正确的路径。对于 32 位安装程序,将解析为 C:\Program Files (x86)。对于 64 位安装程序,将解析为 C:\Program Files
  • {cf}:公共文件目录(通常是 C:\Program Files\Common Files
  • {sd}:系统驱动器(通常是 C:\
  • {tmp}:临时目录
  • {localappdata}:本地应用数据目录(通常是 C:\Users\<username>\AppData\Local
  • {commonappdata}:所有用户的公共应用数据目录(通常是 C:\ProgramData
  • {userappdata}:当前用户的应用数据目录(通常是 C:\Users\<username>\AppData\Roaming
  • {userdocs}:当前用户的文档目录(通常是 C:\Users\<username>\Documents
  • {userdesktop}:当前用户的桌面目录(通常是 C:\Users\<username>\Desktop
  • {commondesktop}:所有用户的公共桌面目录(通常是 C:\Users\Public\Desktop
  • {userprograms}:当前用户的程序组目录(通常是 C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
  • {commonprograms}:所有用户的程序组目录(通常是 C:\ProgramData\Microsoft\Windows\Start Menu\Programs
  • {userstartmenu}:当前用户的开始菜单目录(通常是 C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu
  • {commonstartmenu}:所有用户的开始菜单目录(通常是 C:\ProgramData\Microsoft\Windows\Start Menu
  • {userstartup}:当前用户的启动目录(通常是 C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
  • {commonstartup}:所有用户的启动目录(通常是 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
  • {fonts}:系统字体目录(通常是 C:\Windows\Fonts
  • {param}:安装命令行参数

附录三、简体中文语言文件

....
[Languages]
Name: cn; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
Name: en; MessagesFile: "compiler:Default.isl"

[Messages]
cn.BeveledLabel = 中文
en.BeveledLabel = 英文

[CustomMessages]
cn.msgInstallMySQL = 安装 MySQL
en.msgInstallMySQL = Install MySQL

....

Inno Setup安装目录\Languages\ChineseSimplified.isl

[LangOptions]
LanguageName=简体中文

LanguageID=$0804

LanguageCodePage=936
; If the language you are translating to requires special font faces or
; sizes, uncomment any of the following entries and change them accordingly.
;DialogFontName=
;DialogFontSize=8
;WelcomeFontName=Verdana
;WelcomeFontSize=12
;TitleFontName=Arial
;TitleFontSize=29
;CopyrightFontName=Arial
;CopyrightFontSize=8

[Messages]

; *** 应用程序标题
SetupAppTitle=安装
SetupWindowTitle=安装 - %1
UninstallAppTitle=卸载
UninstallAppFullTitle=%1 卸载

; *** Misc. common
InformationTitle=信息
ConfirmTitle=确认
ErrorTitle=错误

; *** SetupLdr messages
SetupLdrStartupMessage=现在将安装 %1。您想要继续吗?
LdrCannotCreateTemp=无法创建临时文件。安装程序已中止
LdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止
HelpTextNote=

; *** 启动错误消息
LastErrorMessage=%1。%n%n错误 %2: %3
SetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。
SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。
SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。
InvalidParameter=无效的命令行参数:%n%n%1
SetupAlreadyRunning=安装程序正在运行。
WindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。
WindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。
NotOnThisPlatform=此程序不能在 %1 上运行。
OnlyOnThisPlatform=此程序只能在 %1 上运行。
OnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中:%n%n%1
WinVersionTooLowError=此程序需要 %1 版本 %2 或更高。
WinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。
AdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。
PowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。
SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。
UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。

; *** 启动问题
PrivilegesRequiredOverrideTitle=选择安装程序模式
PrivilegesRequiredOverrideInstruction=选择安装模式
PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。
PrivilegesRequiredOverrideText2=%1 只能为您安装,或为所有用户安装(需要管理员权限)。
PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A)
PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项)
PrivilegesRequiredOverrideCurrentUser=只为我安装(&M)
PrivilegesRequiredOverrideCurrentUserRecommended=只为我安装(&M) (建议选项)

; *** 其他错误
ErrorCreatingDir=安装程序无法创建目录“%1”
ErrorTooManyFilesInDir=无法在目录“%1”中创建文件,因为里面包含太多文件

; *** 安装程序公共消息
ExitSetupTitle=退出安装程序
ExitSetupMessage=安装程序尚未完成。如果现在退出,将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗?
AboutSetupMenuItem=关于安装程序(&A)...
AboutSetupTitle=关于安装程序
AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4
AboutSetupNote=
TranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址:https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation

; *** 按钮
ButtonBack=< 上一步(&B)
ButtonNext=下一步(&N) >
ButtonInstall=安装(&I)
ButtonOK=确定
ButtonCancel=取消
ButtonYes=是(&Y)
ButtonYesToAll=全是(&A)
ButtonNo=否(&N)
ButtonNoToAll=全否(&O)
ButtonFinish=完成(&F)
ButtonBrowse=浏览(&B)...
ButtonWizardBrowse=浏览(&R)...
ButtonNewFolder=新建文件夹(&M)

; *** “选择语言”对话框消息
SelectLanguageTitle=选择安装语言
SelectLanguageLabel=选择安装时使用的语言。

; *** 公共向导文字
ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。
BeveledLabel=
BrowseDialogTitle=浏览文件夹
BrowseDialogLabel=在下面的列表中选择一个文件夹,然后点击“确定”。
NewFolderName=新建文件夹

; *** “欢迎”向导页
WelcomeLabel1=欢迎使用 [name] 安装向导
WelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。

; *** “密码”向导页
WizardPassword=密码
PasswordLabel1=这个安装程序有密码保护。
PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。
PasswordEditLabel=密码(&P):
IncorrectPassword=您输入的密码不正确,请重新输入。

; *** “许可协议”向导页
WizardLicense=许可协议
LicenseLabel=请在继续安装前阅读以下重要信息。
LicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。
LicenseAccepted=我同意此协议(&A)
LicenseNotAccepted=我不同意此协议(&D)

; *** “信息”向导页
WizardInfoBefore=信息
InfoBeforeLabel=请在继续安装前阅读以下重要信息。
InfoBeforeClickLabel=准备好继续安装后,点击“下一步”。
WizardInfoAfter=信息
InfoAfterLabel=请在继续安装前阅读以下重要信息。
InfoAfterClickLabel=准备好继续安装后,点击“下一步”。

; *** “用户信息”向导页
WizardUserInfo=用户信息
UserInfoDesc=请输入您的信息。
UserInfoName=用户名(&U):
UserInfoOrg=组织(&O):
UserInfoSerial=序列号(&S):
UserInfoNameRequired=您必须输入用户名。

; *** “选择目标目录”向导页
WizardSelectDir=选择目标位置
SelectDirDesc=您想将 [name] 安装在哪里?
SelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。
SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。
DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。
DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。
CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。
CannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。
InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或UNC路径:%n%n\\server\share
InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。
DiskSpaceWarningTitle=磁盘空间不足
DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗?
DirNameTooLong=文件夹名称或路径太长。
InvalidDirName=文件夹名称无效。
BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1
DirExistsTitle=文件夹已存在
DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗?
DirDoesntExistTitle=文件夹不存在
DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗?

; *** “选择组件”向导页
WizardSelectComponents=选择组件
SelectComponentsDesc=您想安装哪些程序组件?
SelectComponentsLabel2=选中您想安装的组件;取消您不想安装的组件。然后点击“下一步”继续。
FullInstallation=完全安装
; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
CompactInstallation=简洁安装
CustomInstallation=自定义安装
NoUninstallWarningTitle=组件已存在
NoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中:%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗?
ComponentSize1=%1 KB
ComponentSize2=%1 MB
ComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。
ComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。

; *** “选择附加任务”向导页
WizardSelectTasks=选择附加任务
SelectTasksDesc=您想要安装程序执行哪些附加任务?
SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。

; *** “选择开始菜单文件夹”向导页
WizardSelectProgramGroup=选择开始菜单文件夹
SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式?
SelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。
SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。
MustEnterGroupName=您必须输入一个文件夹名。
GroupNameTooLong=文件夹名或路径太长。
InvalidGroupName=无效的文件夹名字。
BadGroupName=文件夹名不能包含下列任何字符:%n%n%1
NoProgramGroupCheck2=不创建开始菜单文件夹(&D)

; *** “准备安装”向导页
WizardReady=准备安装
ReadyLabel1=安装程序准备就绪,现在可以开始安装 [name] 到您的电脑。
ReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置,点击“上一步”。
ReadyLabel2b=点击“安装”继续此安装程序。
ReadyMemoUserInfo=用户信息:
ReadyMemoDir=目标位置:
ReadyMemoType=安装类型:
ReadyMemoComponents=已选择组件:
ReadyMemoGroup=开始菜单文件夹:
ReadyMemoTasks=附加任务:

; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
DownloadingLabel=正在下载附加文件...
ButtonStopDownload=停止下载(&S)
StopDownload=您确定要停止下载吗?
ErrorDownloadAborted=下载已中止
ErrorDownloadFailed=下载失败:%1 %2
ErrorDownloadSizeFailed=获取下载大小失败:%1 %2
ErrorFileHash1=校验文件哈希失败:%1
ErrorFileHash2=无效的文件哈希:预期 %1,实际 %2
ErrorProgress=无效的进度:%1 / %2
ErrorFileSize=文件大小错误:预期 %1,实际 %2

; *** “正在准备安装”向导页
WizardPreparing=正在准备安装
PreparingDesc=安装程序正在准备安装 [name] 到您的电脑。
PreviousInstallNotCompleted=先前的程序安装或卸载未完成,您需要重启您的电脑以完成。%n%n在重启电脑后,再次运行安装程序以完成 [name] 的安装。
CannotContinue=安装程序不能继续。请点击“取消”退出。
ApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。
ApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动这些应用程序。
CloseApplications=自动关闭应用程序(&A)
DontCloseApplications=不要关闭应用程序(&D)
ErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前,关闭所有在使用需要由安装程序更新的文件的应用程序。
PrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后,请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动?

; *** “正在安装”向导页
WizardInstalling=正在安装
InstallingLabel=安装程序正在安装 [name] 到您的电脑,请稍候。

; *** “安装完成”向导页
FinishedHeadingLabel=[name] 安装完成
FinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。
FinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。
ClickFinish=点击“完成”退出安装程序。
FinishedRestartLabel=为完成 [name] 的安装,安装程序必须重新启动您的电脑。要立即重启吗?
FinishedRestartMessage=为完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n要立即重启吗?
ShowReadmeCheck=是,我想查阅自述文件
YesRadio=是,立即重启电脑(&Y)
NoRadio=否,稍后重启电脑(&N)
; used for example as 'Run MyProg.exe'
RunEntryExec=运行 %1
; used for example as 'View Readme.txt'
RunEntryShellExec=查阅 %1

; *** “安装程序需要下一张磁盘”提示
ChangeDiskTitle=安装程序需要下一张磁盘
SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到,请输入正确的路径或点击“浏览”。
PathLabel=路径(&P):
FileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。
SelectDirectoryLabel=请指定下一张磁盘的位置。

; *** 安装状态消息
SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。
AbortRetryIgnoreSelectAction=选择操作
AbortRetryIgnoreRetry=重试(&T)
AbortRetryIgnoreIgnore=忽略错误并继续(&I)
AbortRetryIgnoreCancel=关闭安装程序

; *** 安装状态消息
StatusClosingApplications=正在关闭应用程序...
StatusCreateDirs=正在创建目录...
StatusExtractFiles=正在解压缩文件...
StatusCreateIcons=正在创建快捷方式...
StatusCreateIniEntries=正在创建 INI 条目...
StatusCreateRegistryEntries=正在创建注册表条目...
StatusRegisterFiles=正在注册文件...
StatusSavingUninstall=正在保存卸载信息...
StatusRunProgram=正在完成安装...
StatusRestartingApplications=正在重启应用程序...
StatusRollback=正在撤销更改...

; *** 其他错误
ErrorInternal2=内部错误:%1
ErrorFunctionFailedNoCode=%1 失败
ErrorFunctionFailed=%1 失败;错误代码 %2
ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2.%n%3
ErrorExecutingProgram=无法执行文件:%n%1

; *** 注册表错误
ErrorRegOpenKey=打开注册表项时出错:%n%1\%2
ErrorRegCreateKey=创建注册表项时出错:%n%1\%2
ErrorRegWriteKey=写入注册表项时出错:%n%1\%2

; *** INI 错误
ErrorIniEntry=在文件“%1”中创建 INI 条目时出错。

; *** 文件复制错误
FileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐)
FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐)
SourceIsCorrupted=源文件已损坏
SourceDoesntExist=源文件“%1”不存在
ExistingFileReadOnly2=无法替换现有文件,它是只读的。
ExistingFileReadOnlyRetry=移除只读属性并重试(&R)
ExistingFileReadOnlyKeepExisting=保留现有文件(&K)
ErrorReadingExistingDest=尝试读取现有文件时出错:
FileExistsSelectAction=选择操作
FileExists2=文件已经存在。
FileExistsOverwriteExisting=覆盖已存在的文件(&O)
FileExistsKeepExisting=保留现有的文件(&K)
FileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)
ExistingFileNewerSelectAction=选择操作
ExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。
ExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O)
ExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐)
ExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)
ErrorChangingAttr=尝试更改下列现有文件的属性时出错:
ErrorCreatingTemp=尝试在目标目录创建文件时出错:
ErrorReadingSource=尝试读取下列源文件时出错:
ErrorCopying=尝试复制下列文件时出错:
ErrorReplacingExistingFile=尝试替换现有文件时出错:
ErrorRestartReplace=重启并替换失败:
ErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错:
ErrorRegisterServer=无法注册 DLL/OCX:%1
ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1
ErrorRegisterTypeLib=无法注册类库:%1

; *** 卸载显示名字标记
; used for example as 'My Program (32-bit)'
UninstallDisplayNameMark=%1 (%2)
; used for example as 'My Program (32-bit, All users)'
UninstallDisplayNameMarks=%1 (%2, %3)
UninstallDisplayNameMark32Bit=32 位
UninstallDisplayNameMark64Bit=64 位
UninstallDisplayNameMarkAllUsers=所有用户
UninstallDisplayNameMarkCurrentUser=当前用户

; *** 安装后错误
ErrorOpeningReadme=尝试打开自述文件时出错。
ErrorRestartingComputer=安装程序无法重启电脑,请手动重启。

; *** 卸载消息
UninstallNotFound=文件“%1”不存在。无法卸载。
UninstallOpenError=文件“%1”不能被打开。无法卸载。
UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载
UninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1)
ConfirmUninstall=您确认要完全移除 %1 及其所有组件吗?
UninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。
OnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。
UninstallStatusLabel=正在从您的电脑中移除 %1,请稍候。
UninstalledAll=已顺利从您的电脑中移除 %1。
UninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除,但您可以手动删除它们。
UninstalledAndNeedsRestart=为完成 %1 的卸载,需要重启您的电脑。%n%n立即重启电脑吗?
UninstallDataCorrupted=文件“%1”已损坏。无法卸载

; *** 卸载状态消息
ConfirmDeleteSharedFileTitle=删除共享的文件吗?
ConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗?%n%n如果删除这些文件,但仍有程序在使用这些文件,则这些程序可能出现异常。如果您不能确定,请选择“否”,在系统中保留这些文件以免引发问题。
SharedFileNameLabel=文件名:
SharedFileLocationLabel=位置:
WizardUninstalling=卸载状态
StatusUninstalling=正在卸载 %1...

; *** Shutdown block reasons
ShutdownBlockReasonInstallingApp=正在安装 %1。
ShutdownBlockReasonUninstallingApp=正在卸载 %1。

; The custom messages below aren't used by Setup itself, but if you make
; use of them in your scripts, you'll want to translate them.

[CustomMessages]

NameAndVersion=%1 版本 %2
AdditionalIcons=附加快捷方式:
CreateDesktopIcon=创建桌面快捷方式(&D)
CreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q)
ProgramOnTheWeb=%1 网站
UninstallProgram=卸载 %1
LaunchProgram=运行 %1
AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A)
AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联...
AutoStartProgramGroupDescription=启动:
AutoStartProgram=自动启动 %1
AddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗?

参考

Copyright Curiouser all right reserved,powered by Gitbook该文件最后修改时间: 2025-01-14 17:10:53

results matching ""

    No results matching ""