maven项目管理工具使用

一个项目管理工具,能够帮助你的项目构建以及部署加快.

maven的上下一体

  1. Maven 简介
  2. Maven 的安装和配置
  3. Maven 仓库
  4. Maven 入门
  5. Maven 核心概念解析
  6. Maven 的依赖管理
  7. Eclipse 中创建 Maven JAVEWEB 项目
  8. Maven 的继承
  9. Maven 的聚合

maven简单的说是一个项目集管理工具

一个项目里面包含什么内容,无非是java代码,资源,甚至是相关的一些jar包,如何摆放

多个项目之间是否存在关系,是否需要相互照应,是否能够将项目直接放置在tomcat中,那么这些都需要靠maven来进行操作

maven的简介说明

  1. 一个普通的web项目需要在lib中引入大量的jar包,maven可以帮助我们添加需要的jar包
  2. 一个工具包可能需要依赖其它的jar包作为支撑,比如使用log4j的时候需要依靠通用的common-io包,maven可以帮助的项目做依赖jar包
  3. 一些jar包有着不同的版本,每个项目可能需要的jar包不一样,从哪里来。maven提供了一个中央仓库供大家下载
  4. 多模块拆分,以前常见使用package的方式进行分层能够解决基本的问题,但随着项目越来越大,那么我们要进行细化,直接使用package分并不够。那么通过我们可以通过maven进行拆分,并且统一进行管理

关于构建 (结构化的建立)(也就是有一种标准式的建立方式)

主要有几个动作:

  1. clean 清理:删除编译的内容,做好重新编译的准备
  2. complie 编译:也就是将代码编译为class文件
  3. test 测试:对项目中的某个模块业务进行测试,以确保的结果的准确性
  4. report 报告:有测试完毕的情况下,有对应的报告生成
  5. package 打包:将一个文件或者多个进行jar或者war包打包
  6. install 安装:将jar包或者war包安装到本地仓库中
  7. deploy 部署:将war包部署到服务器容器中

自动构建 (CI) 持续集成

上面的动作是非常繁琐的。是否可以通过一个命令一个脚本帮助你做这件事情。这个我们称作为自动构建或者叫做持续集成


maven的安装与配置

  1. 官网地址下载

IMAGE

  1. windows配置环境变量(注意:可能需要设置JAVA_HOME变量)

mac中加入 bash_profile (可执行的配置文件)

1
2
3
4
5
cat ~/.bash_profile
#add maven_home
MAVEN_HOME=/Users/Yun/Documents/maven/apache-maven-3.3.9
PATH=$PATH:$MAVEN_HOME/bin
export MAVEN_HOME
  1. 使用mvn -v 命令查看maven版本 (验证是否安装成功)

  2. 修改使用maven下载jar包存放仓库的位置(路径自行选择)

在config-setting.xml中 更改<localRepository>/Users/Yun/Documents/maven/repo</localRepository>

  1. 设置镜像仓库(maven默认仓库假设在美国,国内有锁,下载十分缓慢)
1
2
3
4
5
6
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
  1. 后期为了保证项目统一的jdk版本在中加入(JDK更改即可)
1
2
3
4
5
6
7
8
9
10
11
12
<profile>  
<id>jdk18</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>

maven仓库的概念

  1. 本地仓库 (本地maven存放的文件)
  2. 远程仓库 (来自五湖四海汇集到一起)
  3. 私服 (开发中,都有自己搭建的私服,其实就是私有仓库)
  4. 中央仓库和镜像 中央仓库只有一个,镜像是中央仓库的克隆,用于分担中央仓库的压力

maven入门

  1. eclipse中配置maven路径(默认是自动识别)

IMAGE

  1. 加载maven配置文件

IMAGE

  1. 构建一个mavenproject(勾选创建一个简单的maven项目)

IMAGE

目录结构如下:
IMAGE

  1. 观察一下pom.xml(自行加入junit)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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.wwj</groupId>
<artifactId>maven001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
  1. 在src/main/java 以及 src/test/java中
1
2
3
4
5
public class HelloMaven {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
import static org.junit.Assert.*;
import org.junit.Test;
import com.wwj.hell.HelloMaven;

public class HelloMavenTest {
@Test
public void testHello(){
HelloMaven hello = new HelloMaven();
String results = hello.sayHello("wwj");
//用于判别内容是否一致
assertEquals("Hello wwj!",results);
}
}
  1. 切换到项目根目录下执行

mvn compile (注意观察info)
IMAGE

mvn clean (注意观察info)
IMAGE

mvn test (注意观察info)
IMAGE

会新增一个测试报告
IMAGE

mvn package (注意观察info) (compile->test->package)
IMAGE


Maven 核心概念解析(pom,目录结构,坐标)

  1. pom.xml文件对整体项目文件的管理。认知maven就是认知pom.xml文件

  2. src/main/java 为项目的逻辑代码存放地 src/main/resource 为项目资源配置文件,同理测试目录为测试文件与资源的存放地

  3. target为compile存放文件的位置

  4. 坐标主要的目的一个项目能从maven仓库中找到需要的内容,而这个内容需要有一个标识

1
2
3
<groupId>com.wwj</groupId>
<artifactId>maven001</artifactId>
<version>0.0.1-SNAPSHOT</version>

执行 mvn install (观察info) 相当于打包jar包放置与本地仓库中

路径:
IMAGE


Maven 的依赖管理

  1. 依赖管理 中有一个标签叫 , scope有3个选项compile,test,provided
  • compile 编译 主要为项目主业务代码 从前到后使用
  • test 测试 主要提供给测试业务代码 仅仅只在test使用
  • provided 可提供的 也就是从编译到测试使用,可以理解为仅仅只在项目中使用,部署后由容易本身提供
  1. 依赖传递概念

(1). 假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A。 那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中。这就是依赖的传递性。并且C对B的支撑要达到complie级别,A才能够可见到C. 其余级别不支持

(2). 如果C现在不要A (使用exclusion)

1
2
3
4
5
6
7
8
<exclusions>
<exclusion>
<!--被排除的依赖包坐标-->
<groupId>A</groupId>
<artifactId>A</artifactId>
<version>0.0.1</version>
</exclusion>
</exclusions>

(3). 依赖冲突:一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同

  • 短路优先 (会选择version2)

A -> B -> C -> X(VERSION=1) 和 A -> D -> X(VERSION=2)

  • 声明优先(会选择version2) 在A的声明中 D如果写在E前则D优先

A -> D -> X(VERSION=2) 和 A -> E -> X(VERSION=1)

  1. 统一版本管理
1
2
3
4
5
6
7
8
9
10
11
<properties>
<wwj.junit>4.0</wwj.junit>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${wwj.junit}</version>
<scope>test</scope>
</dependency>
</dependencies>

Eclipse 中创建 Maven JAVEWEB 项目 (勾选简单的maven项目)

  1. IMAGE

  2. 项目右键勾选属性:

IMAGE

OK~ 一个web项目构建完成


maven的继承 (多个子项目都需要某些依赖, 就可以把子项目共同的依赖抽取到父项目中,子项目通过继承得到这些依赖)

  1. 构建父项目(打包方式为pom)

IMAGE

  1. 父项目使用 dependencyManagement 标签来管理,optional表示子 pom 无论如何都不能继承(已经失效)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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.wwj</groupId>
<artifactId>maven003</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!-- 子 pom 可以继承 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
  1. 子项目使用父项目的依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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.wwj</groupId>
<artifactId>maven004</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<!-- 父项目坐标 -->
<groupId>com.wwj</groupId>
<artifactId>maven003</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 父项目 pom 文件路径 -->
<relativePath>../maven003/pom.xml</relativePath>
</parent>
<dependencies>
<!-- 不需要版本, 会从父项目继承, 如果指定版本就是代表不是来自父 pom 而是子 pom 自己的. -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project>

9.maven聚合 (将功能模块拆分,最常见的我们整合ssm的时候会将service和dao进行拆分,当然也可以以项目的方式)

maven-parent (Maven Project)

|- maven-son1 (Maven Module)
|- maven-son2 (Maven Module)
|- …

  1. 创建父模块(父模块一般承担聚合模块和统一管理依赖的作用,没有实际代码和资源文件) (打包方式为pom.xml)

  2. 右键父项目创建子模块module

IMAGE

IMAGE

IMAGE

分别观察到父亲管理那些模块,儿子的父亲是谁

  1. 父模块做统一管理
1
2
3
4
5
6
7
8
9
10
11
12
13
<properties>
<wwj.json>1.2.47</wwj.json>
</properties>
<dependencyManagement>
<dependencies>
<!-- 子 pom 可以继承 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${wwj.json}</version>
</dependency>
</dependencies>
</dependencyManagement>
  1. 子模块直接进行依赖
1
2
3
4
5
6
7
<dependencies>
<!-- 子 pom 可以继承 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
  1. 切换到maven父项目执行mvn install (观察info)

IMAGE