0%

maven使用外部依赖

Maven 使用外部依赖:本地 Jar 包的引入方案

在开发中,经常会遇到需要使用中央仓库或远程私服中不存在的外部 Jar 包(如第三方非开源 SDK、定制化组件)的情况。Maven 提供了多种方式引入这类本地依赖,本文将详细介绍最常用的两种方案,并分析其优缺点。

使用 system 范围引入(简单直接)

system 是 Maven 依赖范围的一种,专门用于引用本地文件系统中的 Jar 包,无需通过仓库下载。

配置方式

1
2
3
4
5
6
7
8
9
10
<dependencies>
<dependency>
<groupId>com.example</groupId> <!-- 自定义组织标识 -->
<artifactId>custom-sdk</artifactId> <!-- 自定义项目标识 -->
<version>1.0.0</version> <!-- 自定义版本号 -->
<scope>system</scope> <!-- 声明为 system 范围 -->
<!-- 本地 Jar 包的路径(支持绝对路径或相对路径) -->
<systemPath>${project.basedir}/src/lib/custom-sdk.jar</systemPath>
</dependency>
</dependencies>
  • systemPath 路径说明:
    • ${project.basedir} 表示项目根目录(含 pom.xml 的目录),推荐使用相对路径(如 src/lib/),便于项目迁移。
    • 也可使用绝对路径(如 D:/libs/custom-sdk.jar),但会导致项目在其他机器上不可用,不推荐。

优缺点分析

优点 缺点
配置简单,无需额外操作即可引入依赖 依赖不会被打包到最终产物(如 Jar/War)中,需手动确保运行环境存在该 Jar 包
适合临时测试或本地开发 项目移植性差(需同步本地 Jar 包到其他环境)
Maven 不会管理该依赖的传递依赖(若 Jar 包有依赖,需手动引入)

安装到本地仓库(推荐方案)

将本地 Jar 包安装到 Maven 本地仓库(~/.m2/repository),使其像普通依赖一样被 Maven 管理,解决 system 范围的移植性问题。

操作步骤

  1. 执行安装命令
    使用 mvn install:install-file 命令将 Jar 包安装到本地仓库:

    1
    2
    3
    4
    5
    6
    7
    mvn install:install-file \
    -Dfile=./src/lib/custom-sdk.jar \ # 本地 Jar 包路径
    -DgroupId=com.example \ # 自定义 groupId
    -DartifactId=custom-sdk \ # 自定义 artifactId
    -Dversion=1.0.0 \ # 自定义版本号
    -Dpackaging=jar \ # 打包类型(默认 jar)
    -DgeneratePom=true # 自动生成 POM 文件(可选)
  2. 项目中引用
    安装后,像引入普通依赖一样在 pom.xml 中声明:

    1
    2
    3
    4
    5
    6
    7
    8
    <dependencies>
    <dependency>
    <groupId>com.example</groupId>
    <artifactId>custom-sdk</artifactId>
    <version>1.0.0</version>
    <!-- 无需指定 scope 和 systemPath -->
    </dependency>
    </dependencies>

优缺点分析

优点 缺点
依赖被 Maven 管理,支持打包、传递依赖(若有) 需手动执行安装命令,新环境需重新安装
项目移植性好(只需同步 pom.xml 团队协作时,每个成员都需执行安装命令(或通过私服共享)
支持 mvn package 自动将依赖打入产物

部署到私服(团队协作方案)

对于团队开发,将本地 Jar 包部署到私服(如 Nexus),供所有成员共享,避免每个人手动安装。

操作步骤

  1. 配置私服地址
    pom.xml 中添加部署信息(对应私服的 3rd party 仓库):

    1
    2
    3
    4
    5
    6
    <distributionManagement>
    <repository>
    <id>nexus-3rd-party</id> <!-- 与 settings.xml 中 server 的 id 一致 -->
    <url>http://localhost:8081/repository/3rd-party/</url>
    </repository>
    </distributionManagement>
  2. 配置私服认证
    settings.xml 中添加私服账号密码:

    1
    2
    3
    4
    5
    6
    7
    <servers>
    <server>
    <id>nexus-3rd-party</id>
    <username>admin</username>
    <password>your-password</password>
    </server>
    </servers>
  3. 部署 Jar 包到私服
    执行命令将 Jar 包上传到私服:

    1
    2
    3
    4
    5
    6
    7
    8
    mvn deploy:deploy-file \
    -Dfile=./src/lib/custom-sdk.jar \
    -DgroupId=com.example \
    -DartifactId=custom-sdk \
    -Dversion=1.0.0 \
    -Dpackaging=jar \
    -Durl=http://localhost:8081/repository/3rd-party/ \
    -DrepositoryId=nexus-3rd-party # 与 settings.xml 中 server 的 id 一致
  4. 团队成员引用
    其他成员只需配置私服仓库,即可像普通依赖一样引入:

    1
    2
    3
    4
    5
    6
    7
    <dependencies>
    <dependency>
    <groupId>com.example</groupId>
    <artifactId>custom-sdk</artifactId>
    <version>1.0.0</version>
    </dependency>
    </dependencies>

三种方案对比与选择建议

方案 适用场景 推荐指数
system 范围 本地临时测试、快速验证 ⭐⭐
安装到本地仓库 个人开发、无需团队共享 ⭐⭐⭐⭐
部署到私服 团队协作、多人共享外部依赖 ⭐⭐⭐⭐⭐

maven使用外部依赖

有时候我们使用的依赖在中央仓库和远程仓库中都没有,但是代码中又要使用到,那么如何进行引入呢?

可以使用system作用域,来引用本地的jar包

1
2
3
4
5
6
7
<dependency>
<groupId>abc</groupId>
<artifactId>abc</artifactId>
<version>1.0</version>
<scope>system</scope> <!-- 作用域为system -->
<systemPath>${basedir}\src\lib\abc.jar</systemPath>
</dependency>

欢迎关注我的其它发布渠道