无法从GitLab Package Registry导入Maven依赖问题
问题原因
该问题和GitLab/GitHub Package Registry的权限、仓库配置无关,核心原因是上传到包仓库的源项目产物是Spring Boot可执行fat jar,不是可供其他项目依赖的标准Maven jar包。
Spring Boot默认的spring-boot-maven-plugin打包生成的可执行jar,会把所有业务类放到BOOT-INF/classes/路径下,第三方依赖放到BOOT-INF/lib/路径下,不符合Maven依赖jar的标准目录结构(标准jar的业务类直接放在包路径根目录下)。Maven和IDEA只要能根据坐标下载到对应jar文件,就会在依赖列表中识别到该依赖,不会校验jar内部结构,因此会出现依赖可见但类无法导入的现象,无论把包上传到哪个公有/私有仓库都会出现同样问题。
解决方法
1. 修改源项目打包配置,生成可供依赖的标准jar
在源项目pom.xml的spring-boot-maven-plugin配置中添加执行节点,让打包时同时生成可执行fat jar和标准依赖jar:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> <!-- 新增以下配置 --> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> </configuration> </execution> </executions> </plugin> </plugins> </build>
配置完成后执行mvn deploy上传时会生成两个产物:
- 带
exec分类符的是原Spring Boot可执行fat jar,用于直接启动服务 - 不带分类符的是符合Maven规范的普通jar,类路径结构正确,可供其他项目作为依赖引用
2. 补全目标项目的Maven配置
- 确认目标项目使用的Maven
settings.xml中,已经配置了和仓库id完全匹配的认证信息(即你之前配置的Private-Token,server的id必须和仓库配置的id一致,均为gitlab-maven) - 在目标项目pom.xml中添加GitLab Maven仓库配置,仅添加依赖坐标不配置仓库会导致依赖拉取异常:
<repositories> <repository> <id>gitlab-maven</id> <url>https://gitlab.com/api/v4/projects/37087069/packages/maven</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
3. 清理缓存重新拉取依赖
- 删除本地Maven仓库路径下之前拉取的错误版本缓存,即
com/elmojke/issue-tracker整个目录 - 源项目重新执行
mvn deploy上传新生成的合规jar包 - 目标项目执行
mvn clean install -U强制拉取最新版本依赖,刷新IDEA的Maven项目后即可正常导入使用依赖中的类
补充:如果源项目的定位就是公共依赖库,更推荐直接创建普通Maven Java项目,仅引入需要的Spring组件依赖,不需要配置Spring Boot可执行打包逻辑,从根源上避免jar结构不符合规范的问题。
内容的提问来源于stack exchange,提问作者elmojke
相关产品推荐
相关产品推荐

