如何在应用pom.xml中正确引入库/SDK的shaded POM?
问题根因
你的操作无效核心是两个认知错误:
target是Maven构建生成的临时产物目录,执行mvn clean时会直接清空整个目录下的所有文件,你复制进去的pom文件会被直接删除,根本不会被Maven解析。*-shaded.pom只是Maven Shade Plugin生成的依赖声明文件,本身不包含任何类和jar资源,单独复制这个文件没有任何作用;且Maven解析依赖只会从本地仓库、配置的远程仓库拉取构件,不会读取项目target目录下的文件。
正确配置步骤
1. 先在SDK项目完成构建并安装到本地Maven仓库
首先确保你的SDK项目中maven-shade-plugin配置正确,参考如下配置(放在SDK项目的pom.xml中):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 自动生成精简后的依赖pom,避免传递重复依赖 --> <createDependencyReducedPom>true</createDependencyReducedPom> <!-- 将shaded后的全量jar作为项目主构件,替换原普通jar --> <shadedArtifactAttached>false</shadedArtifactAttached> <!-- 如果需要保留原普通jar,可将上一项设为true,打开下方配置指定shaded包的classifier --> <!-- <shadedClassifierName>shaded</shadedClassifierName> --> </configuration> </execution> </executions> </plugin>
配置完成后,在SDK项目根目录执行命令:mvn clean install
该命令会自动把包含所有依赖的shaded jar、对应的shaded pom一并安装到本地Maven仓库(默认路径为~/.m2/repository/[你的SDK groupId]/[你的SDK artifactId]/[版本号]/),不需要手动复制任何文件。
2. 在示例应用中引入SDK依赖
打开示例应用的pom.xml,在<dependencies>节点下添加SDK的依赖坐标即可:
<dependency> <groupId>com.yourcompany.sdk</groupId> <!-- 替换为SDK项目实际的groupId --> <artifactId>java-sdk</artifactId> <!-- 替换为SDK项目实际的artifactId --> <version>1.0.0-SNAPSHOT</version> <!-- 如果之前配置了shadedClassifierName,需要添加下方配置指定classifier --> <!-- <classifier>shaded</classifier> --> </dependency>
配置完成后在示例应用目录执行mvn clean compile或对应的构建/启动命令,Maven会自动从本地仓库拉取全量SDK包完成集成。
注意事项
- 如果需要给团队其他成员复用SDK,不要只在本地安装,执行
mvn clean deploy将shaded产物部署到公司私有Maven仓库即可,其他成员直接引用相同坐标就能拉取使用。 - 如果集成后出现类找不到、类冲突问题,执行
mvn dependency:tree查看依赖树,确认是否有其他同名依赖覆盖了SDK版本、或者shade插件配置遗漏了部分依赖。 - 不要手动复制jar/pom文件到本地仓库路径,手动操作很容易出现路径不匹配、校验和错误的问题,通过Maven命令安装/部署的构件会自动生成正确的元数据。
内容的提问来源于stack exchange,提问作者Dr Drake Ramoray
相关产品推荐
相关产品推荐

