之前的项目一直在本地电脑上写,最近需要将项目部署到服务器上进行联调测速度。于是,在网上搜集资料后简单的进行一下总结。

由于本次打包部署是为了测试,于是很多内容做的还不算详尽只是将项目简单的打包为jar包。

1. SpringBoot 父子项目架构

可以看出,目前的父子项目架构主要划分为:

  1. EEGSystem:父项目
  2. eeg-analyze-web:子模块
  3. sleep-stage-module:子模块,暂时作为启动类模块使用;

由于,目前项目的代码均在sleep-stage-modul模块中,另一个模块中还没有写代码。所以在后续打包过程中,将sleep-stage-module模块的启动类作为该项目的唯一入口(后面会解释什么是项目唯一入口)。

注意事项:父工程创建为Maven,启动类所在模块创建时一定要用SpringBoot项目,其他子模块创建时MavenSpringBoot都可以

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>

主要有以下注意点

  1. 父工程的打包方式必须为:pom
  2. 必须在父工程中显式声明子工程模块
  3. 父工程不可以引入: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>

主要有以下注意点

  1. 在子工程中显式声明所属父工程;
  2. 必须在唯一启动类子工程中引入spring-boot-maven-plugin打包插件,并且要配置将所依赖的jar包全都打到这一包中;
  3. 其他子工程中不要引入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,在父工程下依次选择:cleanpackage即可。

注意:虽然要将所有的jar都搭到main这个jar中,但是我们执行cleanpackage却是要对父工程进行

此时,我们需要将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. 参考

  1. springboot项目父子多模块打包
  2. Spring Boot:jar中没有主清单属性

SpringBoot 项目部署(初级)的更多相关文章

  1. springboot项目部署云服务器

    Springboot项目部署云服务器 springboot项目部署云服务器还是挺简单的 首先你要有java运行环境,就是jdk的安装,如果还没有装没有参考安装:阿里云ECS建网站(建站)超详细全套完整 ...

  2. 2019-03-26 SpringBoot项目部署遇到跨域问题,记录一下解决历程

    近期SpringBoot项目部署遇到跨域问题,记录一下解决历程. 要严格限制,允许哪些域名访问,在application.properties文件里添加配置,配置名可以自己起: cors.allowe ...

  3. 多个springboot项目部署在同一tomcat上,出现jmx错误

    多个springboot项目部署在同一tomcat上,出现jmx错误 原因:因为jmx某些东西重复,禁用jmx就可以了 endpoints.jmx.unique-names=true

  4. React+SpringBoot项目部署

    静态资源访问配置 https://www.jianshu.com/p/b6e0a0df32ec https://segmentfault.com/q/1010000012240531/a-102000 ...

  5. springboot项目部署(war包)

    将springboot项目打包成war,并且部署到tomcat.比较麻烦,自己踩的坑也比较多.算了一下,找bug的时间,有两天熬到凌晨2点. 修改pom.xml使得打包成war <groupId ...

  6. springboot项目部署到独立tomcat的爬坑集锦

    目录 集锦一:普通的springboot项目直接部署jar包 集锦二:springboot项目不能直接打war包部署 集锦三:因为tomcat版本问题导致的lombok插件报错:Invalid byt ...

  7. linux小白成长之路10————SpringBoot项目部署进阶

    [内容指引] war包部署: jar包部署: 基于Docker云部署. 一.war包部署 通过"云开发"平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的 ...

  8. SpringBoot项目部署进阶

    一.war包部署 通过“云开发”平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的方式.但是,因为某些原因,软件需求方特别要求用war形式打包,我们该怎么做? 1.项目尚未开 ...

  9. SpringBoot_11_将springboot项目部署到外部tomcat上

    一.前言 二. 三.参考资料 如何将Spring Boot项目打包部署到外部Tomcat 2.SpringBoot 项目如何在tomcat容器中运行

随机推荐

  1. docker安装confluence

    目录 一.docker安装 二.破解 三.配置mysql数据库 四.域名配置 五.参考 一.docker安装 1.安装镜像 docker pull atlassian/confluence-serve ...

  2. Webpack干货系列 | 在 Webpack 5 集成 ESLint 的方法

    程序员优雅哥(youyacoder)简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解运用Webpack 5 中集成 ESLint 的方 ...

  3. 体验Lambda的更优写法和Lambda标准格式

    体验Lambda的更优写法 借助Java8的全新语法,上述Runnable接口的匿名内部类写法可以通过更简单的Lambda表达式达到等效: public class Lambda02 { public ...

  4. python 文件操作(读写等)

    简介 在实际开发中我们需要对文件做一些操作,例如读写文件.在文件中新添内容等,通常情况下,我们会使用open函数进行相关文件的操作,下面将介绍一下关于open读写的相关内容. open()方法 ope ...

  5. Deployment之滚动更新策略。

    1.Deployment控制器详细信息中包含了其更新策略的相关配置.kubectl describe命令中输出的StrategyType.RollingUpdateStrategy字段等: root@ ...

  6. 在Centos7.3下使用Siege对Django服务进行压力测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_87 Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续 ...

  7. 使用Hexo建立一个轻量、简易、高逼格的博客

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_93 在之前的一篇文章中,介绍了如何使用Hugo在三分钟之内建立一个简单的个人博客系统,它是基于go lang的,其实,市面上还有一 ...

  8. [spring]spring详细总结

    spring 1.spring简介 Spring框架是一个开源的应用程序框架,是针对bean的生命周期进行管理的轻量级容器. Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强 ...

  9. Blazor和Vue对比学习(进阶2.2.3):状态管理之状态共享,Blazor的依赖注入和第三方库Fluxor

    Blazor没有提供状态共享的方案,虽然依赖注入可以实现一个全局对象,这个对象可以拥有状态.计算属性.方法等特征,但并不具备响应式.比如,组件A和组件B,都注入了这个全局对象,并引用了全局对象上的数据 ...

  10. 【原创】Auto.js get和post 案例

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Auto.js get和post 案例 ...