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时未使用。
下一篇: Optional避免空指针的用法