maven核心概念有
- 1约定的目录结构
- 2POM
- 3坐标
- 4仓库
- 5依赖
- 6生命周期/插件/目标
- 7聚合
- 8继承
1约定的目录结构为
spring | 项目名 |
src目录 | 存放源码 |
main目录 | 存放主程序 |
java目录 | 存放Java源文件 |
resources目录 | 存放配置文件 |
test目录 | 存放测试程序 |
pom.xml文件 | Maven的核心配置文件 |
此目录规范了开发结构,提供标准的、统一的项目结构。Eclipse和Idea工程结构不一样,用maven统一结构可以跨开发工具
程序员开发代码普遍认同的观点:约定>配置>编码
2、pom文件3、坐标4、仓库
maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.nie</groupId>
<artifactId>spring</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring</name>
</project>
第一行是xml头,指定了该xml文档的版本和编码方式,
<project>是所有pom.xml的根元素,声明了一些POM相关的命名空间和xsd元素,这些属性不是必须的,但是使用这些属性可以让第三方工具ide帮助我们快速编辑POM
<modelVersion>4.0.0</modelVersion>指定了当前POM模型的版本,对于现阶段maven只能是4.0.4
<groupId><artifactId><version>定义了项目的基本坐标,
groupId定义了项目属于哪个组,一般是域名倒序
artifactId定义了当前项目组中的唯一ID,一般是项目名
version定义了当前版本,SNAPSHOT是快照版本,表示项目还在开发中,是不太稳定的版本
<packaging 定义了打包方式 常见pom,war,jar包
<name>友好的项目名称,不是必须的,但是推荐生命name属性,以方便查阅和交流
仓库已在文章01maven概念与安装_梓源先生的博客-CSDN博客介绍
5依赖
概念:当项目中使用某一jar包A,A.jar使用B.jar的某些API时,项目依赖了A.jar,A.jar依赖了B.jar
引入方式:在pom.xml文件中添加对应的坐标,
<dependencies><!--设置当前所有依赖的jar--> <dependency><!-- 设置具体的依赖--> <groupId>junit</groupId><!-- 依赖所属群组id--> <artifactId>junit</artifactId><!-- 依赖所属项目id--> <version>4.11</version><!-- 依赖版本号--> <scope>test</scope><!--依赖范围 --> </dependency> </dependencies>
5.1依赖的传递性:
A 依赖 B,B 依赖 C,A 调用C的API,这就是依赖的传递性
直接传递:在当前项目中通过依赖配置建立的依赖关系
间接传递:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖管理
依赖的排除(不需要):排除本项目中不使用的jar包
<exclusions><!--排除依赖,排除所有版本 --> <exclusion> <groupId>junit</groupId><!-- 依赖所属群组id--> <artifactId>junit</artifactId><!-- 依赖所属项目id--> </exclusion> </exclusions>
可选依赖(不透明):让被依赖者不能使用该jar包(私有化)
<groupId>junit</groupId><!-- 依赖所属群组id--> <artifactId>junit</artifactId><!-- 依赖所属项目id--> <version>4.11</version><!-- 依赖版本号--> <scope>test</scope><!--依赖范围 --> <optional>true</optional><!--可选依赖 true设置私有, -->
5.2依赖的范围:
maven在编译、测试、运行的时候使用不同的classpath,依赖范围就是控制这三种依赖关系
依赖的jar默认任何情况都可使用,通过scope标签设定范围,默认是compile
<scope>test</scope>
scope | 主代码 | 测试代码 | 打包 | 范例 |
compile | √ | √ | √ | log4j |
test | √ | junit | ||
provided | √ | √ | servlet-api | |
runtime | √ | jdbc |
servlet-api为什么打包不需要?
是因为打包嵌入tomcat服务器时,tomcat内部有servlet-api的jar包,如果不设置范围,会产生依赖冲突
6生命周期和插件
6.1生命周期
概念:Maven 生命周期为了对所有的构建过程进行抽象和统一,定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。
maven的生命周期是抽象的,实际行为都是又插件来完成的
Maven 有三套相互独立的生命周期,分别是:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
maven拥有三套独立的生命周期
Clean 生命周期
① pre-clean 执行一些需要在 clean 之前完成的工作② clean 移除所有上一次构建生成的文件③ post-clean 执行一些需要在 clean 之后立刻完成的工作
① pre-site 执行一些需要在生成站点文档之前完成的工作② site 生成项目的站点文档③ post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备④ site-deploy 将生成的站点文档部署到特定的服务器上
validategenerate-sourcesprocess-sourcesgenerate-resourcesprocess-resources 复制并处理资源文件,至目标目录,准备打包。compile 编译项目的源代码。process-classesgenerate-test-sourcesprocess-test-sourcesgenerate-test-resourcesprocess-test-resources 复制并处理资源文件,至目标测试目录。test-compile 编译测试源代码。process-test-classestest 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。prepare-packagepackage 接受编译好的代码,打包成可发布的格式,如 JAR 。pre-integration-testintegration-testpost-integration-testverifyinstall 将包安装至本地仓库,以让其它项目依赖。deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在maven设计中,实际的任务(如编译源代码)都由插件来完成。这种思想采用了设计模式中的模板方法。既保证了算法的扩展性,又能严格控制算法的整体结果,maven为大多数构建步骤编写了默认插件,当用户有特殊需求的时候,可以配置插件自定义构建行为
maven在核心为一些主要的生命周期阶段内置绑定了很多的插件,当执行该生命周期的命令时,对应的插件目标就会执行相应的任务
内置绑定
default生命周期的内置绑定插件绑定关系及具体任务如下(打包jar类型)
自定义绑定:用户可以根据自己业务需求将某个插件目标绑定到生命周期的某个阶段,
比如tomcat插件
<pluginRepositories>
<!--阿里云没有tomcat8-maven的插件!!!!!! -->
<pluginRepository>
<id>alfresco</id>
<url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat8-maven-plugin</artifactId>
<version>3.0-r1655215</version>
<configuration>
<port>80</port>
<uriEncoding>UTF-8</uriEncoding>
<ignorePackaging>true</ignorePackaging><!--解决tomcat不能启动问题 -->
</configuration>
</plugin>
</plugins>
</build>
7聚合
<packaging>pom</packaging>
<modules><module>../ssm_controller</module><module>../ssm_service</module><module>../ssm_dao</module><module>../ssm_pojo</module></modules>
8继承
作用:通过继承可以实现在子工程中沿用父工程中的配置
maven中的继承与java中的继承类似,在子工程中配置继承关系
使用方式:
在子工程中声明其父工程坐标与对应的位置
<!--定义该工程的父工程 --> <parent> <groupId>com.nie</groupId> <artifactId>ssm</artifactId> <version>1.0-SNAPSHOT</version> <!-- 父工程的pom文件 --> <relativePath>../ssm/pom.xml</relativePath> </parent>
附加:
maven常见构建命令
maven命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔
mvn compile | 编译 |
mvn clean | 清理 |
mvn test | 测试 |
mvn package | 打包 |
mvn install | 安装到本地仓库 |
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<!--指定pom的模型版本-->
<modelVersion>4.0.0</modelVersion>
<!--打包方式,web工程打包为war,java工程打包为jar-->
<packaging>war</packaging>
<!--组织id-->
<groupId>com.nie</groupId>
<!--项目id-->
<artifactId>spring</artifactId>
<!--版本号:release,snapshot-->
<version>1.0-SNAPSHOT</version>
<!--设置当前工程的所有依赖-->
<dependencies>
<!--具体的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<!--构建-->
<build>
<!--设置插件-->
<plugins>
<!--具体的插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat8-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>