Maven dependencie 属性scope,optional

本文详细解析Maven中依赖包的scope属性,包括compile、provided、runtime、test和system五种使用范围,以及它们在不同阶段的行为差异。通过具体示例,帮助读者理解如何正确配置依赖,以满足项目的不同需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scope

scope属性用于限制依赖包的使用范围,它有五个可用的值。下表假设,所有代码均做了test单元。

scopemaven(package)runtime
compiletest是否参与打包
compile(默认)
provided     ×
system      ×
runtime       ×
test √(如果跳过了test则不会编译)××
  • compile       默认的scope,所有的classpaths可用,依赖可以传播到所有被依赖的项目,被compile修饰的包会被打进项目包。
  • provided      与compile很相似,但它所修饰的包需要在runtime期被另行提供,不会被打进项目包。例如:servlet-api
  • runtime        表示在编译期不需要,但需要被执行,在runtime和test时需要,但在compile期不需要。一般这种类库都是接口与实现相分离的类库,在编译期只需要接口能保证编译正常,但在test和runtime时需要真正的使用实现类,比如JDBC类库,在编译时仅依赖相关的接口,在具体的运行时,才需要具体的mysql、oracle等等数据的驱动程序。 此类的驱动都是为runtime的类库。一般修饰实现类。
  • test               表示仅在test期使用,不会被打进项目包。
  • system         表示从指定路径加载,而不是从maven库中加载,不参与打包。需要结合systemPath 元素使用,例如:
    <dependency>
        <groupId>*</groupId>
        <artifactId>*</artifactId>
        <version>*</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/*.jar</systemPath>
    </dependency>

     

optional  

boolean类型,默认为false,表示必须依赖。标记依赖是否传递,想象:项目A需要依赖项目B来编译一段代码,但是这段代码在运行期可能不会用到,那么我们不需要为所有项目打包B,所以如果项目X依赖了项目A,那么maven完全不需要为项目Xinstall项目B,此时我们就可以在项目A中将项目B的依赖optional设为true。注意:很多人在遇到这种问题时选择用scope:provided来解决,这种做法是不对的,我们需要知道两种情况的区别,使用scope:provided的场景是代码在runtime时有使用,而optional是代码在runtime时未使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值