Maven基本的知识点以及最常用的打包命令

一、 Maven简介

1.1 认识Maven

Maven 是目前最流行的自动化构建工具
使用Maven管理的项目:

  • Maven 可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目;
  • Maven 提供规范的管理各个常用 jar 包及其各个版本,并且可以自动下载和引入项目中;
  • Maven 可以根据指定版本自动解决 jar 包版本兼容问题;
  • Maven 可以把 jar 包所依赖的其它 jar 包自动下载并引入项目。

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

1.2 安装Maven环境

  1. 需要从maven的官网下载Maven的安装包
  2. 解压安装包,解压到一个目录,非中文目录
    bin目录 :是执行程序的,主要是mvn.cmd
    conf目录 :Maven工具本身的配置文件 settings.xml
  3. 配置Maven的环境变量
  • 要确保安装了Java环境,因为Maven本身就是Java写的,所以要求必须安装JDK,并配置其环境变量
  • 在系统的环境变量中,指定一个M2_HOME的名称, 指定它的值是Maven工具安装目录,bin之前的目录 ,M2_HOME=D:\work\maven_work\apache-maven-3.3.9, 再把M2_HOME加入到path之中,在所有路径之前加入 %M2_HOME%\bin;
  1. 验证是否安装成功:mvn -v

二 、Maven的核心概念

2.1 Maven 工程约定目录结构

maven项目的目录和文件的位置都是规定的
在这里插入图片描述
说明:Hello:根目录,也就是工程名
src:源代码
main:主程序
java:主程序的java源码
resources:主程序的配置文件
test:测试程序
java:测试程序的java源码
resources:测试程序的配置文件
pom.xml:Maven工程的核心配置文件

maven的pom.xml记录的关于构建项目的各个方面的设置,maven从pom.xml文件开始,按照助约定的工程目录编译,测试,打包,部署,发布项目。

2.2 POM文件

Project Object Model项目对象模型。Maven把一个项目的结构和内容抽象成一个模型,在xml文件中进行声明,以方便进行构建和描述,pom.xml是Maven的灵魂。所以,maven环境搭建好之后,所有的学习和操作都是关于pom.xml的。

 <!-- Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0 -->
  <modelVersion>4.0.0</modelVersion>

  <!--
    组织 id,一般是公司域名的倒写。格式可以为:
        1. 域名倒写。 例如 com.baidu
        2. 域名倒写+项目名。例如 com.baidu.Hello
  -->
  <groupId>com.tang</groupId>

  <!--项目名称,也是模块名称,对应 groupId 中项目中的子项目。-->
  <artifactId>ch04-di-anno</artifactId>

  <!--
      项目的版本号。如果项目还在开发中,是不稳定版本,
      通常在版本后带-SNAPSHOT version 使用三位数字标识,例如 1.1.0
  -->
  <version>1.1.0-SNAPSHOT</version>

  <!--项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar-->
  <packaging>jar</packaging>

  <!--
      properties 是用来定义一些配置属性的,
      例如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为 UTF-8,防止中文乱码,
      也可定义相关构建版本号,便于日后统一升级。
  -->
  <properties>
    <!--Maven构建项目使用编码,避免中文乱码-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!--编译代码使用的jdk版本-->
    <maven.compiler.source>1.8</maven.compiler.source>
    <!--运行程序使用的jdk版本-->
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <!--
      Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包,
      在 Maven 中,这些 jar 就被称 为依赖,使用标签 dependency 来配置。
      而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven 把所有的 jar 包也都视为项目存在了
  -->
  <dependencies>
    <!-- 单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--Spring的依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

   /dependencies>

<!--  build 表示与构建相关的配置,例如设置编译插件的 jdk 版本-->
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>3.1.0</version>
      </plugin>
    </plugins>
  </build>
<!--
    继承:parent
	在 Maven 中,如果多个模块都需要声明相同的配置,
	例如:groupId、 version、有相同的依赖、或者相同的组件配置等,
	也有类似 Java 的继承机制,用 parent 声明要继承的父工程的 pom 配置。 
-->
<!--
    聚合:modules
    在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,
    该模块打包方式为 pom,并且在其中使用 modules 聚合的 其它模块,
    这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。 
-->

2.3 仓库

在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 核心程序仅仅定义了自动化构建项目的生命周期,但具体的构建工作是由特定的构件完成的。而且为了提高构建 的效率和构件复用,maven把所有的构件统一存储在某一个位置,这个位置就叫做仓库。 仓库是存放东西的,Maven 仓库存的是:

  • Maven 的插件,插件也就是一些 jar,这些 jar 可以完成一定的功能。
  • 我们自己开发项目的模块
  • 第三方框架或工具的 jar 包

根据仓库存储的位置,把仓库分为本地仓库和远程仓库
本地仓库:存在于当前电脑上,默认存放在~.m2\repository中,为本机上所有的Maven工程服务。你也可以 通过Maven的配置文件Maven_home/conf/settings.xml中修改本地仓库所在的目录。 ~ 是用户的主目录,windows系统中是 c:/user/登录系统的用户名 。
哈哈哈
最后一行就是修改本地仓库的代码,我的是放在E盘下,注意不要有中文目录

远程仓库:不在本机上, 通过网络才能使用。多电脑共享使用的
①:中央仓库:通过Internet访问,为全世界所有 Maven工程服务。 最权威的。
②:中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库 的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
③:私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务。公司中常常使用这种方式。
在这里插入图片描述
在 Maven 构建项目的过程中如果需要某些插件,首先会到 Maven 的本地仓库中查找,如果找到则可以直接 使用;如果找不到,它会自动连接外网,到远程中央仓库中查找;如果远程仓库中能找到,则先把所需要的插件 下载到本地仓库,然后再使用,并且下次再用到相同的插件也可以直接使用本地仓库的;如果没有外网或者远程 仓库中也找不到,则构建失败。

2.4 生命周期

对项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相 对应的命令,对开发者而言仅仅需要掌握一小堆的命令就可以完成项目各个阶段的构建工作。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个 阶段,都是从这个生命周期的最初阶段开始的。
对于我们程序员而言,无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前边阶段是否构建,Maven 都会自动构建。这也就是 Maven 这种自动化构建工具给我们带来的好处。

2.5 插件

maven的插件: maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类。

2.6 坐标

Maven 把任何一个插件都作为仓库中的一个项目进行管理,用一组(三个)向量组成的坐标来表示。坐标在仓库 中可以唯一定位一个 Maven 项目。
groupId:组织名,通常是公司或组织域名倒序+项目名
artifactId:模块名,通常是工程名
version:版本号
需要特别指出的是

  • 项目在仓库中的位置是由坐标来决定的:
  • groupId、artifactId 和 version 决定项目在仓库中 的路径
  • artifactId 和 version 决定 jar 包的名称。

2.7 依赖

一个 Maven 项目正常运行需要其它项目的支持,Maven 会根据坐标自动到本地仓库中进行查找。 对于程序员自己的 Maven 项目需要进行安装,才能保存到仓库中。
不用 maven 的时候所有的 jar 都不是你的,需要去各个地方下载拷贝,用了 maven 所有的 jar 包都是你的,想要谁,叫谁的名字就行。maven 帮你下载,也就是说如果本地仓库没有,Maven会自动帮我们下载。

三、 依赖管理

依赖范围, 使用scope表示的。 scope的值有 compile, test, provided ,默认是compile
scope:表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用,也就是这些jar包在哪些阶段要用到。
在这里插入图片描述
maven构建项目 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
compile表示所有阶段都要用,test表示只在测试阶段要用,provided主程序和测试都要用,但是打包和部署就不需要了。

<!-- 单元测试依赖-->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

比如这个单元测试的依赖,它的依赖范围是test,表明它只在测试阶段起作用,在别的阶段这个依赖就没有用了
provided 意思是提供者,表明自己已经提供了 jar 包,所以它不会参与到打包部署阶段

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>

比如这个servlet依赖,当我们用到 jar 包里的类时,tomcat已经为我们提供了这些jar包,我们不需要准备。
我们也可以从打包的命令来看,当我们执行 mvn package命令后,如果这个依赖是provided,那么从打包的结果看它是不会带有这个jar的,而如果是其他的scope,就需要maven为它提供jar了,所以会一起打包。

四、 Maven常用设置

maven常用操作:

  1. maven的属性设置
    设置maven的常用属性,在上面的POM.XML文件中可以看到
  2. maven的全局变量
    自定义的属性,
    1. 在properties标签 中通过自定义标签声明变量(标签名就是变量名)
    2. 在pom.xml文件中的其它位置,使用 ${标签名}
      自定义全局变量一般是定义依赖的版本号, 当你的项目中要使用多个相同的版本号,
      先使用全局变量定义, 在使用${变量名}
<properties>
   <!--自定义变量,表示版本号-->
  <spring.version>5.2.5</spring.version>
</properties>

<!--Spring的依赖-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${spring.version}</version>
</dependency>
  1. 资源插件

src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes 和 targe/test-classes 目录中,

但是这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。把以下内容放到 <build>标签中。

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory><!--所在的目录-->
      <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <!--filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了-->
      <filtering>false</filtering>
    </resource>
  </resources>
</build>

最后,maven中常用的打包命令:
打包所有模块:

mvn clean install -Dmaven.test.skip=true 抛弃测试用例打包

打包之后的jar包存放在target目录下,然后放到服务器启动即可。

多模块Maven工程单独打包某一模块工程

clean package -pl module_name -am

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值