系列文章目录

将可执行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包目录

springboot 设置jar包打包位置_spring boot


原始包目录

springboot 设置jar包打包位置_apache_02

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.JarLauncher
Procrun的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>

生成的目录如图所示

springboot 设置jar包打包位置_spring boot_03


把jar包和lib复制到部署的目录即可


总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了将spring boot 部署为windows服务的方法,maven有很强大的功能,还有很多种方式可以实现类似的功能。以后会继续带大家一起探索。
其实我一直在思考,如何把项目文件和依赖文件打成一个jar包,就像spring boot maven plugin那样。BOOT-INF文件夹是不是很接近我们理想中的jar的样子?