系列文章目录
将可执行jar包部署为windows服务
提示:建议阅读本篇之前先读一下上一章【将可执行jar包部署为windows服务】,有助于你更容易的理解本章内容
文章目录
- 系列文章目录
- 前言
- 一、你的项目是如何打包的?
- 二、有何不同?
- 1.目录不同
- 2.MANIFEST.MF
- 三、为什么不能直接部署为windows服务?
- 四、解题思路
- 方案1
- 方案2
- 总结
- 上一章:[将可执行jar包部署为windows服务]()
前言
文本按如下思路来讲如何将spring boot 项目部署为windows服务
首先介绍spring boot 项目是怎么打包的
其次分析spring boot 通过插件打的jar包与普通的jar包有什么不同然后说下spring boot 通过插件打的jar包为什么不能直接部署为windows服务
最后介绍spring boot 项目如何打包来部署为windows服务
提示:以下是本篇文章正文内容,下面案例可供参考
一、你的项目是如何打包的?
使用Spring Boot Maven Plugin插件,可以直接把Spring Boot项目打包成可执行的jar包
这里面起主要作用的就是goals(目标)repackage(重新打包)
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<goals><goal>repackage</goal></goals>
</execution>
</executions>
</plugin>
<plugins>
<build>
java命令运行jar包。
java -demo.jar
二、有何不同?
1.目录不同
repackage包目录
原始包目录
repackage之后
org目录(springframework项目文件)
BOOT-INF目录包含项目文件和依赖文件(lib目录)。
原始包只包含项目文件。
2.MANIFEST.MF
repackage包 Manifest
Manifest-Version: 1.0
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: Rens
Implementation-Vendor-Id: com.example
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_144
Implementation-URL: http://projects.spring.io/spring-boot/demo/
原始包 Manifest
Manifest-Version: 1.0
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: Rens
Implementation-Vendor-Id: com.example
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_144
Implementation-URL: http://projects.spring.io/spring-boot/demo/
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: com.example.demo.DemoApplication
repackage包Manifest文件
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.demo.DemoApplication
原始包Manifest文件
Main-Class: com.example.demo.DemoApplication
三、为什么不能直接部署为windows服务?
Apache Commons Daemon安装服务时,Procrun的参数StartClass设置的项目的主类,也就是Manifest文件的Main-Class,repackage之后,Main-Class的值是spring boot 的 JarLauncher,所以虽然服务可以部署,但是启动不了。
四、解题思路
方案1
直接把Procrun的StartClass设置为org.springframework.boot.loader.JarLauncherProcrun的SatrtClass参数默认值为main方法,可以不指定。
如果项目里要处理服务启动和停止的逻辑,需要增加入参,入参会传递到项目的main方法,通过入参处理服务启动和停止的逻辑。
很惭愧写这篇文章的时候才想到是不是可以直接把Procrun的StartClass设置为org.springframework.boot.loader.JarLauncher,通过测试发现是可以启动的,但是main方法必须要传递参数,然后根据参数处理服务的启停,否则windows服务启动之后就无法停止了。
class DemoApplication;
static void main(String [] args){
String mode = args[0];
if ("start".equals(mode){
//这里省略了入参的处理
[...]
SpringApplication.run(DemoApplication.class, args);
}
else{
System.exit(0);
}
}
安装 'demo Service’服务
prunsrv //IS//demo–DisplayName=“demo Service”
–Install=prunsrv.exe --Jvm=auto --StartMode=jvm --StopMode=jvm
–StartClass=org.springframework.boot.loader.JarLauncher --StartParams=start
–StopClass=org.springframework.boot.loader.JarLauncher --StopParams=stop
方案2
spring boot 分离式打包
maven jar plugin + maven dependency plugin
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.example.demo.DemoApplication</mainClass>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- configure the plugin here -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
生成的目录如图所示
把jar包和lib复制到部署的目录即可
总结
例如:以上就是今天要讲的内容,本文仅仅简单介绍了将spring boot 部署为windows服务的方法,maven有很强大的功能,还有很多种方式可以实现类似的功能。以后会继续带大家一起探索。
其实我一直在思考,如何把项目文件和依赖文件打成一个jar包,就像spring boot maven plugin那样。BOOT-INF文件夹是不是很接近我们理想中的jar的样子?