SpringBoot 项目部署(初级)
之前的项目一直在本地电脑上写,最近需要将项目部署到服务器上进行联调测速度。于是,在网上搜集资料后简单的进行一下总结。
由于本次打包部署是为了测试,于是很多内容做的还不算详尽,只是将项目简单的打包为jar
包。
1. SpringBoot 父子项目架构
可以看出,目前的父子项目架构主要划分为:
EEGSystem
:父项目eeg-analyze-web
:子模块sleep-stage-module
:子模块,暂时作为启动类模块使用;
由于,目前项目的代码均在sleep-stage-modul
模块中,另一个模块中还没有写代码。所以在后续打包过程中,将sleep-stage-module
模块的启动类作为该项目的唯一入口(后面会解释什么是项目唯一入口)。
注意事项:父工程创建为Maven
,启动类所在模块创建时一定要用SpringBoot
项目,其他子模块创建时Maven
、SpringBoot
都可以
2. xml文件配置
2.1 父工程
父工程的pom.xml
文件配置:
点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx.eegLab</groupId>
<artifactId>EEGSystem</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
packaging的默认打包类型是jar
所有的父工程打包方式都需要设置成pom
-->
<packaging>pom</packaging>
<!--该工程下的子模块名-->
<modules>
<module>sleep-stage-module</module>
<module>eeg-ayalyze-web</module>
</modules>
<!--
依赖配置:目前这里的配置的依赖所引入的jar包在此工程下的所有子工程都会被引入
-->
<dependencies>
</dependencies>
<!--
依赖管理:
这里的配置的依赖只是对依赖版本的管理配置,子工程并不会直接引入
如果子工程要需要引入只需要加入如下标签:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
这样就可以引入mysql的驱动了,这样的好处就是可以在父工程统一一下整个工程的jar包依赖版本
而且如果有的工程不需要一些jar就可以不进行引入
-->
<dependencyManagement>
</dependencyManagement>
</project>
主要有以下注意点:
- 父工程的打包方式必须为:pom;
- 必须在父工程中显式声明子工程模块;
- 父工程不可以引入:spring-boot-maven-plugin插件,否者这个插件就将传递到每一个子模块中,打包会出错;
2.2 子工程
2.2.1 启动类子工程
启动类子工程的pom.xml
文件配置:
点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>EEGSystem</artifactId>
<groupId>com.xxx.eegLab</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sleep-stage-module</artifactId>
<packaging>jar</packaging>
<dependencies>
</dependencies>
<build>
<finalName>main</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.xxx.eeglab.EegSystemApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<!--可以把依赖的包都打包到生成的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
主要有以下注意点:
- 在子工程中显式声明所属父工程;
- 必须在唯一启动类子工程中引入
spring-boot-maven-plugin
打包插件,并且要配置将所依赖的jar
包全都打到这一包中; - 其他子工程中不要引入
spring-boot-maven-plugin
,否则将会每个工程都单独打成一个包,无法拉取到启动类所在包中;
2.2.2 其他子工程
其他子工程的配置文件如下所示:
点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>EEGSystem</artifactId>
<groupId>com.xxx.eegLab</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eeg-ayalyze-web</artifactId>
<dependencies>
</dependencies>
</project>
3. 打包
通过Maven
,在父工程下依次选择:clean
,package
即可。
注意:虽然要将所有的
jar
都搭到main
这个jar
中,但是我们执行clean
和package
却是要对父工程进行;
此时,我们需要将sleep-stage-module
下的main.jar
移动到服务器上,然后运行:java -jar main.jar
即可。
当然,这样操作是在命令行运行。一旦命令行关闭,那就停止运行了。我们可以通过
nohup
指令将程序提交到后台运行。
4. 可能出现的问题
如果按照上面的步骤来说,应该不会出现这个问题。但是,我第一次并没有按照上述步骤进行,而是按照另一个教程搞得。结果出现了下面的问题,简单记录一下:
4.1 没有主清单程序
在打包部署后,使用java -jar
指令进行运行时,可能会出现:没有主清单程序 错误。
我们用压缩软件打开打包好的jar
包,然后看到META-INF
里面的MANIFEST.MF
文件:
里面的内容应该是这样的:
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: 29687
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.xxx.eeglab.EegSystemApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.4.1
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_202
Main-Class: org.springframework.boot.loader.JarLauncher
Main-Class
:代表了Spring Boot
中启动jar
包的程序;Start-Class
:代表了Spring Boot
程序的入口类,这个类中应该有一个main
方法;Spring-Boot-Classes
:代表了类的路径,所有编译后的class
文件,以及配置文件,都存储在该路径下;Spring-Boot-Lib
:表示依赖的jar
包存储的位置;
这些值都是SpringBoot
打包插件会默认生成的,如果没有这些属性,SpringBoot
程序自然不能运行,就会报错:jar中没有主清单属性,也就是说没有按照SpringBoot
的要求,生成这些必须的属性。
解决方法:在启动类子程序中添加:spring-boot-maven-plugin
应该就不会出问题了。
5. 参考
SpringBoot 项目部署(初级)的更多相关文章
- springboot项目部署云服务器
Springboot项目部署云服务器 springboot项目部署云服务器还是挺简单的 首先你要有java运行环境,就是jdk的安装,如果还没有装没有参考安装:阿里云ECS建网站(建站)超详细全套完整 ...
- 2019-03-26 SpringBoot项目部署遇到跨域问题,记录一下解决历程
近期SpringBoot项目部署遇到跨域问题,记录一下解决历程. 要严格限制,允许哪些域名访问,在application.properties文件里添加配置,配置名可以自己起: cors.allowe ...
- 多个springboot项目部署在同一tomcat上,出现jmx错误
多个springboot项目部署在同一tomcat上,出现jmx错误 原因:因为jmx某些东西重复,禁用jmx就可以了 endpoints.jmx.unique-names=true
- React+SpringBoot项目部署
静态资源访问配置 https://www.jianshu.com/p/b6e0a0df32ec https://segmentfault.com/q/1010000012240531/a-102000 ...
- springboot项目部署(war包)
将springboot项目打包成war,并且部署到tomcat.比较麻烦,自己踩的坑也比较多.算了一下,找bug的时间,有两天熬到凌晨2点. 修改pom.xml使得打包成war <groupId ...
- springboot项目部署到独立tomcat的爬坑集锦
目录 集锦一:普通的springboot项目直接部署jar包 集锦二:springboot项目不能直接打war包部署 集锦三:因为tomcat版本问题导致的lombok插件报错:Invalid byt ...
- linux小白成长之路10————SpringBoot项目部署进阶
[内容指引] war包部署: jar包部署: 基于Docker云部署. 一.war包部署 通过"云开发"平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的 ...
- SpringBoot项目部署进阶
一.war包部署 通过“云开发”平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的方式.但是,因为某些原因,软件需求方特别要求用war形式打包,我们该怎么做? 1.项目尚未开 ...
- SpringBoot_11_将springboot项目部署到外部tomcat上
一.前言 二. 三.参考资料 如何将Spring Boot项目打包部署到外部Tomcat 2.SpringBoot 项目如何在tomcat容器中运行
随机推荐
- 使用 Azure 静态 Web 应用服务免费部署 Hexo 博客
一.前言 最近在折腾 Hexo 博客,试了一下 Azure 的静态 Web 应用服务,发现特别适合静态文档类型的网站,而且具有免费额度,支持绑定域名.本文只是以 Hexo 作为示例,其他类型的框架也是 ...
- 水电表/燃气表/压力表/传感器/仪器仪表等,超低功耗段码LCD液晶显示驱动IC-VKL144A/B 超低工作电流,36*4COM显示,替代PCF8551/MCP144/BU9792/9B92/BL55072B等
煤气罐的使用安全隐患较大,现在大部分城市使用管道输送燃气,燃气表的计费大都是通过远程抄表的方式,或者充值的方式,为了让用户更好地了解自家燃气表的使用情况,需要一款液晶屏来显示燃气表的状态和用气量等信息 ...
- BACnet MS/TP转MQTT网关金鸽BL103
BACnet MS/TP转MQTT网关金鸽BL103BL103是一款BACnet路由器,实现 BACnet MS/TP 总线和以太网 BACnetIP 之间通信路由功能,同时也是一款Modbus RT ...
- 服务器配置IP
1.服务器系统一般有两个或多个网卡.在企业中一般给服务器网卡配一个可连外网的IP,如172.16.20.22 255.255.255.0 172.16.20.1 方便联网下载安装部分软件,若没有VPN ...
- PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏
一:背景 上一篇我们聊到了如何用 PerfView 去侦察 NTHeap 的内存泄漏,这种内存泄漏往往是用 C 的 malloc 或者 C++ 的 new 分配而不释放所造成的,这一篇我们来聊一下由 ...
- vscode 插件 Cnblogs Client For VSCode
目录 简介 主要功能 登录 / 授权 将本地 markdown 文件发布到博客园 博客园博文列表 将本地文件关联到博客园博文 拉取远程博文内容更新本地文件 图片上传 博文分类管理 导出 pdf 博文设 ...
- 【NOI P模拟赛】寻找道路(bfs,最短路)
题面 一道特殊的最短路题. 给一个 n n n 个点 m m m 条有向边的图,每条边上有数字 0 \tt0 0 或 1 \tt1 1 ,定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在 ...
- python压缩pdf(指定缩放比例)
python压缩pdf(指定缩放比例) 原理 pdf文件处理使用https://pymupdf.readthedocs.io/en/latest/index.html库可以轻松实现,该库的官方说明文档 ...
- 7个自定义定时任务并发送消息至邮箱或企业微信案例(crontab和at)
前言 更好熟悉掌握at.crontab定时自定义任务用法. 实验at.crontab定时自定义任务运用场景案例. 作业.笔记需要. 定时计划任务相关命令及配置文件简要说明 at 工具 由包 at 提供 ...
- 字符类数据类型和oracle字符类型的区别
为兼容Oracle的数据类型,KingbaseES扩展了Oracle的NUMBER.VARCHAR2.CHAR(n)和DATE类型.该措施使得移植Oracle的Create Table等DDL语句时, ...