Maven经验总结

一、概念

Maven是一款自动化构建工具,专注服务于Java平台的项目自动化构建和jar包依赖管理。

二、构建环节

以下构建环节都由Maven自动构建进行
1.清理:删除以前的编译结果,为重新编译做好准备。
2.编译:将java源程序编译为字节码文件。
3.测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
4.报告:在每一次测试后以标准的格式记录和展示测试结果。
5.打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应 jar包,Web工程war包
6.安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
7.部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

三、Maven九个核心概念

1.POM:pom.xml配置文件
2.约定的目录结构:
3.坐标:pom中依赖jar包的路径,路径指向本地仓库
4.依赖管理:jar包之间的依赖管理
5.仓库管理:放jar包的地方
6.生命周期:maven的执行过程
7.插件和目标:
8.继承:父子项目之间的关系
9.聚合:多个项目聚合到一个项目

四、Maven项目

第一步:创建约定的目录结构

Hello(项目名)
src
——main(存放主程序——业务代码、配置文件)
    ——java(包名、类)
    ——resources(三大框架配置文件)
——test(存放测试程序)
    ——java(单元测试代码)
    —resources(单元测试用到的资源文件)
pom.xml

第二步:创建Maven的核心配置文件pom.xml
第三步:编写主程序

在src/main/java/com/atguigu/maven目录下创建新文件Hello.java
第四步:编写测试代码
在src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java

第五步:运行几个基本的Maven命令
1.打开cmd命令行,进入Hello项目根目录(pom.xml文件所在目录)执行
mvn complie(编译) 命令,查看根目录变化
2.cmd中继续录入mvn clean(清理)命令,然后再次查看根目录变化
3.cmd中录入mvn clean compile命令,查看根目录变化
4.cmd中录入mvn test-compile(对测试程序进行编译) 命令,查看target目录 变化
5.cmd中录入mvn clean test(运行) 命令,查看target目录变化
6.cmd 中录入mvn clean package(打jar包) 命令,查看target 目录变化
7.cmd 中录入 mvn source:jar (生成源码包)命令,查看target 目录变化
8.cmd 中录入 mvn install(安装)命令
注意:运行Maven命令时一定要进入pom.xml文件所在的目录

五、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>
 
	<!--坐标 gav -->
	<groupId>com.atguigu.maven</groupId><!--组织+项目+ID-->
	<artifactId>Hello</artifactId><!--模块名 -->
	<version>0.0.1-SNAPSHOT</version><!--版本-->
	<!--项目名-->
	<name>Hello</name>
	  
	<!--依赖管理:需要引用第三方jar包,通过dependency标签来进行配置 -->
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope><!--依赖范围-->
		</dependency>
	</dependencies>
</project>

六、通过坐标到仓库中查找jar包

1.将gav三个向量连接起来

com.atguigu.maven+Hello+0.0.1-SNAPSHOT

2.以连起来的字符串作为目录结构到仓库中查找

com/atguigu/maven/Hello/0.0.1-SHAPSHOT/Hello-0.0.1-SNAPSHOT.jar

##注意:我们自己的Maven工程必须执行安装操作才会进入仓库。安装命令是mvn install
安装:将当前项目打好的jar包从工作空间整到仓库的过程叫做安装

<!-- Mavnen项目类型:
    jar  表示Java项目,默认值
    war  表示Web项目
    pom  表示父工程
 -->

七、依赖管理
http://mvnrepository.com
1.基本概念
当A jar包需要用到B jar包中的类时,我们就说A 对 B 有依赖。例如:commons-fileupload-1.3.jar 依赖于commons-io-2.0.1.jar。
2.直接依赖和间接依赖
如果A依赖B,B依赖C,那么A——B和B——C都是直接依赖,而A——C是间接依赖。
3.依赖的范围
当一个Maven工程添加了对某个jar包的依赖后,这个依赖的jar包可以对应下面几个可选的范围:
(1)compile
A.main目录下的java代码可以访问这个范围的依赖
B.test目录下的java代码可以访问这个范围的依赖
C.部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。
(2)test
A.Main目录下的java代码不能访问这个范围的依赖
B.Test目录下的java代码可以访问这个范围的依赖
C.部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:对junit的依赖。仅仅是测试程序部分需要

(3)provided
A.Main目录下的java代码可以访问这个范围的依赖
B.Test目录下的java代码可以访问这个范围的依赖
C.部署到Tomcat服务器上运行时不会放在WEB-INF 的lib目录下
例如:servlet-api 在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不要。

(4)runtime[了解]
(5)其他:import、system等。

八、依赖的传递性

A依赖于B:在A的pom.xml文件配置B的gav信息

compile范围具有传递性,test和provided的范围不具有传递性

最短路径者优先

路径相同时先声明者优先

九、依赖的排除

对所以依赖的其他包进行依赖排除,把用不上的包排除掉
有时候为了确保 程序正确可以将有可能重复的间接依赖排除。排除后也可以自行依赖其他版本。

<exclusions>
<exclusion>
	<g>
	<a>
</exclusion>
</exclusions>

十、统一管理目标jar包的版本

以对Spring的jar包依赖为例:Spring的每一个版本都包含spring-core(核心包)、spring-context(上下文)等jar包。我们应该导入版本一致的Spring jar包,而不是使用5.2.5的spring-core的同时使用5.2.6的spring-context。

<!--全局变量声明。可以声明版本号-->
<properties>
<spring.version>5.2.5.RELEASE</spring.version><!--自己随便定义的-->
</properties>		                                
##放在<dependencies>外面的

<dependency> <!-- 放到版本号的位置-->                                  
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${spring.version}</version>
</dependency>

十一、Maven仓库

下载解压后在conf文件夹里打开settings.xml文件,在标记中插入如下代码(如果没有的标记需要在标记外加入标记):

<mirror>
          <id>alimaven</id>
          <name>aliyun maven</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <mirrorOf>central</mirrorOf>        
        </mirror>

如果配置完setting.xml文件后不能从阿里云下载,就在pom.xml文件配置如下代码:

<repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

<repositories>标记和pom.xml文件中的<dependencies>标记同级

十二、Maven的生命周期

作用:Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了
类型
Clean Lifecycle 在进行真正的构建之前进行一些清理工作
Default Lifecycle(默认) 构建的核心部分,编译,测试,打包,安装,部署等等
Site Lifecycle 生成项目报告,站点,发布站点。

mvn site:生成站点

1、clean声明周期
(1)pre-clean执行一些需要clean之前完成的工作
(2)clean移除所有上一次构建生成的文件
(3)post-clean执行一些需要在clean之后立刻完成的工作
2、Site生命周期
(1)pre-site执行一些需要在生成站点文档之前完成的工作
(2)Site生成项目的站点文档
(3)Post-site执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
(4)Site-deploy将生成的站点文档部署到特定的服务器上
这是经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这是Maven强大的功能。
3、Default生命周期
complie
clean
package
install

4、运行任何一个阶段的时候,它前面的所有阶段都会被运行。

十三、继承
例:
父工程:Maven001

<!-- 依赖管理配置声明:声明配置,当前项目并不会直接引入jar包。
子项目继承父项目,子项目不能直接使用jar包。子项目想用,
必须的声明才能使用。
优点:由父工程管理版本,子工程不需要管理版本
父工程中改为<packaging>pom</packaging>-->

<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>

子工程:A

<!-- A继承maven001 父工程(<dependencies>标签外)
通过继承关系,推荐由父工程管理版本和依赖范围,将子工程内的a和v 删除-->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>maven001</artifactId>             <!--父工程地址-->
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!--- 相对路径指定父工程的pom文件位置-->
</parent>

十四、聚合

在总的聚合工程中使用modules/module标签组合,指定模块工程的相对路径即可

<!-- 聚合:对当前项目进行任何操作,被聚合的项目都跟着做相同操作-->
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值