Maven项目引用本地jar涉及scope和systemPath配置

Scope属性

XML 复制代码
<dependency>
    <groupId>com.hik</groupId>
    <artifactId>examples</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/examples.jar</systemPath>
</dependency>

先在pom文件中将依赖换成读取本地:<systemPath>

然后通过<scope>标签控制该jar包(依赖)的生存周期:

1. ‌**compile(默认作用域)**‌

  • ‌可用阶段‌:编译、测试、运行
  • ‌传递性‌:会传递给依赖项目
  • ‌打包行为‌:包含在项目构建的输出中(如 JAR/WAR 文件)
  • ‌典型场景‌:项目核心依赖(如 Spring Framework、日志库)
XML 复制代码
<dependency>
    <groupId>com.hik</groupId>
    <artifactId>examples</artifactId>
    <version>1.0.0</version>
    <scope>compile</scope> <!-- 可省略 -->
    <systemPath>${project.basedir}/lib/examples.jar</systemPath>
</dependency>

2. ‌provided‌

  • ‌可用阶段‌:编译、测试
  • ‌传递性‌:不会传递
  • ‌打包行为 ‌:‌不包含‌在构建输出中
  • ‌典型场景‌:容器提供的依赖(如 Servlet API、JavaEE API)
XML 复制代码
<dependency>
    <groupId>com.hik</groupId>
    <artifactId>examples</artifactId>
    <version>1.0.0</version>
    <scope>provided</scope>
    <systemPath>${project.basedir}/lib/examples.jar</systemPath>
</dependency>

3. ‌runtime‌

  • ‌可用阶段‌:测试、运行
  • ‌传递性‌:会传递
  • ‌打包行为‌:包含在构建输出中
  • ‌典型场景‌:运行时需要的驱动或实现(如 JDBC 驱动)
XML 复制代码
<dependency>
    <groupId>com.hik</groupId>
    <artifactId>examples</artifactId>
    <version>1.0.0</version>
    <scope>runtime</scope>
    <systemPath>${project.basedir}/lib/examples.jar</systemPath>
</dependency>

4. ‌test‌

  • ‌可用阶段‌:仅测试阶段
  • ‌传递性‌:不会传递
  • ‌打包行为‌:不包含在构建输出中
  • ‌典型场景‌:测试框架(JUnit、Mockito)
XML 复制代码
<dependency>
    <groupId>com.hik</groupId>
    <artifactId>examples</artifactId>
    <version>1.0.0</version>
    <scope>test</scope>
    <systemPath>${project.basedir}/lib/examples.jar</systemPath>
</dependency>

5. ‌**system(谨慎使用)**‌

  • ‌可用阶段‌:编译、测试(需手动配置运行)
  • ‌传递性‌:不会传递
  • ‌打包行为‌:默认不包含,需特殊配置
  • ‌典型场景‌:本地特殊 JAR(无法从仓库获取)
XML 复制代码
<dependency>
    <groupId>com.hik</groupId>
    <artifactId>examples</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/examples.jar</systemPath>
</dependency>

6. ‌**import(特殊作用域)**‌

  • ‌可用阶段‌:仅依赖管理
  • ‌传递性‌:不会传递
  • ‌打包行为‌:不包含
  • ‌典型场景‌:继承其他 POM 的依赖管理
XML 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.hik</groupId>
            <artifactId>examples</artifactId>
            <version>1.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

作用域对生命周期阶段的影响

作用域 编译 测试 运行 打包 传递依赖
‌compile‌ ✔️ ✔️ ✔️ ✔️ ✔️
‌provided‌ ✔️ ✔️ ❌ ❌ ❌
‌runtime‌ ❌ ✔️ ✔️ ✔️ ✔️
‌test‌ ❌ ✔️ ❌ ❌ ❌
‌system‌ ✔️ ✔️ ⚠️* ️* ❌

⚠️ system 作用域:运行和打包需要额外配置(如添加 <includeSystemScope>true</includeSystemScope>)

最佳实践建议

  1. ‌避免使用 system 作用域 ‌:优先将本地 JAR 安装到仓库 (mvn install:install-file)
  2. ‌作用域最小化原则 ‌:使用能满足需求的最严格作用域(如能用 runtime 不用 compile)
  3. ‌provided 作用域用于容器依赖‌:防止与容器提供的库冲突
  4. ‌test 作用域隔离测试依赖‌:减少最终包大小
  5. ‌使用 mvn dependency:tree 验证‌:检查依赖传递和冲突

打包扫描(jar包)

使用system引用时,<scope>,<systemPath>标签,这种方式在部署时才会出现的问题。部署到容器运行时,就会提示找不到类,因为该jar未被注入到项目lib中,需要在pom文件中增加打包扫描的配置。

需要配置 <build>

XML 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
            </configuration>
        </plugin>
     </plugins>
     <finalName>${project.artifactId}</finalName>
</build>
相关推荐
最强小杰12 分钟前
Claude Opus 4.8 调用报 529 怎么办?并发限制触发过载——退避策略与降级方案完整指南
运维·网络·python·ai
databook25 分钟前
MinMax vs Standard vs Robust:三种特征缩放怎么选
python·机器学习·数据分析
在世修行27 分钟前
智学文枢:实体模型层
python·orm·sqlalchemy
张张123y1 小时前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
CCblandy1 小时前
一致性哈希到底省了多少搬迁?本机实测 3 轮:取模 6→7 搬 85.8%,V=128 只搬 14.3%,虚拟节点太少会被倾斜骗
后端·python·云原生·性能优化·架构
Yan-英杰1 小时前
【论文精读】 基于 TensorFlow 对卷积神经网络的优化研究:异构式 CPU+GPU 协同计算 + ReLU-Swish 激活函数
python·卷积神经网络
ydjs678899-bot1 小时前
如何在Java中打印pdf静默打印和打印对话框选择
java·python·pdf
把我格子衫拿来2 小时前
误差预算怎么做?从雅可比到蒙特卡洛的三维定位不确定度分析
python·蒙特卡洛·三维定位·误差分析·不确定度
文章永久免费只为良心2 小时前
Ctfshow_Web应用安全与防护_第二章_无字母数字命令执行
前端·python·安全·网络安全·渗透测试·ctf·红队渗透测试
2601_962885722 小时前
如何用 Python 获取上证指数、沪深300、中证500 等指数行情?
开发语言·python