Maven 多模块项目集成打包方案

背景: 一个项目包含多个模块, 是一个个独立的springboot项目. 以前的部署方案是每个项目都打成一个jar包, 在服务器上分别启动, 这样的坏处是请求分散在不同的端口上, 导致请求地址不能统一.

例如: 用户模块提供登录的接口, http://localhost:8082/user/login

商品模块提供一个按id查找的接口, http://localhost:8083/send/getGoodsById/

这样的方式就产生了不同的请求地址.

如果能在项目打包时打成一个集成包, 即最终只有一个jar包, 启动它即可访问到不同模块的接口.

案例实现步骤:

1. 首先创建子项目

user 模块, 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>

  <parent>
    <groupId>com.hejjon</groupId>
    <artifactId>hejjonroot</artifactId>
    <version>1.1.04</version>
  </parent>

  <artifactId>user</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
    </dependency>
  </dependencies>



</project>

application.yml

server:
  port: 8081


goods 模块, 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>

  <parent>
    <groupId>com.hejjon</groupId>
    <artifactId>hejjonroot</artifactId>
    <version>1.1.04</version>
  </parent>

  <artifactId>goods</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>


  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
    </dependency>
  </dependencies>


</project>

application.yml

server:
  port: 8082


其中关联的父项目 hejjonroot 在以下链接文章里.

https://blog.csdn.net/qq_42026600/article/details/124600333?spm=1001.2014.3001.5502

2. 两个项目分别暴露一个接口

@RestController
@RequestMapping("/login")
public class LoginController {

    @RequestMapping("/doLogin")
    public JSONObject doLogin() {
        JSONObject result = new JSONObject();
        result.put("msg", "登录成功");
        return result;
    }

}
@RestController
@RequestMapping("/send")
public class SendGoodsController {

    @RequestMapping("/getGoodsById/{goodsId}")
    public JSONObject getGoodsById(@PathVariable String goodsId) {
        System.out.println("goodsId = " + goodsId);
        JSONObject result = new JSONObject();
        result.put("msg", "成功请求goods模块的接口");
        return result;
    }
    
}

如果时各自打包的方式, 那么访问这两个接口就要访问不同的地址.

3. 创建集成项目 manager

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>

  <parent>
    <groupId>com.hejjon</groupId>
    <artifactId>hejjonroot</artifactId>
    <version>1.1.04</version>
  </parent>

  <artifactId>manager</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <properties>
    <user.version>1.0.0</user.version>
    <goods.version>1.0.0</goods.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.hejjon</groupId>
      <artifactId>user</artifactId>
      <version>${user.version}</version>
    </dependency>

    <dependency>
      <groupId>com.hejjon</groupId>
      <artifactId>goods</artifactId>
      <version>${goods.version}</version>
    </dependency>

  </dependencies>


  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

创建启动类

@SpringBootApplication
public class ManagerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ManagerApplication.class, args);
    }

}

最终打包就得到集成包了. 打包前首先依次将子项目安装 install, 再最后将manager项目clear -> 

package/install 即可.

访问这两个接口就可以实现统一的端口.

踩坑:

运行jar包报 “XXX中没有主清单属性”, 原因是是在打成的jar包中, META-INF/MANIFEST.MF不含Main-Class信息

解决方法是在集成项目 manager的 pom文件中添加

<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

生成的正确MANIFEST.MF 文件内容如下

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Kern
Start-Class: com.hejjon.ManagerApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.1.4.RELEASE
Created-By: Apache Maven 3.5.3
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值