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环境变量1

将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 依赖的传递性
当存在间接依赖的情况时,只有依赖范围(的取值)为compile时可以传递.
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包的版本
在工程HelloMavenpom.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.子类工程HelloMavenpom.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 子类工程中的坐标的groupIdversion可以省略(因为父类工程中已经设置过了)

<!-- 坐标 -->
	<!-- <groupId>com.moon.maven</groupId> -->
	<artifactId>Hello</artifactId>
	<!-- <version>0.0.1-SNAPSHOT</version> -->

3.3 此时子类工程的dependency中的groupIdartifactId不可以省略:
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:

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

posted @ 2021-09-07 23:33  逆风的悦  阅读(37)  评论(0)    收藏  举报