Maven
3.1 安装Maven核心程序
3.1.1 检查JAVA_HOME 环境变量.Maven 是使用Java开发的,所以必须知道当前系统环境中JDK的安装目录。
打开命令提示符,输入:echo %JAVA_HOME%,回显JAVA_HOME的环境变量是否成功设置;
C:\Users\Administrator>echo %JAVA_HOME%
C:\Program Files\Java\jdk1.8.0_51
3.1.2 将apache-maven-3.2.2-bin.zip解压到一个非空无中文的目录下:
C:\Program Files\maven
3.1.3 配置环境变量:
配置环境变量:M2_HOME:
C:\Program Files\maven\apache-maven-3.2.2
右键"此电脑"-->属性-->高级系统设置-->环境变量-->用户变量-->新建:

将maven环境变量添加到path中:
%M2_HOME%\bin
3.1.4 查看maven的版本验证是否安装成功:

3.2 第一个Maven程序: HelloMaven
3.2.1 创建约定的目录结构:
HellMaven
│ pom.xml
│
└─src
├─main
│ ├─java
│ └─resources
└─test
├─java
└─resources
HelloMaven: 模块(工程)名字,自己定义
main: 该目录用于存放主程序
test: 该目录用于存放测试程序
java目录用于存放源代码文件
resources目录用于存放配置文件和资源文件.
3.2.2 第二步:创建Maven的核心配置文件 pom.xml
<?xml version="1.0" ?>
<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.moon.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 模块名 -->
<name>HelloMaven</name>
<!-- 依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.2.3 第三步:编写主代码
在src/main/java/com/moon/maven目录下新建文件Hello.java
package com.moon.maven
public class Hello{
public String sayHello(String name){
return "Hello"+name+"!!!";
}
}
3.2.4 第四步:编写测试代码
在/src/test/java/com/moon/maven 目录下新建测试文件 HelloTest.java
package com.moon.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest{
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello();
assertEquals("Hello YinHeRiYuSenSei",results);
}
}
3.2.5 第五步: 运行几个基本的Maven命令:
打开cmd命令行,进入HelloMaven项目根目录(pom.xml文件所在目录 D:\java\workspace_ssm\HelloMaven)执行 mvn compile 命令,查看根目录的变化;
继续输入 mvn clean 命令,然后再次查看根目录变化;
接着输入:mvn compile命令,查看根目录变化;
输入:mvn test-compile命令,查看target目录的变化;
输入mvn test命令,查看target目录变化;
输入mvn package命令,查看target目录变化;
输入mvn install命令,查看本地仓库的目录变化;
3.3 Maven 联网问题
3.3.1 配置本地仓库
3.3.1.1 Maven的核心程序并不包含具体功能,仅负责宏观调度.具体功能由插件来完成.
Maven程序会到本地仓库中查找插件.如果本地仓库中没有就会从远程中央仓库下载.
此时如果不能上网则无法执行Maven的具体功能,为了解决这个问题,可以让Maven的本地仓库
指向一个在联网情况下下载好的目录
3.3.1.2 Maven默认的本地仓库: ~\.m2\repository
~表示当前用户的家目录,在win10中表示: C:\Users\Administrator
3.3.1.3 Maven的核心配置文件:
C:\Program Files\maven\apache-maven-3.2.2\conf\settings.xml
3.3.1.4 设置setttings.xml的localRepository节点:
值为本地仓库路径: D:\java\RepMaven
<localRepository>D:\java\RepMaven</localRepository>
Maven的核心概念
4.1 核心概念
1),POM
2),约定的目录结构
3),坐标
4),依赖
5),仓库
6),生命周期
7),插件和目标
8),继承
9),聚合
4.2 POM
Project Object Model,项目对象模型,将java工程的相关信息封装为对象作为
便于操作和管理的模型。Maven工程的核心配置
4.3 约定的目录结构
现在JavaEE开发领域普遍认同一个观点,约定>配置>编码.意思是能用配置解决的问题就不编码,
能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建
4.4 坐标
1),Maven的坐标
使用如下三个向量在maven的仓库中唯一的确定一个Maven工程.
[1]groupId: 公司或组织的域名倒序+当前项目名称
[2]artifactId: 当前项目的模块名称
[3]version: 当前模块的版本
<groupId>com.moon.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
2),如何通过坐标到仓库中查找jar包
[1],将gav三个向量连起来
com.moon.maven+Hello+0.0.1-SNAPSHOT
[2]以连起来的字符串作为目录结构到仓库中查找
com/moon/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
注意: 我们自己的Maven工程必须执行安装操作才会进入仓库.安装的命令时: mvn install
4.4 第二个Maven工程
1),目录结构
HelloFriend
│ pom.xml
│
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─moon
│ │ └─maven
│ │ HelloFriend.java
│ │
│ └─resources
└─test
├─java
│ └─com
│ └─moon
│ └─maven
│ HelloFriendTest.java
│
└─resources
生成目录结构:tree /f > list.txt
4.5 依赖管理
1),基本概念
当A jar包需要用到B jar包中的类时,我们就说A对B有依赖.
例如: commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar.
通过第二个Maven工程我们已经看到,当前工程会到本地仓库中根据坐标查找它所依赖的jar包
配置的基本形式是使用dependency标签指定目标jar包的坐标,例如
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<!-- 依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>
2),直接依赖和间接依赖
如果A依赖B,B依赖C,那么A->B和B->都是直接依赖,而A->C是间接依赖.
4.5.1依赖的范围
1),compile
[1]main目录下的java代码可以访问这个范围的依赖
[2]test目录下的java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
例如,对Hello的依赖,主程序、测试程序和服务器运行时都需要用到
2),test
[1]main目录下的java代码不能访问这个范围的依赖
[2]test目录下的java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器运行时不会放在WEB-INF的lib目录下
例如: 对junit的依赖,仅仅是测试程序部分需要
3),provided
[1]main目录下的java代码可以访问这个范围的依赖
[2]test目录下的java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器运行时不会放在WEB-INF的lib目录下
例如: servlet-api在服务器上运行时,servlet容器会提供相关的API,所以部署的时候不需要
4),其他: runtime,import,system等
4.5.2 依赖的传递性
当存在间接依赖的情况时,只有依赖范围(
test,provided都不能传递.
4.5.3 依赖的原则:解决jar包冲突
1),路径最短者优先
2),路径相同时先声明者优先(pom.xml中的声明顺序.)
4.5.3 依赖的排除
比如 工程HelloMaven依赖了 spring-core,而spring-core默认会依赖于commons-logging.
工程HelloFriend依赖了工程HelloMaven,根据依赖的传递性,
工程HelloFriend默认会依赖commons-logging,如果此时需要排序对它的依赖,
则需要在pom.xml中配置依赖的排除
<dependency>
<groupId>com.moon.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
<!-- 对依赖的排除 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
4.5.5 统一管理目标jar包的版本
在工程HelloMaven的pom.xml中配置properties属性标签:
<!-- 定义属性 -->
<properties>
<!-- Spring的统一版本 -->
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
然后在dependency标签下的version通过${}来引用上面指定的版本:
<!-- 对spring-core的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
4.6 仓库
1),分类
① 本地仓库 为当前本机电脑上的所有Maven工程服务
② 远程仓库
[1]私服
[2]中央仓库
[3]中央仓库的镜像
2),仓库中的文件
① maven的插件
② 我们自己开发的项目的模块
③ 第三方框架或工具的jar包
maven中的继承
1.创建一个父类工程: Parent
打包方式选择: pom

2.在父类工程的pom.xml管理依赖:
<!-- 在父工程中进行依赖的配置 -->
<dependencyManagement>
<dependencies>
<!-- 对Junit依赖的管理 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.子类工程HelloMaven的pom.xml中对父类工程的继承配置:
<!-- 对父工程的继承 -->
<parent>
<groupId>com.moon.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 指向父工程的pom.xml 相对路径:从当前的位置出发-->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
3.2 子类工程中的坐标的groupId和version可以省略(因为父类工程中已经设置过了)
<!-- 坐标 -->
<!-- <groupId>com.moon.maven</groupId> -->
<artifactId>Hello</artifactId>
<!-- <version>0.0.1-SNAPSHOT</version> -->
3.3 此时子类工程的dependency中的groupId和artifactId不可以省略:
version可以省略,
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
Maven中的聚合
1.为什么要使用聚合
将多个工程拆分为模块后,需要手动主格安装到仓库中(mvn install)依赖才能生效,修改源码后也要逐个手动
进行clean操作.而使用聚合之后就可以批量进行maven工程的安装、清理工作.
2.配合聚合
在父工程Parent中使用modules/module 指定模块的相对路径即可
<!-- 配置聚合 -->
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriend</module>
<module>../OurFriend</module>
</modules>
2.2 右键选择父类工程,执行 Maven install 即可.
Maven整合Eclipse
1),Maven插件安装
Eclipse自Kepler版本开始内置了Maven插件,所以Maven插件不需要额外安装,使用特定版本的Eclipse即可.
2),Maven插件的设置
1.指定Maven核心程序的位置
Window-->Preferences-->maven-->Installations


6.2修改eclipse(Spring Tool Suite)创建的Maven工程的默认JDK版本
在C:\Program Files\maven\apache-maven-3.2.2\conf\settings.xml中的profiles节点中添加如下内容:
<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>
6.4 解决项目测试乱码问题
1),在当前项目的pom.xml文件中增加插件配置:
<build>
<plugins>
<!-- 解决maven test命令时console出现中文乱码问题 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.2</version>
<configuration>
<forkMode>once</forkMode><!-- 在一个进程中进行所有测试;默认值 -->
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
</plugins>
</build>
Eclipse中创建maven版本的web工程
第一步:


右键选择项目,选择properties:

然后再把刚才去掉的打钩勾上:


浙公网安备 33010602011771号