04-maven学习-pom.xml解析
pom.xml里面各个配置的含义如下:
<!-- 主项目标识,表示当前maven属于哪个实际项目,与包是一样的 --> <groupId>反写的公司网址+项目名</groupId> <!-- 模块标识--> <artifactId>项目名+模块名</artifactId> <!-- 版本号,一般由三个数字组成 第一个0,表示大版本号, 第二个0表示分支版本号, 第三个0表示小版本号, snapshot 快照 beta 公测 alpha 内测 Release 稳定 GA正式发布 --> <version></version> <!-- 打包的方式,默认为jar,还可以打包成war,zip,pom --> <packaging></packaging> <!-- 项目描述名 --> <name></name> <!-- 项目的地址 --> <url></url> <!-- 项目的描述 --> <description></description> <!-- 开发人员信息 --> <developers></developers> <!-- 许可证信息 --> <licenses></licenses> <!-- 组织信息 --> <organization></organization> <!-- 依赖列表--> <dependencies> <!-- 依赖项 --> <dependency> <groupId></groupId> <artifactId></artifactId> <version></version> <type></type> <!-- 依赖的范围 --> <scope></scope> <!-- 设置依赖是否可选,默认false。 --> <optional></optional> <!-- 排除依赖传递列表 --> <exclusions> <exclusion> </exclusion> </exclusions> </dependency> </dependencies> <!-- 依赖的管理 --> <dependencyManagement> <dependencies> <dependency></dependency> </dependencies> </dependencyManagement> <build> <!-- 插件列表 --> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> </plugin> </plugins> </build> <!-- 用于子模块对父模块pom的继承 --> <parent></parent> <!-- 用来聚合多个maven项 --> <modules> <module></module> </modules>
例如上一节创建的如下:
<groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo01</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>mavenDemo01</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
依赖范围:<scop>
三种classpath:
- 编译
- 测试
- 运行
scop选项:
- compile:默认的范围,编译测试运行都有效
- provided:在编译和测试时候有效
- runtime:在测试和运行时有效
- test:只在测试范围有效
- system:与本机系统相关联,可移植性差。
- import:导入的范围,只使用在dependenceManagement中。表示从其他的pom中导入dependecy的配置
依赖传递
这里建立三个maven项目演示
demo02要依赖demo01,要想依赖,必须在本地仓库安装demo01的项目,
首先对demo01进行如下操作:
1,右键demo01,使用maven方式运行,将其打包:
2,将mavendemo01安装到本地仓库中,同样执行maven方式运行,执行install命令。
在demo02中加入demo01的依赖:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo01</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
如下:
同样方式将demo02安装,为了省去操作,同时执行两个命令:clean install
在demo03中依赖demo02项目。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo02</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
同样对demo03安装到本地仓库。
观察mavenDemo03的依赖包发现,demo03本来只想依赖demo02,但是连demo01也依赖了,
这表明依赖具有传递性。
要想不依赖demo01,使用exclusions,可以排除demo01的依赖。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo02</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion><!--下面填入mavenDemo01的坐标--> <groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo01</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
保存后发现只剩demo02的依赖了。
依赖冲突
解决依赖冲突的两条原则:
1,短路优先:A->B-C->X(jar)
A->D->X(jar)
由于第二条路比较短,会依赖第二条的方式。
2,先声明先优先:
如果路径长度相同,则谁先声明,先解析谁。
聚合和继承
聚合
如果想要将多个项目进行install,安装到本地仓库中,必须对其依次进行install命令。
而聚合可以将多个项目放到一起运行,同时安装。
例如:将前面的三个项目聚合,一起安装。
新建一个mavenDemo04,在pom.xml里面配置如下:
首先把packaging改成pom
<groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo04</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging>
然后添加聚合标签:分别加入要安装的三个项目
<modules> <module> ../mavenDemo01 </module> <module> ../mavenDemo02 </module> <module> ../mavenDemo03 </module> </modules>
而这里的dependency无所谓了,可以删除。
然后运行maven命令,执行 clean install命令。
此时就同时安装了三个项目到本地仓库。
继承
例如对于之前的三个项目中,每个项目都依赖了一个junit,其实这样重复了很多,可以使用继承方式代替这种。
1,新建一个demo5,demo5中定义如下:
<groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo05</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>mavenDemo05</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>3.8.1</junit.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
一共关注三点:
1,将packaging改为pom
2,在properties中新增一共junit.version属性。然后可以在version标签中通过${属性名}的方式使用。
3,新增一个dependencyManagement标签,将dependencyies标签放进去。
假如在demo3中继承这里。
demo3中junit依赖定义如下:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
</dependencies>
修改,需要将上面的红色部分删除,然后添加一个parent标签。parent标签引入demo05的坐标。
<parent> <groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo05</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo02</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.maven.mavenDemo</groupId> <artifactId>mavenDemo01</artifactId> </exclusion> </exclusions> </dependency> </dependencies>