Springboot2.x + maven多模块+ 打包 + 多模块配置文件位置

参考

环境

环境 版本 操作
windows 10
vs code 1.84.2
Spring Boot Extension Pack v0.2.1 vscode插件
Extension Pack for Java v0.25.15 vscode插件
JDK 11
Springboot 2.3.12.RELEASE
Apache Maven 3.8.6

注意

  1. 通过 https://start.aliyun.com/ 应用架构选择 MVC架构 生成的代码,在打包以后运行 jar 报错:“没有主清单属性”
    因为父工程和非 web 入口模块都在 pom.xml 中设置了 spring-boot-maven-plugin,该配置只需要在 web 模块中设置,其他模块与父工程中的 pom.xml 中都需要删除 spring-boot-maven-plugin 的配置。(MVC架构 的 web 模块为 xxx-start)
<build>
        <plugins>
           <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.12.RELEASE</version>
                <configuration>
                    <mainClass>com.example.demo.DemoApplication</mainClass>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

image

  1. 项目多模块好处
    关于mvn多模块的理解内容和现在搜索到以及理解的内容差不多,可以参考一下。

  2. 父工程可以有n多个子模块,命名也不需要按照本文设置,本文这样设置是因为 start.aliyun.com 默认的 MVC架构 生成的代码是这样。

  3. Maven 项目有多种引入 jar 包方式。

    • 指定绝对路径
    • 将项目 mvn install 到本地,然后需要的项目 pom.xml 中引入。
    • ...
  4. 多模块项目默认扫描启动类所在的@Bean,如果子模块需要加载其他模块的@Bean

    1. 在当前模块启动入口类上添加@ComponentScan(value = {"当前包名","要扫描@Bean的包名"})。(@ComponentScan注解不仅要加上子模块要扫描的 @Bean 位置,本模块的也要加上,不然本模块的就无法加载了)
    2. 在当前模块启动入口类上添加@EnableAutoConfiguration,如果在不同模块中存在相同名称或类型的 @Bean,则会出现冲突。可以使用 @Primary 注解指定一个主要的 @Bean,或者使用 @Qualifier@Autowired 注解进行精确匹配。(by gpt)
    3. 在当前模块启动入口类上添加 @Import({ xxxx1.class, xxxx2.class })。(by gpt)
    4. 在每个模块中,你可以定义一个条件类,通过实现 Condition 接口来定义条件规则,然后在该条件类中判断是否加载该模块的 @Bean。(by gpt)

正文

父工程与子模块

一个父工程可以有多个子模块,目录结构大概如下。

..
pom.xml
demo-web
	pom.xml
	src
demo-start
	pom.xml
	src
demo-service
	pom.xml
	src
  1. 父工程 pom.xml 需要指定 packagingpom(默认为jar),以及引入子模块:
    <packaging>pom</packaging>
	<modules>
        <module>demo-start</module>
        <module>demo-web</module>
        <module>demo-service</module>
    </modules>
  1. 所有子模块都需要指定所属父工程(demo-web、demo-start、demo-service子模块的 pom.xml 中都需要设置):
<!--子模块名称,在引入的时候用到,如果是demo-start的pom.xml,那就设置为<artifactId>demo-start</artifactId>-->
<artifactId>xxx</artifactId>
<parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<relativePath>../pom.xml</relativePath>
</parent>
  1. dependencymanagement 与 dependencies 区别

    • dependencies
      如果在父 pom 中定义了某个依赖,那么所有子 pom 都会自动继承这个依赖。
    • dependencyManagement
      dependencyManagement 中声明的依赖,仅仅是声明,并没有真正的引入依赖。这样子模块可以从声明的依赖中,选择自己需要的,而不会继承所有父 pom 中的依赖。
      dependencyManagement 中除了声明依赖,还指定了依赖的版本。这样在子模块的依赖中,就无须指定版本,而是使用 dependencyManagement 指定的版本。
    dependencyMent dependencies
    使用位置 通常是父 pom。 父 pom 与子 pom。
    版本 定义版本,子模块继承时无需指定版本,避免版本混乱。当然也可以使用别的版本进行覆盖,不过一般不这么用。 子模块可以什么也不做来继承父 pom 的依赖,也可以使用别的版本的依赖进行覆盖。
    继承方式 子模块需要在自己的 dependencies 中指定要继承哪些依赖。 子模块什么都不做即可默认继承。
    是否被子模块继承 可以被子模块选择性的继承,避免无效继承。 所有父 pom 中定义的依赖会被所有子模块继承。
    是否引入依赖 只是声明,没有引入依赖,只有在子模块中继承才会真正的引入依赖。 是。
  2. 配置文件

  • 当子模块未引入其他模块,则无法读取其他模块的配置。
  • 当子模块引入其他模块后,可以读取引入模块的配置。
  • 当子模块引入其他模块后,其他模块的相同配置会覆盖当前模块的配置项。
  • 多模块配置文件可以放到 web 入口模块的配置文件中,经过测试别的模块可以获取到。

打包

命令位置默认为:父工程目录

  1. 打包
mvn clean package
  1. 运行 jar
java -jar ./start/target/demo-start-0.0.1-SNAPSHOT.jar
posted @   夏秋初  阅读(469)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示