SpringBoot 项目部署(初级)

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

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

  1. SpringBoot 父子项目架构

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

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

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

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

  1. 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>
  1. 打包

通过 Maven,在 父工程下依次选择: cleanpackage即可。

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

此时,我们需要将 sleep-stage-module下的 main.jar移动到服务器上,然后运行: java -jar main.jar即可。

当然,这样操作是在命令行运行。一旦命令行关闭,那就停止运行了。我们可以通过 nohup指令将程序提交到后台运行。

  1. 可能出现的问题

如果按照上面的步骤来说,应该不会出现这个问题。但是,我第一次并没有按照上述步骤进行,而是按照另一个教程搞得。结果出现了下面的问题,简单记录一下:

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 应该就不会出问题了。

  1. 参考

  2. springboot项目父子多模块打包

  3. Spring Boot:jar中没有主清单属性

Original: https://www.cnblogs.com/404er/p/springboot_packing.html
Author: 睡觉不打呼
Title: SpringBoot 项目部署(初级)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643725/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球