一、场景:
开发中常常遇到多个项目共同依赖某些公共项目的情况
- 比如:“二维码生成-解析包”就同时被内网端和外网端依赖使用;
- 再比如:基于Dubbo-RPC的微服务系统,生产者和消费者往往依赖同一批service接口,此时最佳实践就是将这批接口独立成maven模块,打包成sdk包;
- 还比如:自定义的Spring-boot-starter;
共享依赖包可以有效的复用代码,同时也提高了可维护性。
二、打包方式
- 关键点在共享依赖包的pom.xml配置文件的两项;
- 快速构建一个空的Spring-boot项目,如果此独立jar包不需要,不勾选任何功能组件,目录结构如下:
├─.mvn
│ └─wrapper
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─yang
│ │ └─sdk
│ └─resources
└─test
└─java
└─com
└─yang
└─sdk
删掉test、resources目录和MainClass;添加service目录已存放共享源码,此时目录结构如下:
├─.mvn
│ └─wrapper
└─src
└─main
└─java
└─com
└─yang
└─sdk
└─service
- 修改pom.xml
关键点在packaging节点声明本模块达成jar包,build节点声明打包的源码位置
<?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>
<groupId>com.yang</groupId>
<artifactId>sdk</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>sdk</name>
<description>Demo project for sharing-jar</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!--
<dependencies>
若有需要可以添加依赖
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>7.7.2</version>
</dependency>
</dependencies>
-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
- 上层模块可以使用GAV坐标,对共享模块进行依赖,打包父pom即可自动将共享包打入上层模块中,形成完整的fat-jar。
若上层模块和共享模块不在同一个父pom下,通过maven-install将共享模块的jar安装到本地maven-repo和nexus中即可。