spring一个项目多个模块聚合打包问题解决方案(最新推荐)

 更新时间:2023年09月27日 10:55:37   作者:糖果店的幽灵  
最近遇到个需求,针对后端解耦模块较多的项目,想在云端启动时简洁些只启动一个jar文件的情景,本文重点给大家介绍spring一个项目多个模块聚合打包问题解决方案,感兴趣的朋友一起看看吧

1.问题描述:

最近遇到个需求,针对后端解耦模块较多的项目,想在云端启动时简洁些只启动一个jar文件的情景。

1)解耦较细多个子module一个项目下

2)只想打到一个包启动一次

3)原解耦架构不想打破、不想重构

2.解决方案

针对此问题spring原生自带处理方式,下面写个demo

一、创建聚合父工程

1.首先使用 Spring Initializr 来快速创建好一个Maven工程。然后删除无关的文件,只需保留pom.xml 文件。这里命名 demo-Project。

在这里插入图片描述

2.然后在 pom.xml 里面声明该父工程包含的子模块。(其它信息就不逐一讲述了,诸如继承SpringBoot官方父工程以及统一依赖管理 请查看下面的注释说明)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.16</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>pom</packaging>
    <groupId>com.example</groupId>
    <artifactId>demo-Project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-Project</name>
    <description>demo-Project</description>
    <modules>
        <module>demo-starter</module>
        <module>demo-one</module>
        <module>demo-tow</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
<!--    <build>-->
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--            </plugin>-->
<!--        </plugins>-->
<!--    </build>-->
</project>

二、创建子模块(module)

分别调整它们的pom.xml 以继承上面的父工程。例如demo-one模块的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>demo-Project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo-one</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-one</name>
    <description>demo-one</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
<!--    <build>-->
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--            </plugin>-->
<!--        </plugins>-->
<!--    </build>-->
</project>

三、编写子模块代码

在这里插入图片描述

注:正常是控制层、业务层、数据层等的解耦,目前是简单多业务架构模式假设每模块里都有自己的service、entity、repo、service等层次代码只是demo简单写了。

1.模块1(demo-one)

启动类 :DemoOneApplication.java (demo-one)

package com.example.demoone;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoOneApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoOneApplication.class, args);
    }
}

控制器:ConTeone.java (demo-one)

package com.example.demoone.controler;
import com.example.demoone.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConTeone {
    @Autowired
    User user;
    @PostMapping("/contest1")
    public String test1(){
        return "test1";
    }
    @PostMapping("/contest1/onebean")
    public User test2(){
        return user;
    }
}

javabean User类:

package com.example.demoone.bean;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.Serializable;
@Data
@Component
@ConfigurationProperties(prefix = "user")
@JsonSerialize
public class User{
    String username;
    String password;
}

配置文件:application.yml (demo-one)

server:
  port: 8081
user:
  username: admin
  password: admin
spring:
  profiles:
    active: true

2.模块2(demo-tow)

启动类 :DemoTowApplication.java (demo-tow)

package com.example.demotow;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoTowApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoTowApplication.class, args);
    }
}

控制器:Contest.java (demo-tow)

package com.example.demotow.controler;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Contest {
    @PostMapping("/contest2")
    public String testTow(){
        return "test2";
    }
}

配置文件:application.yml (demo-tow) 这个不配了没写特殊的东西,只是在demo-one里写了从yml配置好做演示。

四、创建聚合模块 (demo-starter)

创建聚合模块 它的pom.xml 以继承上面的父工程。代码为普通的spring-web的项目即可,拥有初始的 启动类即可。但是启动类需要开启包路径扫描。
要求:

1)开启包扫描;
2)要继承 子模块demo-one、demo-tow;
3)要有打包插件配置 spring-boot-maven-plugin;
4)其他子模块需要去掉打包插件 这很重要。

1. starter聚合模块pom配置 (依赖子模块很重要)

下图依赖了两个子模块。

下图的打包配置,最简单的配置即可,当然看项目而定 有复杂需求按自己实际配置即可。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.16</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-starter</name>
    <description>demo-starter</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>demo-one</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>demo-tow</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.starter聚合模块开启包扫描 (很重要)

特别注意:如果子模块包路径和启动类的根路径一致,不加上述注解也可,我这就是一样的但是为了演示所以还是配置了。

五、打包测试

万事俱备直接打包测试即可了。

在父pom的项目路径下打包

mvn clean package

打出来的包 在 demo-starter所在的路径里,当然运行 install 在本地仓库找也可;发布制品库的话直接发布上去的也是 demo-starter;

六、最后的最后 测试一下效果

启动 demo-starter

java -jar .\demo-starter-0.0.1-SNAPSHOT.jar

demo-one的 返回User的接口

demo-one 的返回string的接口

demo-tow的返回string的接口

到此这篇关于spring一个项目多个模块聚合打包问题解决方案的文章就介绍到这了,更多相关spring多个模块聚合打包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中的Io(input与output)操作总结(二)

    java中的Io(input与output)操作总结(二)

    这一节我们来讨论关于文件自身的操作包括:创建文件对象、创建和删除文件、文件的判断和测试、创建目录、获取文件信息、列出文件系统的根目录、列出目录下的所有文件,等等,感兴趣的朋友可以了解下
    2013-01-01
  • 详解Java 中程序内存的分析

    详解Java 中程序内存的分析

    这篇文章主要介绍了详解Java 中程序内存的分析的相关资料,需要的朋友可以参考下
    2017-04-04
  • java操作Redis缓存设置过期时间的方法

    java操作Redis缓存设置过期时间的方法

    这篇文章主要介绍了java操作Redis缓存设置过期时间的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java使用反射和动态代理实现一个View注解绑定库

    Java使用反射和动态代理实现一个View注解绑定库

    这篇文章主要介绍了Java使用反射和动态代理实现一个View注解绑定库,代码简洁,使用简单,扩展性强,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Spring Boot读取自定义配置文件

    Spring Boot读取自定义配置文件

    在Spring Boot项目中我们经常需要读取application.yml配置文件的自定义配置,今天就来罗列一下从yaml读取配置文件的一些常用手段和方法。
    2021-05-05
  • 使用java实现备份和恢复SQLServer表数据

    使用java实现备份和恢复SQLServer表数据

    这篇文章主要为大家详细介绍了如何使用java实现备份和恢复SQLServer表数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Spring依赖注入的两种方式(根据实例详解)

    Spring依赖注入的两种方式(根据实例详解)

    这篇文章主要介绍了Spring依赖注入的两种方式(根据实例详解),非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • 剖析Fork join并发框架工作窃取算法

    剖析Fork join并发框架工作窃取算法

    这篇文章主要为大家剖析介绍了Fork join并发框架工作窃取算法的示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • mybatis中嵌套查询的使用解读

    mybatis中嵌套查询的使用解读

    这篇文章主要介绍了mybatis中嵌套查询的使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring Boot中配置文件application.properties使用

    Spring Boot中配置文件application.properties使用

    这篇文章主要介绍了Spring Boot中配置文件application.properties使用及spring boot读取application.properties文件的方式,需要的朋友参考下吧
    2018-01-01

最新评论