1、使用xjar对jar包进行加密
在项目的pom.xml中加入xjar的插件依赖,最好用2.x.x版本,高版本不支持-Dxjar.mode,无法免密码启动
github地址:xjar-maven-plugin
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
<configuration>
<targetJar>${project.build.finalName}-encrypted.jar</targetJar>
</configuration>
</execution>
</executions>
</plugin>
然后运行maven命令
mvn clean package -Dxjar.password=vOM73KJ6SACp9kql6lWGTXSt -Dxjar.mode=1
-Dxjar.password:xjar的加密秘钥
-Dxjar.mode:加密模式,0:普通模式 1:危险模式(免密码启动),一定要为1,否则用exe4j转成exe后将无法正常启动exe
2.使用exe4j+inno setup打包成exe应用程序
详细步骤见这位大佬的保姆级教程:Java jar打包成exe应用程序(超详细)
不过需要在exe4j的选择启动模式时选择Service,不知道选择其他启动模式可不可以,反正我是选择了Service
选择jar包的时候需要选择加密后的jia包,选择启动类的时候需要选择io.xjar.boot.XJarLauncher
然后在最后的inno setup的脚本文件里需要加上下面这段代码
[Code]
// 在安装过程中的不同步骤之间切换时被调用
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode: integer;
StartResultCode: integer;
Command: string;
begin
// 安装步骤已经完成,但安装程序还没有显示完成对话框
if CurStep = ssPostInstall then
begin
// 安装服务的命令
Command := 'sc create 服务名称 binPath= ' + ExpandConstant('{app}') + '\软件名称.exe start=auto DisplayName=服务名称';
Exec(ExpandConstant('{cmd}'), '/C ' + Command, '', 0, ewWaitUntilTerminated, ResultCode);
// 检查执行结果
if ResultCode <> 0 then
begin
MsgBox('服务安装失败,错误代码: ' + IntToStr(ResultCode), mbError, MB_OK);
end;
// 启动服务的命令
Exec(ExpandConstant('{cmd}'), '/C sc start 服务名称', '', 0, ewWaitUntilTerminated, StartResultCode);
// 检查执行结果
if StartResultCode <> 0 then
begin
MsgBox('服务启动失败,错误代码: ' + IntToStr(StartResultCode), mbError, MB_OK);
end;
end;
end;
// 执行卸载前的准备工作
function InitializeUninstall(): Boolean;
var
StopResultCode: integer;
begin
// 停止服务的命令
Exec(ExpandConstant('{cmd}'), '/C sc stop 服务名称', '', 0, ewWaitUntilTerminated, StopResultCode);
// 检查执行结果
if StopResultCode <> 0 then
begin
MsgBox('服务停止失败,错误代码: ' + IntToStr(StopResultCode), mbError, MB_OK);
end;
Result := True;
end;
// 执行卸载后的收尾工作
procedure DeinitializeUninstall();
var
DeleteResultCode: integer;
begin
// 删除服务的命令
Exec(ExpandConstant('{cmd}'), '/C sc delete 服务名称', '', 0, ewWaitUntilTerminated, DeleteResultCode);
// 检查执行结果
if DeleteResultCode <> 0 then
begin
MsgBox('服务删除失败,错误代码: ' + IntToStr(DeleteResultCode), mbError, MB_OK);
end;
end;
以上就能在安装软件的时候自动创建相应的服务并启动该服务,卸载软件的时候自动停止并删除该服务