SpringBoot系列——jar包与war包的部署
前言
Spring Boot支持传统部署和更现代的部署形式。jar跟war都支持,这里参考springboot参考手册学习记录
两种方式
jar
springboot项目支持创建可执行Jar,参考手册第11.5. Creating an Executable Jar就有对这样的介绍,我这里充当一回搬运工(大家好,我是大自然勤劳的搬运工~~):
我们通过创建一个完全自包含的可执行jar文件来完成我们的示例,该文件可以在生产环境中运行。可执行jar(有时称为“胖jar”)是包含编译类和代码需要运行的所有jar依赖项的归档文件
要创建一个可执行jar,我们需要将spring-boot-maven-plugin添加到我们的pom.xml中。为此,在dependencies部分下面插入以下几行:
- <!--构建工具-->
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
如果需要制定jar包名称、生成路径,以及跳过测试
- <!--构建工具-->
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <!-- 文件名以及输出路径-->
- <configuration>
- <finalName>${project.artifactId}</finalName>
- <outputDirectory>../package</outputDirectory>
- </configuration>
- </plugin>
- <!-- 跳过启动测试 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <skipTests>true</skipTests>
- </configuration>
- </plugin>
- </plugins>
- </build>
如果是在父类的pom文件进行统一管理,然后子类引入父类,这需要加pluginManagement标签
- <!--构建工具-->
- <build>
- <pluginManagement>
...- </pluginManagement>
- </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下面如何部署运行呢?
- =====Linux部署命令======
- 、查看运行的项目
- pgrep java | xargs ps
- 、先kill掉旧服务
- pkill -f myspringboot-0.0.-SNAPSHOT
- 、后台启动新服务(nohup后台运行,&后台运行的区别:
- 使用nohup运行程序:
- 结果默认会输出到nohup.out
- 使用Ctrl + C发送SIGINT信号,程序关闭
- 关闭session发送SIGHUP信号,程序免疫
- 使用&后台运行程序:
- 结果会输出到终端
- 使用Ctrl + C发送SIGINT信号,程序免疫
- 关闭session发送SIGHUP信号,程序关闭
- )
- nohup java -jar /home/myspringboot/myspringboot-0.0.-SNAPSHOT.jar &
- 如需输出日志
- nohup java -jar /home/myspringboot/myspringboot-0.0.-SNAPSHOT.jar > /home/myspringboot/myspringboot-0.0.-SNAPSHOT.log &
- 、查看日志
- 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(即使是从已经实现它的基类扩展而来)。如下例所示:
- @SpringBootApplication
- public class MyspringbootApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
- @Override
- protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
- return application.sources(MyspringbootApplication.class);
- }
- public static void main(String[] args) {
- SpringApplication.run(MyspringbootApplication.class, args);
- }
- }
在创建springboot项目时,默认是jar包,如果是想要打成war包,需要修改pom.xml,打包方式跟生成路径跟jar的一样,过程的最后一步是确保嵌入的servlet容器不会干扰部署war文件的servlet容器。为此,需要将嵌入式servlet容器依赖项标记为所提供的。
- <!--默认jar-->
- <packaging>war</packaging>
- <!-- 如需打成war包 确保嵌入的servlet容器不会干扰部署war文件的servlet容器 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- <scope>provided</scope>
- </dependency>
- <!--构建工具-->
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </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进行配置
- <Connector port="10081" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"
- URIEncoding="UTF-8"/>
2、解决Tomcat中文乱码,修改conf/logging.properties
- 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
- //查看是否已安装JDK,卸载
- yum list installed |grep java
- //卸载CentOS系统Java环境
- // *表时卸载所有openjdk相关文件输入
- yum -y remove java-1.8.-openjdk*
- // 卸载tzdata-java
- yum -y remove tzdata-java.noarch
- //列出java环境安装包
- yum -y list java*
- // 安装JDK,如果没有java-1.8.-openjdk-devel就没有javac命令
- yum install java-1.8.-openjdk java-1.8.-openjdk-devel
使用 java -version 查看版本号确认是否安装成功
mysql
下载、安装
- //下载
- wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-.noarch.rpm
- //安装
- yum -y install mysql57-community-release-el7-.noarch.rpm
- yum -y install mysql-community-server
启动、配置
- //启动
- systemctl start mysqld.service
- //查看root初始密码
- grep "password" /var/log/mysqld.log
- //使用root登录mysql
- mysql -uroot -p
- //设置安全级别
- set global validate_password_policy=
- //默认密码长度为8,可以设置为其它值,最小4位
- set global validate_password_length=
- //修改root密码
- ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
- //可视化工具的登录授权:(如果授权不成功,请查看防火墙)
- 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包的部署的更多相关文章
- 【spring boot】idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到(转)
转自:https://www.cnblogs.com/sxdcgaq8080/p/7727249.html 接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p ...
- 【spring boot】6.idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到
接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p/7712874.html 然后声明一点,下面打包的过程中,scope一直都是使用默认的范围 <!--用于 ...
- idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到
接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p/7712874.html 然后声明一点,下面打包的过程中,scope一直都是使用默认的范围 <!--用于 ...
- Springboot中IDE支持两种打包方式,即jar包和war包
Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war 在项目的根目录执行maven 命令clean pa ...
- springboot打成jar包和war包的两种方式,并引入第三方jar包!
springboot打成jar包和war包的两种方式,并引入第三方jar包! 首先把需要引入的第三方jar包引入到本地项目中,在引用的模块下加一个lib文件夹 一.打成jar包 1.修改pom文件里的 ...
- Spring Boot Jar包转War包 部署到Tomcat下
原文:https://my.oschina.net/sdlvzg/blog/1562998 我们都知道springBoot中已经内置了tomcat,是不需要我们额外的配置tomcat服务器的,但是有时 ...
- Java:jar包与war包的差异
一般将项目分为两层:服务层和表现层(视图层),通常我们把服务层打包成jar,而把视图层的包打成war包. 仔细对比可以发现: jar包中包含了你写程序的所有服务或者第三方类库,它通常是作为幕后工作者, ...
- jar包和war包的区别(转)
jar包和war包的区别:war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运 ...
- jar包和war包的区别
jar包和war包的区别: jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性了,这些jar包一般都会放在lib目录 ...
- 怎样将文件夹打包为jar包或war包
在dos命令中,找到要打包文件夹位置,输入jar -cvf 打包后的名和格式 文件夹名 如图: 在我的文件夹的位置就能看到jar包和war包了
随机推荐
- layer使用总结
1.询问框的使用 主要体现在删除等重要操作 让用户进行二次确认的场景 //询问框 layer.confirm('您是如何看待前端开发?', { btn: ['重要','奇葩'] //按钮 }, fun ...
- QTimer在QThread环境中失效的问题
QTimer在非QThread的环境下能正常工作.但在QThread环境下,需要做一些改动才能正常工作. 创建Qt的线程有两种方式: 1. 子例化QThread 可以在虚函数run中启动定时器,大致的 ...
- WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享
作者 | Jackson 编辑 | 尾尾 不论是 PC 还是移动端,图片一直占据着页面流量的大头,在图片的大小和质量之间如何权衡,成为了长期困扰开发者们的问题.而 WebP 技术的出现,为解决该问题提 ...
- ABP入门系列目录——学习Abp框架之实操演练
ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WE ...
- Nginx 配置 Https 免费证书访问
配置HTTPS 现在做博客或者做网站没有 https 已经不行了,就记录一下我在腾讯云配置 https 的过程吧,非常简单,1个小时就可以了. 还涉及到 http 访问自动转发到 https 访问路径 ...
- java提高(15)---java深浅拷贝
#java深浅拷贝 一.前言 为什么会有深浅拷贝这个概念? 我觉得主要跟JVM内存分配有关,对于基本数据类型,只存在栈内存,所以它的拷贝不存在深浅拷贝这个概念.而对于对象而言,一个对象的创建会在内存中 ...
- 对SVN的落地与实践总结
现今最为流行的Git是管理很几套很成熟的分支管理策略.而SVN确实也有,但结合现公司的实际场景还是做了些调整和变动. 一.分支命名规则 所有分支命名采用小写字母 + 数字 + 特殊符号 组成 项目分支 ...
- Redis学习——详解Redis配置文件(三)
一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...
- 第一章.java&golang的区别之:闭包
对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...
- 卷积神经网络之LeNet
开局一张图,内容全靠编. 上图引用自 [卷积神经网络-进化史]从LeNet到AlexNet. 目前常用的卷积神经网络 深度学习现在是百花齐放,各种网络结构层出不穷,计划梳理下各个常用的卷积神经网络结构 ...