maven
常用命令
常见属性标签
Scope
scope定义了类包在项目的使用阶段。项目阶段包括:编译,运行,测试和发布
scope属性说明
- compile
- 默认scope为compile,表示当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包时, 会打到包里面
- test
- 该依赖仅仅参与测试相关的内容,包括测试用例的编译和运行,比如定性的Junit
- runtime
- 依赖仅参与运行周期中的使用。一般这种类库都是接口与实现相分离的类库,比如JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才需要具体的mysql、oracle等等数据的驱动程序。此类的驱动都是为runtime的类库。
- provided
- 该依赖在打包过程中,不需要打进去,这个由运行的环境来提供,比如tomcat或者基础类库等等,事实上,该依赖可以参与编译、测试和运行等周期,与compile等同。区别在于打包阶段进行了exclude操作。
- system
- 使用上与provided相同,不同之处在于该依赖不从maven仓库中提取,而是从本地文件系统中提取,其会参照systemPath的属性进行提取依赖。
- import
- 这个是maven2.0.9版本后出的属性,import只能在dependencyManagement的中使用,能解决maven单继承问题,import依赖关系实际上并不参与限制依赖关系的传递性。
SystemPath
当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径,例如:
<dependency>
<groupId>com.taobao</groupId>
<artifactId>api</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../rookie-system/src/main/resources/lib/taobao-sdk-java.jar</systemPath>
</dependency>
打jar包时,includeSystemScope 该标签项可以将外部引用包打包:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--该配置项的作用是:打包外部jar (scope为system)-->
<!--
<dependency>
<groupId>com.taobao</groupId>
<artifactId>api</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../rookie-system/src/main/resources/lib/taobao-sdk-java.jar</systemPath>
</dependency>
-->
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
optional + Exclusions
optional 可选依赖
Exclusions 排除jar包
Optional和Exclusions都是用来排除jar包依赖使用的,两者在使用上却是相反。
Optional定义后,该依赖只能在本项目中传递,不会传递到引用该项目的父项目中,父项目需要主动引用该依赖才行。
Exclusions则是主动排除子项目传递过来的依赖。
用法区别
应用场景:projectA 依赖projectB, projectB 依赖projectC时
B pom.xml
<project>
...
<dependencies>
<dependency>
<groupId>sample.ProjectC</groupId>
<artifactId>Project-C</artifactId>
<version>1.0</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
如上A依赖B,B依赖C用的
如果B不用
**A如果不需要C则需要主动排除B传递过来的C。
<dependencies>
<dependency>
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>sample.ProjectC</groupId>
<artifactId>Project-C</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>