欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Maven dependencie 属性scope,optional

程序员文章站 2022-06-07 19:45:31
...

scope

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

scope maven(package) runtime
compile test 是否参与打包
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时未使用。

相关标签: maven