背景: 一个项目包含多个模块, 是一个个独立的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