[Win服务器] 在windows服务器上部署spring boot项目

106 0
Honkers 2025-5-29 16:58:53 来自手机 | 显示全部楼层 |阅读模式

前言

写下这篇文章是为了记录第一次发布Spring Boot项目的过程。

初步认识Spring Boot

SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。

SpringBoot所具备的特征

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。

在上面说到内嵌Tomcat或jetty等sevlet容器,基于Maven可以创建可执行的Jar包和War包。总结得非常到位,但是动手操作时,就会遇到一些知识总结以外的具体操作的问题——那就是过程。
首先,可执行jar包在windows上不可以直接运行。其次,在命令行中java -jar去执行,一旦命令窗口关闭或服务器宕机重启,服务即停止。

Spring Boot项目部署到Windows服务器——三种方式

在写部署的三种方式之前,感谢一下Intellij IDEA,刚开始还不习惯,但通过一个项目熟悉下来,太好用了!在Tab Split、Git、Maven Projects、代码折叠、代码风格等。

一、jar包(官方推荐)

在这里要特别感谢这篇文章,写得特别好:
《在windows服务器上使用winsw部署spring boot项目》
Spring Boot官方参考文档:https://docs.spring.io/spring-boot/docs/2.0.8.RELEASE/reference/htmlsingle/#deployment-windows 上一笔代过,而这篇文章图文结合清晰地告诉你,如何使用winsw。winsw是一个开源项目,程序以及源码都可以在gitHub上下载。
winsw下载及文档:https://github.com/kohsuke/winsw
下载以下文件:


(说明:Net4.0可选,一般用不到,提供文件名给有需要的人作为参考;curl也是根据实用情况下载使用)

1.1 操作步骤

#####1.1.1 将项目打成jar包

  1. <packaging>jar</packaging>
  2. <properties>
  3. <skipTests>true</skipTests><!-- 等同于clean package -Dmaven.test.skip=true-->
  4. ...
  5. ...
  6. <build>
  7. <plugins>
  8. <!--1.jar.开启 最直接的方式(总的打一个jar包)-->
  9. <plugin>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-maven-plugin</artifactId>
  12. </plugin>
  13. ...
复制代码

#####1.1.2 配置非常好用的winsw的Service.xml
根据文章中的内容进行搭建也可以,根据官方文档使用**rotate**,由于个人水平有限,加上时间关系,没有去研究彻底log mode的详细配置,在此记录下来。
配置参考文档:https://github.com/kohsuke/winsw/blob/master/doc/xmlConfigFile.md#user-content-logging

  1. <!--日志模式 Throw away stdout and stderr, and do not produce any log files at all.-->
  2. <log mode="none"/>
复制代码

因此我参考另一篇文章:《如何将Spring Boot项目部署为Windows服务,并设置开机启动》,修改如下:

  1. <configuration>
  2. <!-- 安装Windows的服务名称-->
  3. <id>MyService</id>
  4. <!-- 显示名称-->
  5. <name>My Service(Powered by WinSW)</name>
  6. <!-- 描述服务能做什么-->
  7. <description>XX系统</description>
  8. <!-- 写JAVA的路径: -->
  9. <executable>C:\Program Files\Java\jdk1.8.0_231\bin\java.exe</executable>
  10. <arguments>-Xmx2048m -jar myapp.jar --httpPort=60</arguments>
  11. <logmode>rotate</logmode>
  12. <!-- 自动重启(延迟)-->
  13. <delayedAutoStart/>
  14. </configuration>
复制代码
1.2遇到过的坑
1.2.1给定编码中的字符无效
  1. D:\app\home>my_Service.exe install
  2. System.Xml.XmlException: 给定编码中的字符无效。 第 31 行,位置 8。
  3. 在 System.Xml.XmlTextReaderImpl.Throw(Exception e)
  4. 在 System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32&
  5. charsCount)
  6. 在 System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount)
  7. 在 System.Xml.XmlTextReaderImpl.ReadData()
  8. 在 System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32&
  9. outStartPos, Int32& outEndPos)
  10. 在 System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
  11. 在 System.Xml.XmlTextReaderImpl.ParseComment()
  12. 在 System.Xml.XmlTextReaderImpl.ParseElementContent()
  13. 在 System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
  14. 在 System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
复制代码

原因:中文乱码
解决办法:Notepad++转为UTF-8编码

1.2.2 服务启动1067错误

按照第二篇文章中说的:

  1. <!--这里写java的路径,如何配置了环境变量直接写"java"就行-->
  2. <executable>java</executable>
复制代码

我的服务器上配置了环境变量,但无法启动,错误1067。
原因:还没有时间进行排查,在此先记录下来。
解决:直接指定jdk路径:C:\Program Files\Java\jdk1.8.0_231\bin\java.exe

二、war包

参考一篇文章:《SpringBoot 打包成war包,部署到tomcat》
说得很清晰,根据我的项目情况,稍作调整即可。

2.1、修改配置文件
  1. <packaging>war</packaging>
  2. <properties>
  3. <skipTests>true</skipTests><!-- 等同于clean package -Dmaven.test.skip=true-->
  4. ...
  5. <dependencies>
  6. <!--部署成war包时开启↓↓↓↓-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-tomcat</artifactId>
  10. <scope>provided</scope><!-- 仅编译的时候使用,运行是由tomcat提供 -->
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.tomcat.embed</groupId>
  14. <artifactId>tomcat-embed-jasper</artifactId>
  15. <scope>provided</scope>
  16. </dependency>
  17. ...
  18. <build>
  19. <plugins>
  20. <!-- 2.war.开启 把原来的 spring-boot-maven-plugin 注释掉/删掉-->
  21. <plugin>
  22. <groupId>org.apache.maven.plugins</groupId>
  23. <artifactId>maven-war-plugin</artifactId>
  24. </plugin>
复制代码
2.2、增加启动类(与SpringBoot启动类放在同一个文件夹)
  1. public class SpringBootStartApplication extends SpringBootServletInitializer {
  2. Logger logger= LoggerFactory.getLogger(SpringBootStartApplication.class);
  3. @Override
  4. protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  5. logger.debug("starting spring boot initializer ......");
  6. return builder.sources(DlhjiaApplication.class);
  7. }
  8. }
复制代码
2.3、使用maven 命令打包后,直接部署到Tomcat中启动
三、Jar包,分离lib、配置文件与静态资源

为什么方式一不满足我的需求呢?当项目中遇到只有小的bug修复,甚至只改了一个类文件或者配置文件,前端页面的一个参数时,方式一非常慢。
所以,在网上看到了一篇好文:《Springboot 打jar包分离lib,配置文件正确方式(二)》
#####操作步骤

3.1修改pom.xml
  1. <packaging>jar</packaging>
  2. <properties>
  3. <skipTests>true</skipTests><!-- 等同于clean package -Dmaven.test.skip=true-->
  4. ...
  5. <build>
  6. <plugins>
  7. <!--3.jar包(jar分离lib与静态资源,相比1更推荐这种方式,方便后期的升级与维护)-->
  8. <!--但这种方式仅用于发布,在IDEA中不可直接运行-->
  9. <plugin>
  10. <groupId>org.apache.maven.plugins</groupId>
  11. <artifactId>maven-compiler-plugin</artifactId>
  12. <configuration>
  13. <source>${java.version}</source>
  14. <target>${java.version}</target>
  15. </configuration>
  16. </plugin>
  17. <plugin>
  18. <groupId>org.apache.maven.plugins</groupId>
  19. <artifactId>maven-dependency-plugin</artifactId>
  20. <executions>
  21. <execution>
  22. <id>copy-dependencies</id>
  23. <phase>package</phase>
  24. <goals>
  25. <goal>copy-dependencies</goal>
  26. </goals>
  27. <configuration>
  28. <outputDirectory>target/lib</outputDirectory>
  29. <excludeTransitive>false</excludeTransitive>
  30. <stripVersion>false</stripVersion>
  31. <includeScope>runtime</includeScope>
  32. </configuration>
  33. </execution>
  34. </executions>
  35. </plugin>
  36. <plugin>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-maven-plugin</artifactId>
  39. <configuration>
  40. <layout>ZIP</layout>
  41. <includes>
  42. <include>
  43. <groupId>cn.jstars</groupId>
  44. <artifactId>datatocloud</artifactId>
  45. </include>
  46. </includes>
  47. </configuration>
  48. </plugin>
  49. <plugin>
  50. <groupId>org.apache.maven.plugins</groupId>
  51. <artifactId>maven-resources-plugin</artifactId>
  52. <configuration>
  53. <encoding>UTF-8</encoding>
  54. </configuration>
  55. </plugin>
  56. <plugin>
  57. <groupId>org.apache.maven.plugins</groupId>
  58. <artifactId>maven-surefire-plugin</artifactId>
  59. <configuration>
  60. <skip>true</skip>
  61. </configuration>
  62. </plugin>
  63. ...
  64. <resources>
  65. <resource>
  66. <filtering>true</filtering>
  67. <directory>src/main/resources</directory>
  68. <excludes>
  69. <exclude>static/**</exclude>
  70. <exclude>templates/**</exclude>
  71. <exclude>*.yml</exclude>
  72. <exclude>*.properties</exclude>
  73. <exclude>*.xml</exclude>
  74. <exclude>*.txt</exclude>
  75. </excludes>
  76. </resource>
  77. </resources>
复制代码
3.2配置winsw
  1. <arguments>-Xmx2048m -jar -Dloader.path=.,lib dlhjia.jar --httpPort=60</arguments>
复制代码
3.3 最后的文件存放结构


这样就后期的维护与升级就很方便,像lib这样的文件也不用重复打包上传,节省升级时间!

Spring Boot项目发布三种模式总结:

一、打成jar包,直接通过java -jar启动;+winsw2.3.0实现服务自动启动
二、调整pom.xml,新建启动类,打成war包,在tomcat中启动
三、打成jar包,分离lib、配置文件与静态资源;+winsw2.3.0实现服务自动启动
为了在使用过程中,维护与升级更方便,推荐使用后面两种模式。

IDEA Tomcat启动配置


-完-

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

特级红客

关注
  • 3141
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行