SpringBoot多模块引用报错

文章目录

  • 一. 问题背景
  • 二. 前言
  • 三. 解决方案
  • 四. maven-compiler-plugin与spring-boot-maven-plugin的区别
    • 4.1 maven-compiler-plugin
    • 4.2 spring-boot-maven-plugin
  • 五. 报错的原因

一. 问题背景

如下图所示,gmall项目里面有common、portal、redis3个模块。gmall项目为pom,portal模块为jar,portal引用common模块中的某些类。 把portal运行在Linux服务器上面,发送请求到portal时,portal需要使用common的某些类,报错了。 然而在本地idea运行时是不会报错的。

SpringBoot多模块引用报错_第1张图片

二. 前言

关于报错的原因,笔者不能百分百的确定,也不保证下面列出的解决方案能百分百解决大家的难题。具体问题具体分析吧。

三. 解决方案

需要将项目打成jar或war的,一律使用spring-boot-maven-plugin打包(不要用maven-compiler-plugin)。 无需打成jar或war的,无需引用maven插件打包

gmall的pom.xml以及gmall-portal的pom.xml,修改都如下:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    pluginManagement>
build>

gmall-common无需打成jar或者war,它是提供给其他模块调用的常用工具类,所以无需加spring-boot-maven-plugin插件

四. maven-compiler-plugin与spring-boot-maven-plugin的区别

4.1 maven-compiler-plugin

使用maven-compiler-plugin插件可以 指定项目源码的jdk版本、编译后的jdk版本以及编码。可以将项目打成普通的jar

4.2 spring-boot-maven-plugin

Spring Boot Maven plugin能够 将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用。

五. 报错的原因

上面讲了两个maven插件的区别。如果不限定只用springboot的maven插件打包,普通的maven插件也打了包,那么最后完成打包的插件打出来的包会覆盖先完成打包的插件打出来的包。即有时候可执行的common模块jar包会覆盖了普通的common模块jar包,导致有时候其他模块引用了common的可执行jar会出错,会导致模块间调用报错的。因此限定需要打成jar或war的模块都使用springboot的maven插件打包。

你可能感兴趣的:(解决方案,每日一写,maven)