约定大于配置
我们要遵守Maven的规定的目录结构,因为Maven负责项目的自动化的构建,以编译为例,Maven想要自动编译,那么它肯定得知道我们的Java源文件的位置
目录概述:
src: 源码
---------main
-----------java :Java文件
-----------resources :配置文件
---------test :测试程序
pom.xml :依赖配置文件
示意图
项目周期包括 编译——>测试——>打包——>安装,执行一个命令都是自动的从头开始执行的,比如运行打包命令时,自动的先运行编译测试
注意:运行下面的命令必须在POM.xml目录下
①-------编译----------------------------
mvn compile 会下载所有的依赖,并编译src/main下的所有源文件,生成一个target目 录
mvn test-compile 编译src/test/java下的测试类,也放在target目录下
②-------测试----------------------------
mvn test 测试程序 运行src/test/java下的所有程序 (先编译在测试)
③--------打包--------------------
mvn package 对项目进行打包生成一个jar或者war包(先编译在测试在打包),放在target 目录下
mvn package -DMaven.test.skip=true 跳过测试打包
④---------安装-------------
mvn install 将打成的jar/war包安装到本地仓库中,便于其他的项目进行依赖
坐标就是按照pom文件中配置的GAV
mvn install -Dmaven.test.skip=true:跳过测试安装
⑥-------清理--------
mvn clean 清理target目录下的文件
当你在pom文件中写了一个依赖的坐标后,先去本地仓库找依赖,找不到再去中央仓库下载到本地
<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.0modelVersion>
<description>xxxdescription>
<packing>jarpacking>
<groupId>org.examplegroupId>
<artifactId>mybatisartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.1version>
dependency>
dependencies>
project>
Maven使用三个向量唯一定位一个Maven工程(Jar包)
groupid :公司或者组织的域名倒序
artifactId : 一般都是项目名
version : 版本号
实例
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.1version>
dependency>
Maven工程的坐标(GAV)与仓库中路径的关系
groupid+artifactId+version
代表的就是在仓库中的路径
artifactId+version
代表的就是项目名称
所以以上面的Mybatis为例,它在仓库中的路径就是
org/mybatis/mybatis/3.4.1/mybatis-3.4.1.xxx
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.1version>
dependency>
compile范围的依赖
对主程序和测试程序有效,参与打包(主程序参与打包,测试程序不参与打包) 参与部署
test范围的依赖
只对测试程序有效,对于主程序无效,不参与打包 (典型的就是Junit)不参与部署
provided范围的依赖
对于主程序和测试程序都有效,不参与打包, 不参与部署 (典型的就是Servlet-api.jar ,在运行时Tomcat服务器可以给你提供)
本地仓库和远程仓库
本地仓库
本机的Maven仓库
远程仓库
1、私服(一种私服:Nexus) : 搭建在局域网
环境中,为局域网内的Maven工程服务
2、中央仓库 : 架设在Internet上,为全世界所有的Maven工程服务
3、中央仓库镜像(阿里云镜像等):架设在各个大洲,为中央仓库分担流量,减轻中央仓库的压力,同时有更快的访问速度
仓库中保存的内容
(Maven install)
项目构建
Maven的生命周期
大体上分为 -编译 -测试 -打包 -安装 -部署
生命周期中各个阶段的具体任务是由插件来完成的
不论现在要执行生命周期中的那一阶段,都是从这个生命周期最初的位置开始执行
例如我现在执行安装命令,那么maven从编译开始一直运行到安装插件和目标
可以将目标看做"调用插件功能的命令"
生命周期阶段 | 插件目标 | 插件 |
---|---|---|
compile | complie | maven-compiler-plugin |
test-compile | testCompile | maven-compiler-plugin |
。。。 |
依赖的传递是多层的,就像Java的继承一样
注意:非compile范围的依赖不能传递
好处
每个模块都使用的依赖不必在每个模块中重复的声明。
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>mybatisartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>com.shwshgroupId>
<artifactId>commonartifactId>
<version>1.0version>
dependency>
dependencies>
project>
当我们导入了某个依赖A时,这个依赖A可能依赖了某个依赖B,但是我们的工程不能导入依赖B,可能会导致某些问题,就需要使用依赖的排除
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>mybatisartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>com.shwshgroupId>
<artifactId>commonartifactId>
<version>1.0version>
<exclusions>
<exclusion>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
exclusion>
.....排除多个
<exclusion>
<groupId>groupId>
<artifactId>artifactId>
exclusion>
exclusions>
dependency>
dependencies>
project>
依赖冲突遵循这两种原则:路径短者优先和声明优先
路径短者优先
A依赖了Spring4.1,还依赖了B,但是B中依赖了Spring4.2,那么按照路径短者优先,(即A要得到Spring的依赖需要一步,而得到B中的Spring依赖需要两步)那么A中只会依赖Spring4.1,(所以不必排除B中的Spring4.2这个依赖)
路径相同按照声明优先
A同时依赖了B和C,B中有Spring4.1,C中有Spring4.2,那么按照声明优先,如果在A的pom.xml文件中先声明了B,那么A就依赖B的Spring4.1,反之就依赖C的Spring4.2
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>mybatis_sourcecodeartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<spring.version>4.0spring.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>${spring.version}version>
dependency>
.....
dependencies>
project>
使用父工程指定依赖的版本,子工程继承父工程,在子工程中导入依赖时就不必指明版本号了,一般在父工程中配合properties使用管理所有模块的依赖版本
注意:父工程由于只做版本的控制,所以此打包方式必须指定为pom
一般配合properties标签使用管理整个项目的依赖版本
注意:做了继承之后,要执行install操作,先对父工程进行install
父工程中pom文件
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>dadartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>pompackaging>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<mysql-connector.version>5.1.47mysql-connector.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql-connector.version}version>
dependency>
dependencies>
dependencyManagement>
project>
子工程pom
<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.0modelVersion>
<parent>
<artifactId>dadartifactId>
<groupId>org.examplegroupId>
<version>1.0-SNAPSHOTversion>
<relativePath>../dad/pom.xmlrelativePath>
parent>
<groupId>org.examplegroupId>
<artifactId>son1artifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
dependencies>
project>
聚合就是将所有的模块一起进行操作在聚合工程的pom文件下执行的命令,所有聚合的模块一起执行 并且Maven会自动的分析各个模块之间的依赖关系 按照依赖关系执行
聚合工程也可以是父工程
聚合模块的packaging标签也必须指定为pom
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>dadartifactId>
<version>1.0-SNAPSHOTversion>
<modules>
<module>../son1module>
<module>../son2module>
modules>
<packaging>pompackaging>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<mysql-connector.version>5.1.47mysql-connector.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql-connector.version}version>
dependency>
dependencies>
dependencyManagement>
project>
modules>