文章目录
概念
构建
构建过程包含的主要的环节
1、清理 : 删除上一次构建的结果,为下一次构建做准备
2、编译 : java源程序编译成 *.class字节码文件
3、测试 : 运行提前准备号的测试程序
4、报告 : 针对刚才测试的结果生成一个全面的信息
5、打包
- Java工程 :jar包
- Web工程 : war包
6、安装 : 把一个Maven工程经过打包操作生成的jar包或war包存入Maven仓库
7、部署
- 部署 jar 包 : 把一个jar包部署到Nexus私服服务器上
- 部署 war 包 : 借助相关Maven插件(例如cargo),将war包部署到Tomcat服务器上
依赖
依赖管理中要解决的具体问题:
●jar包的下载:使用Maven之后,jar 包会从规范的远程仓库下载到本地
●jar包之间的依赖:通过依赖的传递性自动完成
●jar包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入
Maven工作机制
坐标
使用三个[向量]在Maven仓库
中唯一定位到一个jar
包
坐标 | 解释 | 举列 |
---|---|---|
groupId | 公司或组织的id | com.flzj.maven |
artifactId | 一个项目或者是项目中的一个模块的id 模块的名称,将作为Maven工程的工程名 | pro01-flzj-maven |
version | 版本号 | 1.0-SNAPSHOT(表示快照版本) 1.0-RELEASE (表示正式版本) |
<groupId>com.flzj.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
上面的坐标对应的jar包在Maven 本地程库中的位置 :
D:\Maven\storage\com\flzj\maven\pro01-maven-java\1.0-SNAPSHOT
另外,安装操作还会将pom.xml文件转换为XXX.pom文件-起存入本地仓库。 所以我们在Maven的本地仓库中
想看一个jar包原始的pom.xml文件时,查看对应XXX.pom文件即可,它们是名字发生了改变,本质上是同一
个文件
POM
POM : Project Object Model,项目对象模型
模型化思想
POM表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我
们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这
样就可以在程序中计算与现实事物相关的数据
对pom.xml的解释
<!--根标签:project,表示对当前工程进行配置、管理-->
<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 标签:从Maven 2 开始固定就是 4.0.0-->
<!-- 代表当前 pom.xml 所采用的标签结构 -->
<modelVersion>4.0.0</modelVersion>
<!--坐标信息-->
<!-- D:\Maven\storage\com\flzj\maven\pro01-maven-java\1.0-SNAPSHOT 在本地仓库的路径 -->
<groupId>com.flzj.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<!--packaging标签 : 打包方式-->
<!--取值 jar : 生成 jar 包 , 说明这是一个 Java 工程-->
<!--取值 war : 生成 war 包 , 说明这是一个 web 工程-->
<!--取值 pom : 说明这个工程是用来管理其他工程的工程 -->
<packaging>jar</packaging>
<name>pro01-maven-java</name>
<url>http://maven.apache.org</url>
<!--在 Maven 中定义属性值-->
<properties>
<!--在构建过程中读取源码时使用的字符集-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--dependencies 标签 : 配置具体依赖信息,可以包含多个dependcy 子标签-->
<dependencies>
<!--dependency 标签 : 配置一个具体的依赖信息 -->
<dependency>
<!--坐标信息-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--scope 标签 : 配置当前依赖的范围-->
<scope>test</scope>
</dependency>
</dependencies>
</project>
约定的目录结构
意义
Maven为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用。例如: Maven 执行编译操作,必须先去Java源程序目录读取Java源代码,然后执行编译,最后把编译结果存放在target目录
约定大于配置
Maven对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建Maven工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码
Maven安装和配置
1、下载
重点关注conf/settings.xml
2、配置本地仓库
打开conf/settings.xml
,修改配置
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>d:\Maven\storage</localRepository>
3、配置镜像仓库
因为访问境外的中央仓库下载满,所以我们改成阿里云提供的镜像仓库
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4、配置Maven工程的基础JDK版本
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
5、配置Maven_HOME
Maven是基于java写的,所以我们要先检查JAVA_HOME是否正确
配置环境变量的规律
XXX_HOME 通常指向的是 bin目录的上一级
PATH 指向的是bin
Maen命令行
1、生成Maven工程
mvn archetype:generate
我们先来到,我们需要生成的目录,输入
设置坐标
2、Maven的构建命令
要求
必须要进入到pom.xml
所在的目录
2.1、清理操作
mvn clean
: 删除target目录
2.2、编译操作
mvn compile
: 主程序编译(结果放在 target/classes)
mvn test-compile
: 测试程序编译(结果放在 target/test-classes)
2.3、测试操作
mvn test
: 测试的报告存放的目录(target/surefire-reports)
2.4、打包操作
mvn package
: 打包的结果为jar包(存放的目录:target)
2.5、安装操作
mvn install
: 把jar包,存入到本地仓库中
另外,安装操作还会将pom.xml文件转换为XXX.pom文件-起存入本地仓库。 所以我们在Maven的本地仓库中
想看一个jar包原始的pom.xml文件时,查看对应XXX.pom文件即可,它们是名字发生了改变,本质上是同一
个文件。
3、生成Web工程
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
3.1、目录结构
3.2、将Web工程打包为war包
mvn package
,生成 war 包的位置如下图所示
将web工程部署到tomcat玩玩
3.3、让Web工程依赖Java工程
<!-- 配置对Java工程pro01-maven-java的依赖 -->
<!-- 具体的配置方式:在dependency标签内使用坐标实现依赖 -->
<dependency>
<groupId>com.flzj.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>s
把Java工程的CalculatorTest.java
复制到src\test\java\com\flzj
下,执行mvn test
package com.flzj.maven;
import org.junit.Test;
import com.flzj.maven.Calculator;
// 静态导入的效果是将Assert类中的静态资源导入当前类
// 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
import static org.junit.Assert.*;
public class CalculatorTest{
@Test
public void testSum(){
// 1.创建Calculator对象
Calculator calculator = new Calculator();
// 2.调用Calculator对象的方法,获取到程序运行实际的结果
int actualResult = calculator.sum(5, 3);
// 3.声明一个变量,表示程序运行期待的结果
int expectedResult = 8;
// 4.使用断言来判断实际结果和期待结果是否一致
// 如果一致:测试通过,不会抛出异常
// 如果不一致:抛出异常,测试失败
assertEquals(expectedResult, actualResult);
}
}
通过查看 war 包内的结构,我们看到被 Web 工程依赖的 Java 工程确实是会变成 Web 工程的 WEB-INF/lib 目录下的 jar 包
3.4、查看当前Web工程所依赖的jar包
mvn dependency:list
: 正常查看
[INFO] The following files have been resolved:
[INFO] com.flzj.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] junit:junit:jar:4.12:test
mvn denpendency:tree
: 以树形结构查看
[INFO] com.flzj:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.flzj.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
依赖
1、范围
标签的位置:dependencies/dependency/scope
标签的可选值:compile/test/provided/system/runtime/import
main目录(空间) | test目录(空间) | 开发过程(时间) | 部署到服务器(时间) | |
---|---|---|---|---|
compile | 有效 | 有效 | 有效 | 有效 |
test | 无效 | 有效 | 有效 | 无效 |
provided | 有效 | 有效 | 有效 | 无效 |
总结
compile
:通常使用的第三方框架的 jar 包这样在项目实际运行时真正要用到的 jar 包都是以 compile 范围进行依赖的。比如 SSM 框架所需jar包
test
:测试过程中使用的 jar 包,以 test 范围依赖进来。比如 junit
provided
:在开发过程中需要用到的“服务器上的 jar 包”通常以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担
2、传递性
在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。
- B 依赖 C 时使用 compile 范围:可以传递
- B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以
3、依赖的排除
<excludes>标签
: 配置依赖的排除
<exclude>标签
: 配置一个具体的排除(里面写坐标,不需要写version)
<dependency>
<groupId>com.flzj.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
继承
Maven工程之间,A 工程继承 B 工程
本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置
作用 : 在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本
1、创建父工程
创建一个Maven工程,然后修改pom.xml
的打包方式
<groupId>com.flzj.maven</groupId>
<artifactId>pro3-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>
2、创建子工程
在父工程里面,创建maven工程
此时父工程的pom.xml
会新增
<modules>
<module>pro4-maven-module</module>
<module>pro5-maven-module</module>
<module>pro6-maven-module</module>
</modules>
modules 和 module 标签是聚合功能的配置
解读子工程的pom.xml
<!-- 使用parent标签指定当前工程的父工程 -->
<parent>
<!-- 父工程的坐标 -->
<groupId>com.flzj.maven</groupId>
<artifactId>pro3-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<!-- <groupId>com.flzj.maven</groupId> -->
<artifactId>pro4-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->
3、在父工程依赖管理
<dependencyManagement>
标签
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
...
</dependencies>
</dependencyManagement>
子工程依赖管理
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。不去由自己决定 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
</dependency>
</dependencies>
4、配置自定义属性
<自定义标签>
: 方便版本管理
引用方式: ${flzj.spring.version}
<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 自定义标签,维护Spring版本数据 -->
<flzj.spring.version>4.3.6.RELEASE</flzj.spring.version>
</properties>
....
<!-- 然后去下面引用 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${flzj.spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${flzj.spring.version}</version>
</dependency>
...
</dependencies>
</dependencyManagement>
聚合
有父工程时先安装父工程;有依赖的工程时,先安装被依赖的工程
配置
<modules>
标签
<modules>
<module>pro04-maven-module</module>
<module>pro05-maven-module</module>
<module>pro06-maven-module</module>
</modules>
无烧话。。。。。。。。。。。。。。。