Maven

Maven简介

介绍

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

构建

  • 项目开发,往往经历编译、测试、打包、安装、部署等一系列过程
    构建项目指项目从编译、测试、打包、安装、部署整个过程交给maven进行管理
    一键构建指的是整个构建过程,使用maven一个命令可以轻松完成整个工作

构建环节

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

Maven作用

添加第三方jar包

在今天的JavaEE开发领域,有大量的第三方框架和工具可以供我们使用。要使用这些jar包最简单的方法就是复制粘贴到WEB-INF目录下的lib目录下。但是这会导致每次创建一个新的工程就需要将jar包重复复制到lib目录下,从而造成工作区中存在大量重复的文件。
而使用Maven后每个jar包只在本地仓库中保存一份,需要jar包的工程只需要维护一个文本形式的jar包的引用——我们称之为“坐标”。不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。

jar包之间的依赖关系

jar包往往不是孤立存在的,很多jar包都需要在其他jar包的支持下才能够正常工作,我们称之为jar包之间的依赖关系。最典型的例子是:jstl.jar依赖于standard.jar,如果没有standard.jar包,jstl标签库就不能正常工作。

处理jar包之间的冲突

  • 使用Maven就可以自动的处理jar包之间的冲突问题。因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先。

获取第三方jar包

  • 使用Maven我们可以享受到一个完全统一规范的jar包管理体系。你只需要在你的项目中以坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载,并同时下载这个jar包所依赖的其他jar包——规范、完整、准确!一次性解决所有问题!

将项目拆分成多个工厂模块

随着JavaEE项目的规模越来越庞大,开发团队的规模也与日俱增。一个项目上千人的团队持续开发很多年对于JavaEE项目来说再正常不过。那么我们想象一下:几百上千的人开发的项目是同一个Web工程。那么架构师、项目经理该如何划分项目的模块、如何分工呢?这么大的项目已经不可能通过package结构来划分模块,必须将项目拆分成多个工程协同开发。多个模块工程中有的是Java工程,有的是Web工程。

实现项目的分布式部署

  • 在实际生产环境中,项目规模增加到一定程度后,可能每个模块都需要运行在独立的服务器上,我们称之为分布式部署,这里同样需要用到Maven。

Maven使用

下载安装

  • 下载路径:http://maven.apache.org/download.cgi
  • 解压:要求目录不要过深,不要有中文和特殊符号
  • 必须配置JAVA_HOME 环境变量
  • 配置环境变量:MAVEN_HOME 值为Maven的解压路径
    在path中配置 %MAVEN_HOME%\bin
  • 查看安装是否正确:在doc中 通过命令:mvn -v

配置本地仓库

  • Maven的核心程序并不包含具体功能,仅负责宏观调度。具体功能由插件来完成。Maven核心程序会到本地仓库中查找插件。如果本地仓库中没有就会从远程中央仓库下载。此时如果不能上网则无法执行Maven的具体功能。为了解决这个问题,我们可以将Maven的本地仓库指向一个在联网情况下下载好的目录。
  • Maven默认的本地仓库
    C:\Users\ljw.m2\repository目录。
  • Maven的核心配置文件位置 conf\setting.xml

Maven核心概念

POM

  • Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置。可以说学习Maven就是学习pom.xml文件中的配置。

目录结构

  • 现在JavaEE开发领域普遍认同一个观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建

Maven坐标

  • groupId:公司或组织的域名倒序
  • artifactId:当前项目的名称
  • version:当前模块的版本

依赖

  • https://mvnrepository.com/ maven 坐标地址查看
  • 目录结构
    Demo2
    src
    ——main
    ————java 写源码的地方
    ————resources 放置配置文件的目录
    ——test
    ————java 写测试源码的地方
    ————resources 放置测试所需的配置文件的目录
    pom.xml

仓库

  • 本地仓库

    • 项目通过jar坐标,先从本地仓库找对应jar包,如果找不到会从远程仓库(互联网)去下载jar
      包,保存在本地仓库(在程序员的电脑上),第二次不需要从远程仓库去下载。
  • 远程仓库

    • 中央仓库
      由专业团队( maven团队)统一-维护。
      中央仓库的地址: http://repo1 . maven . org/maven2/
    • 私服
      架设在公司局域网内,提供给内部的人员使用。
    • 第三方仓库
      中央仓库只有一个国内使用非常慢,我们可以更换为:阿里云镜像

生命周期

maven 对项目构建过程分为“三套相互独立的生命周期

  • Clean Lifecycle(清理生命周期)
    在进行真正的构建之前进行一些清理工作
    命令:clean
  • Default Lifecycle(默认生命周期)
    构建的核心部分,编译、测试、打包、部署等等
    命令:compile test package install deploy
  • Site Lifecycle(站点生命周期)
    生成项目报告:站点、发布站点
    命令:site
  • 在同一个生命周期中的命令,执行后面的命令,前面的命令自动执行

插件和目标

Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。

每个插件都能实现多个功能,每个功能就是一个插件目标。

Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。

依赖管理

基本概念

  • 当A jar包需要用到B jar包中的类时,我们就说A对B有依赖。

依赖范围

type 对主程序是否有效 对测试程序是否有效 是否参与打包与部署 是否传递
compile Y Y Y Y
test N Y N N
provided Y Y N N
  • compile
    默认依赖范围,作用域在编译、测试、运行时都有效。
  • test
    作用域在测试时有效。编译和运行时不需要,比如: Junit。
  • provided
    作用域在编译、测试时有效。运行时不需要,比如: servlet api被tomcat 容器提供。
  • runtime
    作用域在测试、运行时有效。编译时不需要,比如: jdbc的驱动包。

依赖传递性

  • 在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖
    B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。

依赖原则

  • 路径最短者优先
  • 路径相同时先声明者优先
    这里“声明”的先后顺序指的是dependency标签配置的先后顺序。

依赖排除

  • 当前工程为public,直接依赖environment。environment依赖commons-logging的1.1.1对于public来说是间接依赖。当前工程public直接依赖commons-logging的1.1.2.加入exclusions配置后可以在依赖environment的时候排除版本为1.1.1的commons-logging的间接依赖。

    <dependency>
    <groupId>com.ujiuye.maven</groupId>
    <artifactId>Environment</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 依赖排除 -->
    <exclusions>
    	<exclusion>
    		<groupId>commons-logging</groupId>
    		<artifactId>commons-logging</artifactId>
    	</exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.2</version>
    </dependency>
    

统一管理目标jar包的版本

<properties>
	<spring.version>4.1.1.RELEASE</spring.version>
</properties>
<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>
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-webmvc</artifactId>
 <version>${spring.version}</version>
</dependency>
这样一来,进行版本调整的时候只改一改地方就行了。

继承

多个子工程中依赖同样的jar包,但是采用test范围;由于test范围没有传递性;所以,每一个工程都需要对test范围的jar包进行单独依赖;

而如果希望修改多个工程中所依赖test范围的jar包版本,那么,一个一个项目去修改太麻烦,这时可以应用继承解决

继承的使用

项目的打包类型:pom、jar、war

packing默认是jar类型,

pom ---------> 父类型都为pom类型

jar ---------> 普通项目打jar包,一般普通项目设置jar

war ---------> web项目一般都是打war包,web项目的话设置war

  • 定义一个父工程,父工程packaging必须时pom

  • 在父工程中定义依赖的jar包,属于test范围

    <packaging>pom</packaging>
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>junit</groupId>
    				<artifactId>junit</artifactId>
    				<version>4.0</version>
    <!-- test范围表示测试的依赖范围,这个范围的依赖,我们的test中的程序是可以使用;而main中的程序是不可使用的; 如果是部署到Tomcat下的应用程序,依赖的jar包不能部署到Tomcat环境下的 -->
    				<scope>test</scope>
    			</dependency>
    		</dependencies>
    </dependencyManagement>
    
  • 在各个子工程中对父工程进行继承

    <parent>
        <groupId>com.mqf.maven</groupId>
        <artifactId>MavenParent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../MavenParent/pom.xml</relativePath>
    </parent>
    
  • 在各个子工程对父工程中的包进行依赖,不需要配置版本号和范围

    <dependency>
        <groupId>junit</groupId> 
        <artifactId>junit</artifactId>
    </dependency>
    
  • 如果修改版本,只修改父工程的依赖jar包版本即可

    项目聚合(一键安装)

  • 聚合:如果有多个工程需要安装,一个一个工程进行安装,太麻烦了;可以利用聚合,将多个工程管理起来,实现一键安装。

    (也就是将一个父工程进行安装,其他被聚合的工程也同时进行安装)

  • 在父工程中定义modules标签

    <!-- 项目聚合 -->
    <modules>
        <module>../Hello</module>
        <module>../HelloFriend</module>
        <module>../MakeFriend</module>
    </modules>
    

    创建maven版web工程

  • 创建Maven的Web工程,需要选择packaging 的值为war

  • 安装maven项目转web项目的插件JBLJavaToWeb找到后直接安装

  • 右击maven项目,选中JblJavaToWeb

酷站

· 搜索需要的jar包的依赖信息

· http://search.maven.org/

· http://mvnrepository.com/

posted @ 2021-09-01 20:05  Lucky_龍  阅读(30)  评论(0)    收藏  举报