第一章 Maven介绍

1.1 什么是Maven

Maven是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

  • 项目对象模型 (Project Object Model:一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。
  • 依赖管理系统(Dependency Management System:通过maven的依赖管理对项目所依赖的jar 包进行统一管理。
  • 一个项目生命周期(Project Lifecycle):使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期。
  • 一组标准集合:maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。
  • 插件(plugin)目标(goal):maven 管理项目生命周期过程都是基于插件完成的

1.2 Maven能解决什么问题

能构建工程,管理jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成Web站
注:maven构建的项目相较于普通项目,文件的大小要小很多,因为maven构建的项目没有把jar包拷贝到项目(工程)中。

1.3 Maven的两个核心作用

  1. Maven的依赖管理:Maven把项目所需要得jar包保存在Maven仓库里面,通过在pom.xml文件中添加所需jar包的坐标,在用到这些jar包时,会根据pom.xml中jar包的坐标把jar包引入进来拿去执行
    注:maven中有索引,很大程度上提高了jar包的加载速度,所以可以认为maven仓库的jar包基本跟放在本地的工程文件中再读取出来的速度是一样的。
  2. 项目的一键构建:指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给maven进行管理,使用maven一个命令可以轻松完成整个工作。

1.4 Maven工程的目录结构

  • src/main/java —— 存放项目的.java文件
  • src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
  • src/test/java —— 存放所有单元测试.java文件,如JUnit测试类
  • src/test/resources —— 测试资源文件
  • target —— 项目输出位置,编译后的class文件会输出到此目录
  • pom.xml——maven项目核心配置文件
    注意:如果是普通的java项目,那么就没有webapp目录。

1.5 Maven仓库的分类

  • 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。
  • 远程仓库:如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。
  • 中央仓库 :在maven软件中内置一个远程仓库地址http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由Maven团队自己维护,里面存储了非常全的jar包,它包含了世界上大部分流行的开源项目构件。

第二章 Maven常用命令

我们可以在命令提示符(cmd)中的我们的项目路径下,通过一系列的maven命令来对我们工程(项目)进行编译、测试、运行、打包、安装、部署。

2.1 compile

  • compile是maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出到target目录下。
  • cmd进入命令状态,切换到项目所在的文件路径,执行mvn compile,查看 target目录,class文件已生成,编译完成。

2.2 test

  • test是maven工程的测试命令,作用是执行src/test/java下的单元测试类。cmd命令: mvn test

2.3 clean

  • clean是maven工程的清理命令,执行 clean会删除target目录及内容。cmd命令: mvn clean

2.4 package

  • package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war包。cmd命令: mvn package

2.5 install

  • install是maven工程的安装命令,执行install将maven打成jar包或war包发布到本地仓库
  • 从运行结果中,可以看出:当后面的命令执行时,前面的操作过程也都会自动执行。

2.6 Maven指令的生命周期

maven对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

  • Clean Lifecycle :清理生命周期。在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle :默认生命周期。构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle :站点声明周期。生成项目报告,站点,发布站点。

2.7 项目对象模型 (Project Object Model)

一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。

2.8 依赖坐标定义如下:

<dependency>
	<!--项目名称,定义为组织名+项目名,类似包名-->
	<groupId>com.ljj</groupId>
	<!-- 模块名称 -->
	<artifactId>hello_maven</artifactId>
	<!-- 当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本 -->
	<version>0.0.1-SNAPSHOT</version>
	<!-- 依赖范围 -->
	<scope></scope>
</dependency>
<!-- 打包类型,有jar和war两种 -->
<packaging >war</packaging >

2.9 依赖范围

  • compile:编译范围,指A在编译时依赖B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
  • provided:provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用, provided依赖在编译和测试时需要,在运行时不需要,比如:servlet api被tomcat容器提供。
  • runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。
  • test:test范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以test范围依赖不会被打包。
  • system:system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。

2.10 设置jdk编译版本

需要设置编译版本为1.8,这里需要使用maven的插件来设置,在pom.xml中加入:

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</build>

2.11 添加tomcat7插件


<build>
	<plugins>
		<plugin>
			<groupId>org.apache.tomcat.maven</groupId>
	              <artifactId>tomcat7-maven-plugin</artifactId>
	              <configuration>         
					<!-- 端口号 -->
					<port>8888</port>              
					<!-- 访问路径 -->
					<path>/</path>
	              </configuration>
	              <version>2.2</version>
		</plugin>
	</plugins>
</build>

此时点击idea最右侧Maven Projects,就可以看到我们新添加的tomcat7插件,双击tomcat7插件下tomcat7:run命令直接运行项目

2.12 pom基本配置

pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,基本配置如下:

<project > :文件的根节点
<parent>:指定继承的父模
<modelversion > : pom.xml使用的对象模型版本
<groupId > :项目名称,一般写项目的域名
<artifactId > :模块名称,子项目名或模块名称
<version > :产品的版本号 .
<packaging > :打包类型,一般有jar、war、pom 等
<name > :项目的显示名,常用于 Maven 生成的文档。
<description > :项目描述,常用于 Maven 生成的文档
<properties>:设置一些属性,通常指定jar包的版本、设置编译版本
<dependencies> :项目依赖构件配置,配置项目依赖构件的坐标
<build> :项目构建配置,配置编译、运行插件等。

第三章 分模块构建工程[应用]

3.1 理解继承和聚合

  • 何为继承?
    继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定spring的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义
  • 何为聚合?
    项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。
  • 注:通常继承和聚合同时使用。简单理解,继承:创建一个parent工程将所需的依赖都配置在pom中聚合:聚合多个模块运行。

3.2 什么是依赖传递

添加springmvc的核心依赖的坐标,项目依赖spring-webmv.jar,而spring-webmv.jar会依赖spring-beans.jar等等,所以spring-beans.jar这些jar包也出现在了我们的maven工程中,这种现象我们称为依赖传递。

3.3 依赖调解原则

解决导入多个依赖时版本不一致的问题,即依赖冲突问题。

  • 第一声明者优先原则:在pom文件定义依赖,先声明的依赖为准。
  • 路径近者优先原则:直接在pom中定义spring-beans要比其他依赖传递过来的路径要近

3.4 运行调试

  • 方法1:在ssm_web工程的pom.xml中配置tomcat插件运行
    运行ssm_web工程它会从本地仓库下载依赖的jar包,所以当ssm_web依赖的jar包内容修改了必须及时发布到本地仓库,比如:ssm_web依赖的ssm_service修改了,需要及时将ssm_service发布到本地仓库。
  • 方法2:在父工程的pom.xml中配置tomcat插件运行,自动聚合并执行
    推荐方法2,如果子工程都在本地,采用方法2则不需要子工程修改就立即发布到本地仓库,父工程会自动聚合并使用最新代码执行。
  • 注意:如果子工程和父工程中都配置了tomcat插件,运行的端口和路径以子工程为准。

四、把第三方jar包放入本地仓库

随便找一个jar包测试,可以先CMD进入到jar包所在位置,运行:

 mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile= fastjson-1.1.37.jar -Dpackaging=jar
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐