前言

  Spring Boot支持传统部署和更现代的部署形式。jar跟war都支持,这里参考springboot参考手册学习记录

  传统部署:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto-traditional-deployment.html

  更现代的部署:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#getting-started-first-application-executable-jar

  两种方式

  jar

  springboot项目支持创建可执行Jar,参考手册第11.5. Creating an Executable Jar就有对这样的介绍,我这里充当一回搬运工(大家好,我是大自然勤劳的搬运工~~):

  我们通过创建一个完全自包含的可执行jar文件来完成我们的示例,该文件可以在生产环境中运行。可执行jar(有时称为“胖jar”)是包含编译类和代码需要运行的所有jar依赖项的归档文件

  要创建一个可执行jar,我们需要将spring-boot-maven-plugin添加到我们的pom.xml中。为此,在dependencies部分下面插入以下几行:

  1. <!--构建工具-->
  2. <build>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>
  8. </plugins>
  9. </build>

  如果需要制定jar包名称、生成路径,以及跳过测试

  1. <!--构建工具-->
  2. <build>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. <!-- 文件名以及输出路径-->
  8. <configuration>
  9. <finalName>${project.artifactId}</finalName>
  10. <outputDirectory>../package</outputDirectory>
  11. </configuration>
  12. </plugin>
  13.  
  14. <!-- 跳过启动测试 -->
  15. <plugin>
  16. <groupId>org.apache.maven.plugins</groupId>
  17. <artifactId>maven-surefire-plugin</artifactId>
  18. <configuration>
  19. <skipTests>true</skipTests>
  20. </configuration>
  21. </plugin>
  22. </plugins>
  23. </build>

  如果是在父类的pom文件进行统一管理,然后子类引入父类,这需要加pluginManagement标签

  1. <!--构建工具-->
  2. <build>
  3. <pluginManagement>
    ...
  4. </pluginManagement>
  5. </build>

  

  2019-08-23补充:之前打包都是一个多个工程管理,在父类的pom文件配置这个,打包会在目录下面生成,因为用的是../package

  最近打包一个单独的项目,路径我改成package,没有../了,打包后并没有在项目下面生成package目录,jar不知道打去哪了。。。我全局搜也搜不出来

  后面改成绝对路径F:/package,终于有jar包了,但文件名不对,我们明明设置读取的是${project.artifactId},但打出来还是带上了版本号。。。,原因暂时未知

  可以使用命令行来打包,或者使用Maven Projects来打包

  打包成功,在target目录下就会看到jar包

  要运行该应用程序,cmd命令,进入到jar所在路径文件,使用 java -jar 命令;win下直接双击用java方式打开即可运行(Ctrl+C退出)

  那么Linux下面如何部署运行呢?

  1. =====Linux部署命令======
  2. 、查看运行的项目
  3. pgrep java | xargs ps
  4.  
  5. 、先kill掉旧服务
  6. pkill -f myspringboot-0.0.-SNAPSHOT
  7.  
  8. 、后台启动新服务(nohup后台运行,&后台运行的区别:
  9. 使用nohup运行程序:
  10. 结果默认会输出到nohup.out
  11. 使用Ctrl + C发送SIGINT信号,程序关闭
  12. 关闭session发送SIGHUP信号,程序免疫
  13. 使用&后台运行程序:
  14. 结果会输出到终端
  15. 使用Ctrl + C发送SIGINT信号,程序免疫
  16. 关闭session发送SIGHUP信号,程序关闭

  17. nohup java -jar /home/myspringboot/myspringboot-0.0.-SNAPSHOT.jar &
  18.  
  19. 如需输出日志
  20. nohup java -jar /home/myspringboot/myspringboot-0.0.-SNAPSHOT.jar > /home/myspringboot/myspringboot-0.0.-SNAPSHOT.log &
  21.  
  22. 、查看日志
  23. tail -f /home/myspringboot/myspringboot-0.0.-SNAPSHOT.log

  2019-07-08补充

  一、当我们打包后上传Linux服务器,发现有些代码还需要修改,重新打包、上传又比较慢,如果只是少量代码,并且是前端代码、配置文件等,那么我们可以直接修改jar包内容

    1、先cd进到jar位置,然后使用 vim 命令进入jar包  

    

    2、使用 / 命令模糊搜索定位文件,例如main.js  

    

    3、按回车进入文件,修改完成后使用 :wq 保存退出文件,回到jar包目录,使用 :q 退出jar包,即可成功修改文件内容

    PS:修改jar,重启生效

  二、如果我们需要改动的是后端java代码,那么我就需要在本地改好后重新编译代码,把对应的java、class文件都替换到jar包

  war

  springboot项目支持创建一个可部署的War文件,参考手册第92.1 Create a Deployable War File就有对这样的介绍,我这里充当一回搬运工(大家好,我是大自然勤劳的搬运工~~):

  由于Spring WebFlux并不严格依赖于Servlet API,并且应用程序默认部署在嵌入式反应器Netty服务器上,所以WebFlux应用程序不支持War部署。

  生成可部署war文件的第一步是提供SpringBootServletInitializer子类并覆盖其配置方法。这样做可以利用Spring Framework的Servlet 3.0支持,让您在Servlet容器启动应用程序时配置它。通常,您应该更新应用程序的主类以扩展SpringBootServletInitializer,同时,要将Spring应用程序部署到外部服务器,必须确保servlet初始化器直接实现WebApplicationInitializer(即使是从已经实现它的基类扩展而来)。如下例所示:

  1. @SpringBootApplication
  2. public class MyspringbootApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
  3.  
  4. @Override
  5. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  6. return application.sources(MyspringbootApplication.class);
  7. }
  8.  
  9. public static void main(String[] args) {
  10. SpringApplication.run(MyspringbootApplication.class, args);
  11. }
  12. }

  在创建springboot项目时,默认是jar包,如果是想要打成war包,需要修改pom.xml,打包方式跟生成路径跟jar的一样,过程的最后一步是确保嵌入的servlet容器不会干扰部署war文件的servlet容器。为此,需要将嵌入式servlet容器依赖项标记为所提供的。

  1. <!--默认jar-->
  2. <packaging>war</packaging>
  3.  
  4. <!-- 如需打成war包 确保嵌入的servlet容器不会干扰部署war文件的servlet容器 -->
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. <scope>provided</scope>
  9. </dependency>
  10.  
  11. <!--构建工具-->
  12. <build>
  13. <plugins>
  14. <plugin>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-maven-plugin</artifactId>
  17. </plugin>
  18. </plugins>
  19. </build>

  得到war包后把它丢到服务容器里(放在webapps文件夹下)run起来就行了,要注意的是使用了外部容器,要记得改Tomcat的端口,在server.xml的Connector节点

  友情翻译:如果使用Spring引导构建工具,将嵌入的servlet容器依赖项标记为提供,将生成一个可执行的war文件,并将提供的依赖项打包在lib提供的目录中。这意味着,除了可以部署到servlet容器之外,还可以在命令行上使用java -jar运行应用程序。

  后记

  打成war包丢到服务器里面运行启动报错,还不知道是什么问题,都是照着参考手册来的...,先记录到这里;推荐直接使用jar的方式运行,war报错的原因,有空再去研究。

  

  补充

  2019-06-24补充:我将我们前面写的IM系统按照步骤打成war包,但启动Tomcat报错

  2019-07-12补充,后面看文档后发现,我们漏了一下东西,如果使用Logback,还需要告诉WebLogic选择打包版本,而不是预先安装在服务器上的版本。而SpringBoot默认使用Logback,同时,之前我们也漏了 implements WebApplicationInitializer

  将所有的东西都补全后还是报错... 

 

  上网查了一下,说两种问题:1、Tomcat问题,2、jar包问题

  我们之前的Tomcat版本是apache-tomcat-7.0.53,去官网看来下,只支持6 and later(7 and later for WebSocket)

  但我们项目用的jdk版本是1.8.0_131,需要9.0.x版的Tomcat才支持,直接下载最新版Tomcat

  成功启动

  PS:

  1、由于使用外部服务器,我们在项目的配置文件配置的server.port=10081已经没有用了,端口信息需要咋Tomcat的server.xml进行配置

  1. <Connector port="10081" protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443"
  4. URIEncoding="UTF-8"/>

  2、解决Tomcat中文乱码,修改conf/logging.properties

  1. java.util.logging.ConsoleHandler.encoding = GBK

  3、为了安全,webapps只保留项目文件

  4、Tomcat的本质是文件夹,默认配置下访问项目要加war包名称,例如: :端口/war包名/路径

    这是因为我们server.xml的host节点的默认appBase="webapps"

    

    新增一个默认访问路径就可以不用加war包名称了,例如:

    

    然后就可以这样访问了

    

  到这里war包启动报错的问题终于解决!

  2019-08-26补充:补充一下如何云安装java的jdk,以及mysql数据库,这里主要参考以下博客文章(亲测可用):

  linux在线安装JDK(1.8版本):https://blog.csdn.net/zxb730916/article/details/80899429?tdsourcetag=s_pctim_aiomsg

  Linux之yum安装MySQL:https://www.jianshu.com/p/136003ffce41

  jdk

  1. //查看是否已安装JDK,卸载
  2. yum list installed |grep java
  3.  
  4. //卸载CentOS系统Java环境
  5. // *表时卸载所有openjdk相关文件输入
  6. yum -y remove java-1.8.-openjdk*
  7. // 卸载tzdata-java
  8. yum -y remove tzdata-java.noarch
  9.  
  10. //列出java环境安装包
  11. yum -y list java*
  12.  
  13. // 安装JDK,如果没有java-1.8.-openjdk-devel就没有javac命令
  14. yum install java-1.8.-openjdk java-1.8.-openjdk-devel

  使用 java -version 查看版本号确认是否安装成功

  mysql

  下载、安装

  1. //下载
  2. wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-.noarch.rpm
  3.  
  4. //安装
  5. yum -y install mysql57-community-release-el7-.noarch.rpm
  6.  
  7. yum -y install mysql-community-server

  启动、配置

  1. //启动
  2. systemctl start mysqld.service
  3.  
  4. //查看root初始密码
  5. grep "password" /var/log/mysqld.log
  6.  
  7. //使用root登录mysql
  8. mysql -uroot -p
  9.  
  10. //设置安全级别
  11. set global validate_password_policy=
  12.  
  13. //默认密码长度为8,可以设置为其它值,最小4位
  14. set global validate_password_length=
  15.  
  16. //修改root密码
  17. ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
  18.  
  19. //可视化工具的登录授权:(如果授权不成功,请查看防火墙)
  20. grant all on *.* to root@'%' identified by 'root';

  配置到这里就可以使用数据库工具去连接操作数据库了

  代码开源

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/springBoot

  码云:https://gitee.com/huanzi-qch/springBoot

SpringBoot系列——jar包与war包的部署的更多相关文章

  1. 【spring boot】idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到(转)

    转自:https://www.cnblogs.com/sxdcgaq8080/p/7727249.html   接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p ...

  2. 【spring boot】6.idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到

    接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p/7712874.html 然后声明一点,下面打包的过程中,scope一直都是使用默认的范围 <!--用于 ...

  3. idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到

    接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p/7712874.html 然后声明一点,下面打包的过程中,scope一直都是使用默认的范围 <!--用于 ...

  4. Springboot中IDE支持两种打包方式,即jar包和war包

    Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war    在项目的根目录执行maven 命令clean pa ...

  5. springboot打成jar包和war包的两种方式,并引入第三方jar包!

    springboot打成jar包和war包的两种方式,并引入第三方jar包! 首先把需要引入的第三方jar包引入到本地项目中,在引用的模块下加一个lib文件夹 一.打成jar包 1.修改pom文件里的 ...

  6. Spring Boot Jar包转War包 部署到Tomcat下

    原文:https://my.oschina.net/sdlvzg/blog/1562998 我们都知道springBoot中已经内置了tomcat,是不需要我们额外的配置tomcat服务器的,但是有时 ...

  7. Java:jar包与war包的差异

    一般将项目分为两层:服务层和表现层(视图层),通常我们把服务层打包成jar,而把视图层的包打成war包. 仔细对比可以发现: jar包中包含了你写程序的所有服务或者第三方类库,它通常是作为幕后工作者, ...

  8. jar包和war包的区别(转)

    jar包和war包的区别:war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运 ...

  9. jar包和war包的区别

    jar包和war包的区别: jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性了,这些jar包一般都会放在lib目录 ...

  10. 怎样将文件夹打包为jar包或war包

    在dos命令中,找到要打包文件夹位置,输入jar -cvf 打包后的名和格式 文件夹名 如图: 在我的文件夹的位置就能看到jar包和war包了

随机推荐

  1. layer使用总结

    1.询问框的使用 主要体现在删除等重要操作 让用户进行二次确认的场景 //询问框 layer.confirm('您是如何看待前端开发?', { btn: ['重要','奇葩'] //按钮 }, fun ...

  2. QTimer在QThread环境中失效的问题

    QTimer在非QThread的环境下能正常工作.但在QThread环境下,需要做一些改动才能正常工作. 创建Qt的线程有两种方式: 1. 子例化QThread 可以在虚函数run中启动定时器,大致的 ...

  3. WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享

    作者 | Jackson 编辑 | 尾尾 不论是 PC 还是移动端,图片一直占据着页面流量的大头,在图片的大小和质量之间如何权衡,成为了长期困扰开发者们的问题.而 WebP 技术的出现,为解决该问题提 ...

  4. ABP入门系列目录——学习Abp框架之实操演练

    ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WE ...

  5. Nginx 配置 Https 免费证书访问

    配置HTTPS 现在做博客或者做网站没有 https 已经不行了,就记录一下我在腾讯云配置 https 的过程吧,非常简单,1个小时就可以了. 还涉及到 http 访问自动转发到 https 访问路径 ...

  6. java提高(15)---java深浅拷贝

    #java深浅拷贝 一.前言 为什么会有深浅拷贝这个概念? 我觉得主要跟JVM内存分配有关,对于基本数据类型,只存在栈内存,所以它的拷贝不存在深浅拷贝这个概念.而对于对象而言,一个对象的创建会在内存中 ...

  7. 对SVN的落地与实践总结

    现今最为流行的Git是管理很几套很成熟的分支管理策略.而SVN确实也有,但结合现公司的实际场景还是做了些调整和变动. 一.分支命名规则 所有分支命名采用小写字母 + 数字 + 特殊符号 组成 项目分支 ...

  8. Redis学习——详解Redis配置文件(三)

    一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...

  9. 第一章.java&golang的区别之:闭包

    对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...

  10. 卷积神经网络之LeNet

    开局一张图,内容全靠编. 上图引用自 [卷积神经网络-进化史]从LeNet到AlexNet. 目前常用的卷积神经网络 深度学习现在是百花齐放,各种网络结构层出不穷,计划梳理下各个常用的卷积神经网络结构 ...