Maven 自动化的构建工具

Maven 自动化的构建工具

第一章 Maven简介

1.1 Maven能做什么

1)项目的自动构建,帮助开发人员做项目代码的编译,测试, 打包,安装,部署等工作。

2)管理依赖(管理项目中使用的各种jar包)。

​ 依赖:项目中需要使用的其他资源, 常见的是jar 。 比如项目要使用mysql驱动。我们就说项目依赖mysql驱动。

1.2 什么是maven

maven是apache基金会的开源项目,使用java语法开发。 Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n] 或 ['mevn]。

maven是项目的自动化构建工具。 管理项目的依赖。

1.3 maven中的概念

①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合

1.4 maven工具的获取和安装

地址: http://maven.apache.org/ 从中下载 .zip文件。

安装:

  1. 确定JAVA_HOME 指定jdk的安装目录, 如果没有JAVA_HOME, 需要在windows的环境变量中创建JAVA_HOME, 它的值是jdk的安装目录

  2. 解压缩 apache-maven-3.3.9-bin.zip ,把解压后的文件放到一个目录中。

    目录的路径不要有中文, 不要有空格。

  3. 把maven安装目录中下的bin的路径添加到path中

  4. 测试maven的安装。 在命令行执行 mvn -v

    C:\Users\NING MEI>mvn -v
    Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
    Maven home: D:\tools\apache-maven-3.3.9\bin\..
    Java version: 1.8.0_101, vendor: Oracle Corporation
    Java home: C:\Program Files\Java\jdk1.8.0_101\jre
    Default locale: zh_CN, platform encoding: GBK
    OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
    

maven的其他安装方式:

  1. 确定JAVA_HOME是否有效

  2. 在环境变量中,创建一个叫做M2_HOME (或者MAVEN_HOME) ,它的值是maven的安装目录

    M2_HOME=D:\tools\apache-maven-3.3.9

  3. 在path环境变量中,加入 %M2_HOME%\bin

  4. 测试maven的安装,在命令行执行 mvn -v

    C:\Users\NING MEI>mvn -v
    Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
    Maven home: D:\tools\apache-maven-3.3.9\bin\..
    Java version: 1.8.0_101, vendor: Oracle Corporation
    Java home: C:\Program Files\Java\jdk1.8.0_101\jre
    Default locale: zh_CN, platform encoding: GBK
    OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
    

第二章Maven的核心概念

2.1 约定的目录结构

maven项目使用的大多人 遵循的目录结构。 叫做约定的目录结构。

一个maven项目是一个文件夹。 比如项目叫做Hello

Hello 项目文件夹
    \src
    	\main				叫做主程序目录(完成项目功能的代码和配置文件)
             \java          源代码(包和相关的类定义)
    		 \resources	    配置文件
    	\test               放置测试程序代码的(开发人员自己写的测试代码)
    		 \java          测试代码的(junit)
    		 \resources     测试程序需要的配置文件
    \pom.xml                maven的配置文件, 核心文件

2.2 POM

POM: Project Object Model 项目对象模型, maven把项目当做模型处理。 操作这个模型就是操作项目。

maven通过pom.xml文件实现 项目的构建和依赖的管理。




<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.0modelVersion>

    
  <groupId>com.bjpowernodegroupId>
  <artifactId>ch01-mavenartifactId>
  <version>1.0-SNAPSHOTversion>
  
  <properties>
     <java.version>1.8java.version>
     <maven.compiler.source>1.8maven.compiler.source>
     <maven.compiler.target>1.8maven.compiler.target>
  properties>
  
project>

2.3 坐标

坐标组成是 groupid, artifiactId, version。

坐标作用:确定资源的,是资源的唯一标识。 在maven中,每个资源都是坐标。 坐标值是唯一的。简称叫gav

  <groupId>com.bjpowernodegroupId>
  <artifactId>ch01-mavenartifactId>
  <version>1.0-SNAPSHOTversion>
  <packaging>jarpackaging>

groupId: 组织名称,代码。 公司,团体或者单位的标识。 这个值常使用的公司域名的倒写。
         例如:学校的网站 www.bjpowernode.com, groupId: com.bjpowernode

         如果项目规模比较大, 也可以是 域名倒写+大项目名称。
	     例如: www.baidu.com ,  无人车: com.baidu.appollo
artifactId:项目名称, 如果groupId中有项目, 此时当前的值就是子项目名。 项目名称是唯一的。
version:版本, 项目的版本号, 使用的数字。 三位组成。 例如 主版本号.次版本号.小版本号, 例如: 5.2.5。
         注意:版本号中有-SNAPSHOT, 表示快照,不是稳定的版本。      
   
packaging 项目打包的类型, 有jar ,war, ear, pom等等 默认是jar

项目使用gav:

1.每个maven项目,都需要有一个自己的gav

2.管理依赖,需要使用其他的jar ,也需要使用gav作为标识。

搜索坐标的地址: https://mvnrepository.com/

2.4 依赖 dependency

依赖:项目中要使用的其他资源(jar)。

需要使用maven表示依赖,管理依赖。 通过使用dependency和gav一起完成依赖的使用

需要在pom.xml文件中,使用dependencies 和dependency, 还有gav 完成依赖的说明。

格式:

<dependencies>
  
    
    <dependency>
        <groupId>log4jgroupId>
        <artifactId>log4jartifactId>
        <version>1.2.17version>
    dependency>
    
    
     <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>5.1.16version>
    dependency>

dependencies> 

maven使用gav作为标识,从互联网下载依赖的jar。 下载到你的本机上。  由maven管理项目使用的这些jar

2.5 仓库

仓库是存东西的,maven的仓库存放的是:

1.Maven 的插件,插件也是一些 jar,这些 jar 可以完成一定的功能。

2.我们自己开发项目的模块

3.第三方框架或工具的 jar 包

仓库的分类:

  1. 本地仓库(本机仓库): 位于你自己的计算机, 它是磁盘中的某个目录。

    本地仓库:默认路径,是你登录操作系统的账号的目录中/.m2/repository

    修改本地仓库的位置:修改maven工具的配置文件(maven的安装路径\conf\setting.xml)

        <localRepository>D:/openrepositorylocalRepository>
    
  2. 远程仓库: 需要通过联网访问的

    1)中央仓库: 通过Internet访问,为全世界所有 Maven工程服务。 最权威的。

    2)中央仓库的镜像: 架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库的访问,下载的压力

    3)私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务

配置仓库

修改 conf/settings.xml 文件


  <servers>
    <server>    
      <id>nexus-releasesid>    
      <username>adminusername>    
      <password>admin123password>    
    server>    
    <server>    
      <id>nexus-snapshotsid>    
      <username>adminusername>    
      <password>admin123password>    
    server> 
 servers>


        <mirror>     
            <id>nexus-releasesid>     
            <mirrorOf>*mirrorOf>     
            <url>http://192.168.0.50:8081/repository/maven-public/url>     
        mirror>    
        <mirror>     
            <id>nexus-snapshotsid>     
            <mirrorOf>*mirrorOf>     
            <url>http://192.168.0.50:8081/repository/maven-snapshots/url>     
        mirror>


   
        <mirror>
            <id>alimavenid>
            <name>aliyun mavenname>
            <url>http://maven.aliyun.com/nexus/content/groups/public/url>
            <mirrorOf>centralmirrorOf>
        mirror>


    <profile>    
      <id>nexusid>    
      <repositories>    
        <repository>    
          <id>nexus-releasesid>    
          <url>http://nexus-releasesurl>    
          <releases><enabled>trueenabled>releases>    
          <snapshots><enabled>trueenabled>snapshots>    
        repository>    
        <repository>    
          <id>nexus-snapshotsid>    
          <url>http://nexus-snapshotsurl>    
          <releases><enabled>trueenabled>releases>    
          <snapshots><enabled>trueenabled>snapshots>    
        repository>    
      repositories>    
      <pluginRepositories>    
         <pluginRepository>    
                <id>nexus-releasesid>    
                 <url>http://nexus-releasesurl>    
                 <releases><enabled>trueenabled>releases>    
                 <snapshots><enabled>trueenabled>snapshots>    
               pluginRepository>    
               <pluginRepository>    
                 <id>nexus-snapshotsid>    
                  <url>http://nexus-snapshotsurl>    
                <releases><enabled>trueenabled>releases>    
                 <snapshots><enabled>trueenabled>snapshots>    
             pluginRepository>    
         pluginRepositories>    
    profile>  


     <activeProfiles>    
      <activeProfile>nexusactiveProfile>    
    activeProfiles>

maven使用仓库: maven自动使用仓库, 当项目启动后, 执行了maven的命令, maven首先访问的是本地仓库, 从仓库中获取所需的jar, 如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像。

2.6 maven的生命周期,插件和命令

Maven有三套相互独立的生命周期

**Clean Lifecycle 在进行真正的构建之前进行一些清理工作。**Clean生命周期一共包含了三个阶段:

  • pre-clean 执行一些需要在clean之前完成的工作
  • clean 移除所有上一次构建生成的文件
  • post-clean 执行一些需要在clean之后立刻完成的工作

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

生命周期阶段 描述
validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
initialize 初始化构建状态,例如设置属性。
generate-sources 生成编译阶段需要包含的任何源码文件。
process-sources 处理源代码,例如,过滤任何值(filter any value)。
generate-resources 生成工程包中需要包含的资源文件。
process-resources 拷贝和处理资源文件到目的目录中,为打包阶段做准备。
compile 编译工程源码。
process-classes 处理编译生成的文件,例如 Java Class 字节码的加强和优化。
generate-test-sources 生成编译阶段需要包含的任何测试源代码。
process-test-sources 处理测试源代码,例如,过滤任何值(filter any values)。
test-compile 编译测试源代码到测试目的目录。
process-test-classes 处理测试代码文件编译后生成的文件。
test 使用适当的单元测试框架(例如JUnit)运行测试。
prepare-package 在真正打包之前,为准备打包执行任何必要的操作。
package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
pre-integration-test 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
integration-test 处理和部署必须的工程包到集成测试能够运行的环境中。
post-integration-test 在集成测试被执行后执行必要的操作。例如,清理环境。
verify 运行检查操作来验证工程包是有效的,并满足质量要求。
install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。

Site Lifecycle 生成项目报告,站点,发布站点。

  • pre-site 执行一些需要在生成站点文档之前完成的工作
  • site 生成项目的站点文档
  • post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy 将生成的站点文档部署到特定的服务器上

插件:要完成构建项目的各个阶段,要使用maven的命令, 执行命令的功能是通过插件完成的。插件就是jar,一些类。

命令: 执行maven功能是 由命令发出的。 比如 mvn compile

命令:

1) mvn clean: 清理命令, 作用删除以前生成的数据, 删除target目录。

​ 插件: maven-clean-plugin

2)mvn compile:编译命令,执行的代码编译, 把src/main/java目录中的java代码编译为class文件。

​ 同时把class文件拷贝到 target/classes目录。 这个目录classes是存放类文件的根目录(也叫做类路径,classpath)

​ 插件: maven-compiler-plugin 编译代码的插件

​ maven-resources-plugin 资源插件, 处理文件的。 作用是把src/main/resources目录中的文件拷贝target/classes目录中。

3)mvn test-compile: 编译命令, 编译src/test/java目录中的源文件, 把生成的class拷贝到target/test-classes目录。同时把src/test/resources目录中的文件拷贝到 test-clasess目录

​ 插件: maven-compiler-plugin 编译代码的插件

​ maven-resources-plugin 资源插件, 处理文件的

4)mvn test:测试命令, 作用执行 test-classes目录的程序, 测试src/main/java目录中的主程序代码是否符合要求。

​ 插件: maven-surefire-plugin

5)mvn package:打包,作用是把项目中的资源class文件和配置文件都放到一个压缩文件中, 默认压缩文件是jar类型的。 web应用是war类型, 扩展是jar,war的。

​ 插件:maven-jar-plugin 执行打包处理。 生成一个jar扩展的文件, 放在target目录下。打包的文件包含的是 src/main目录中的所有的生成的class和配置文件和test无关。

6)mvn install : 把生成的打包的文件 ,安装到maven仓库。

​ 插件: maven-install-plugin 把生成的jar文件安装到本地仓库。

2.7 继承和聚合


<modules>
    <module>project1module>
    <module>project2module>
    <module>project3module>
    ...
modules>


<parent>
    <groupId>it.com.pyggroupId>
    <artifactId>PYG-ParentartifactId>
    <version>0.0.1-SNAPSHOTversion>
parent>

聚合工程的依赖传递

一般都是在父模块的 pom 中定义项目用到的依赖以及版本,
然后在子模块的 pom 中, 需要什么依赖就直接引入, 不引入版本号, 依赖会自动从父模块中传递到子模块中

2.8 自定义配置插件

在pom.xml文件中, build标签中。设置插件


<build>
  <plugins>
    
	<plugin>
		<groupId>org.apache.maven.pluginsgroupId>
		<artifactId>maven-compiler-pluginartifactId>
		<version>3.8.1version>
		<configuration>
			<source>1.8source> 
			<target>1.8target> 
		configuration>
	plugin>
  plugins>
build> 

第三章 Maven和idea的集成

3.1 idea中集成maven

idea中有一个自带的maven。 我们要让idea使用自己安装的maven。

  1. 选择File- Settings

Maven 自动化的构建工具_第1张图片

2) File - Other Settings

Maven 自动化的构建工具_第2张图片
同上的设置

3.2 创建基于maven的普通java项目

Maven 自动化的构建工具_第3张图片

3.3 创建web项目

Maven 自动化的构建工具_第4张图片

3.4 导入module到idea

Maven 自动化的构建工具_第5张图片

第四章 依赖管理

①、dependencies:一个 pom.xml 文件中只能存在一个这样的标签。用来管理依赖的总标签。

②、dependency:包含在dependencies标签中,可以有无数个,每一个表示一个依赖

③、groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

④、type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。

⑤、scope:依赖的范围,默认值是 compile。后面会进行详解。

⑥、optional:标记依赖是否可选。

⑦、exclusions:用来排除传递性依赖,后面会进行详细介绍。

<project>     
    <dependencies>
        <dependency>
            <groupId>junitgroupId>     
            <artifactId>junitartifactId>     
            <version>3.8.1version>
            <type>...type>
            <scope>...scope>
            <optional>...optional>
            <exclusions>     
                <exclusion>     
                  <groupId>...groupId>     
                  <artifactId>...artifactId>     
                exclusion>
          exclusions>     
        dependency>        
      dependencies>     
project>

4.1 依赖范围

依赖范围:使用scope表示依赖的范围。

依赖范围表示: 这个依赖(jar和里面类)在项目构建的那个阶段起作用。

依赖范围scope :

​ compile:默认, 参与构建项目的所有阶段

​ test:测试,在测试阶段使用, 比如执行mvn test会使用junit 。

​ provided:提供者。 项目在部署到服务器时,不需要提供这个依赖的jar , 而是由服务器这个依赖的jar包

​ 明显的是servlet 和jsp 依赖

​ runtime:只在运行时使用,如JDBC驱动,适用运行和测试阶段。

​ system:类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

Maven 自动化的构建工具_第6张图片

4.2 依赖冲突

路径最短者优先原则

路径相同先声明优先原则

4.3 依赖排除

如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除。

exclusions:用来排除传递性依赖

Maven 自动化的构建工具_第7张图片

4.4 可选依赖

Optional标签标示该依赖是否可选,默认是false。可以理解为,如果为true,则表示该依赖不会传递下去,如果为false,则会传递下去

第五章 常用设置

1)讲的是properties它里面的配置

<properties>
    <maven.compiler.source>1.8maven.compiler.source> 源码编译 jdk 版本
    <maven.compiler.target>1.8maven.compiler.target> 运行代码的 jdk 版本
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
    <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> 生成报告的编码
properties>
  1. 全局变量

在properties定义标签,这个标签就是一个变量, 标签的文本就是变量的值。

使用全局变量表示 多个依赖使用的版本号。

使用步骤:

1.在properties标签中,定义一个标签,指定版本的值

<properties>
  <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
  <maven.compiler.source>1.8maven.compiler.source>
  <maven.compiler.target>1.8maven.compiler.target>
  
  <spring.version>5.2.5.RELEASEspring.version>
  <junit.version>4.11junit.version>
properties>
  1. 使用全局变量, 语法 ${变量名}
<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-coreartifactId>
  <version>${spring.version}version>
dependency>

<dependency>
  <groupId>org.springframeworkgroupId>
  <artifactId>spring-webartifactId>
  <version>${spring.version}version>
dependency>

3)使用资源插件

处理的配置文件的信息, maven默认处理配置文件

①:maven会把src/main/resources目录中的文件, 拷贝到target/classes目录下

②:maven只处理src/main/java目录中的 .java文件,把这些java文件编译为class,拷贝到 target/classes目录中。 不处理其他文件。

<build>
  
  <resources>
    <resource>
      <directory>src/main/javadirectory>
      <includes>
      
        <include>**/*.propertiesinclude>
        <include>**/*.xmlinclude>
      includes>
        
      <filtering>falsefiltering>
    resource>
  resources>
build>

你可能感兴趣的:(Maven,maven)