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

前言

写下这篇文章是为了记录第一次发布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
下载以下文件:

image.png

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

1.1 操作步骤

1.1.1 将项目打成jar包
<packaging>jar</packaging>
<properties>
      <skipTests>true</skipTests><!-- 等同于clean package -Dmaven.test.skip=true-->
...
...
<build>
        <plugins>
            <!--1.jar.开启 最直接的方式(总的打一个jar包)-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
...
1.1.2 配置非常好用的winsw的Service.xml

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

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

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

<configuration>
  
  <!-- 安装Windows的服务名称-->
  <id>MyService</id>
  <!-- 显示名称-->
  <name>My Service(Powered by WinSW)</name>
  <!-- 描述服务能做什么-->
  <description>XX系统</description>
  <!-- 写JAVA的路径: -->
  <executable>C:\Program Files\Java\jdk1.8.0_231\bin\java.exe</executable>
  <arguments>-Xmx2048m -jar myapp.jar --httpPort=60</arguments>
  <logmode>rotate</logmode>
  <!-- 自动重启(延迟)-->
  <delayedAutoStart/>
</configuration>

1.2遇到过的坑

1.2.1给定编码中的字符无效
D:\app\home>my_Service.exe install
System.Xml.XmlException: 给定编码中的字符无效。 第 31 行,位置 8。
   在 System.Xml.XmlTextReaderImpl.Throw(Exception e)
   在 System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32&
 charsCount)
   在 System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount)
   在 System.Xml.XmlTextReaderImpl.ReadData()
   在 System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32&
outStartPos, Int32& outEndPos)
   在 System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
   在 System.Xml.XmlTextReaderImpl.ParseComment()
   在 System.Xml.XmlTextReaderImpl.ParseElementContent()
   在 System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
   在 System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)

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

1.2.2 服务启动1067错误

按照第二篇文章中说的:

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

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

二、war包

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

2.1、修改配置文件
<packaging>war</packaging>
<properties>
      <skipTests>true</skipTests><!-- 等同于clean package -Dmaven.test.skip=true-->
...
<dependencies>
    <!--部署成war包时开启↓↓↓↓-->
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope><!-- 仅编译的时候使用,运行是由tomcat提供 -->
   </dependency>
   <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
   </dependency>
...
<build>
        <plugins>
          <!-- 2.war.开启 把原来的 spring-boot-maven-plugin 注释掉/删掉-->
          <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
          </plugin>
2.2、增加启动类(与SpringBoot启动类放在同一个文件夹)
public class SpringBootStartApplication extends SpringBootServletInitializer {
    Logger logger= LoggerFactory.getLogger(SpringBootStartApplication.class);
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        logger.debug("starting spring boot initializer ......");
        return builder.sources(DlhjiaApplication.class);
    }
}
2.3、使用maven 命令打包后,直接部署到Tomcat中启动

三、Jar包,分离lib、配置文件与静态资源

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

操作步骤
3.1修改pom.xml
<packaging>jar</packaging>
<properties>
      <skipTests>true</skipTests><!-- 等同于clean package -Dmaven.test.skip=true-->
...
  <build>
        <plugins>
             <!--3.jar包(jar分离lib与静态资源,相比1更推荐这种方式,方便后期的升级与维护)-->
            <!--但这种方式仅用于发布,在IDEA中不可直接运行-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </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>
                            <outputDirectory>target/lib</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <groupId>cn.jstars</groupId>
                            <artifactId>datatocloud</artifactId>
                        </include>
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
...


        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>static/**</exclude>
                    <exclude>templates/**</exclude>
                    <exclude>*.yml</exclude>
                    <exclude>*.properties</exclude>
                    <exclude>*.xml</exclude>
                    <exclude>*.txt</exclude>
                </excludes>
            </resource>
        </resources>
3.2配置winsw
 <arguments>-Xmx2048m -jar -Dloader.path=.,lib dlhjia.jar --httpPort=60</arguments>
3.3 最后的文件存放结构
image.png

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

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

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

IDEA Tomcat启动配置

image.png

-完-

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容