maven
细说一下maven中的遇到的各种标签,遇到不懂得都会在此更新。
2021-8-30 更~
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<optional>true</optional>
<scope>compile</scope>
<type>jar</type>
</dependency>
<dependencyManagement>
标签
用于同一管理依赖的版本。
两个项目A和B,其中A为父项目,B为子项目。在父项目A的pom.xml中定义如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
那么在B项目中引用同样的测试类无需再填写版本号。(注意父项目需要提前加载依赖,加载的同时需要先去除标签,否则无法加载。)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<optional>
标签
举例子说明:两个项目A和B,其中A为父项目,B为子项目。在父项目A中引入了单元测试的依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<optional>true</optional>
</dependency>
optional标签的默认值是false,当其为true时,表示当前依赖jar是可选的,项目之间不会进行传递。
即父项目A依赖junit单元测试依赖,而子项目B依赖junit单元测试依赖。
好处是:打包B项目的时候,不会包含junit单元测试的jar,节省空间。
<scope>
标签
scope元素主要用来控制依赖的使用范围,指定当前包的依赖范围和依赖的传递性,也就是哪些依赖在哪些classpath中可用。常见的可选值有:compile, provided, runtime, test, system等。
compile(编译)
默认值。compile表示对应依赖会参与当前项目的编译、测试、运行等,是一个比较强的依赖。打包时通常会包含该依赖,部署时会打包到lib目录下。比如:spring-core这些核心的jar包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
test(测试)
scope为test表示依赖项目仅参与测试环节,在编译、运行、打包时不会使用。最常见的使用就是单元测试类了:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
类似单元测试这样的依赖,如果不设置scope为test,很显然它们会被打包、发布,但其实真是环境中并无什么作用。
runntime(运行时)
runntime仅仅适用于运行和测试环节,在编译环境下不会被使用。比如编译时只需要JDBC API的jar,而只有运行时才需要JDBC驱动实现。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
<scope>runtime</scope>
</dependency>
provided(已提供)
provided适合在编译和测试的环境,和compile功能相似,但provide仅在编译和测试阶段生效,provide不会被打包,也不具有传递性。
比如:上面讲到的spring-boot-devtools、servlet-api等,前者是因为不需要在生产中热部署,后者是因为容器已经提供,不需要重复引入。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
system
system范围依赖与provided类似,不过依赖项不会从maven仓库获取,而需要从本地文件系统提供。使用时,一定要配合systemPath属性。不推荐使用,尽量从Maven库中引用依赖。
<dependency>
<groupId>sun.jdk</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
复杂点儿的例子:
有A、B、C三个项目,C依赖B,B依赖A。此时根据scope和optional的不同可以决定C依赖不依赖A。
- 当B通过test、provided依赖A 或者 依赖A的optional为true,则C不依赖A
- 当B通过testruntime、compile依赖A 或者 依赖A的optional为false,则C依赖A
其中B依赖A,C依赖B,传递性的关键是B依赖A时所设置的scope值,当B采用不同的值时对应的依赖关系如下:当B通过test或provided依赖A时,C不依赖A;当B通过runtime或compile依赖A时,C依赖A;
<type>
标签
引入某一个依赖时,必须指定type,这是因为用于匹配dependency引用和dependencyManagement部分的最小信息集实际上是{groupId,artifactId,type,classifier}。
在很多情况下,这些依赖关系将引用没有classifier的jar依赖。这允许我们将标识设置为{groupId,artifactId},因为type的默认值是jar,并且默认classifier为null。
type的值一般有jar、war、pom等,声明引入的依赖的类型
2021-8-27 更~
基础篇
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.justloseit.common</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>justloseit1.0</artifactId>
<!-- 版本号 -->
<version>1.0-SNAPSHOT</version>
<!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 -->
<packaging>pom</packaging>
</project>
父子篇
<parent>
<!--被继承的父项目的构件标识符 -->
<artifactId>justloseit1.0</artifactId>
<!--被继承的父项目的全球唯一标识符 -->
<groupId>com.justloseit.common</groupId>
<!--被继承的父项目的版本 -->
<version>1.0-SNAPSHOT</version>
<!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。
默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项
目的pom,其次在文件系统的这个位置(relativePath位置),
然后在本地仓库,最后在远程仓库寻找父项目的pom。 -->
<relativePath>../pom.xml</relativePath>
</parent>