• Maven自动化构建依赖管理工具


    在这里插入图片描述

    1Maven简介
    Maven是一款自动化“构建”和“依赖”管理的工具。
    2提出问题
    2.1jar包管理问题
    jar包从哪来的?
    官网下载
    CSND……
    51CTO……
    ……
    jar包之间存在依赖关系
    A jar包中用到了B jar包中的类,就说A依赖B。jar包之间普遍存在的依赖关系错综复杂,极大的增加了我们开发项目时jar包管理的难度。在jar包非常多的时候,手动管理几乎是不可能的。
    spring-core依赖commons-logging
    commons-fileupload依赖commons-io
    ……
    各个工程在开发时分别复制相同的jar包
    更好的做法是各个工程对同一份jar包进行各自的引用。
    2.2项目架构
    以之前学习的技术来说,我们开发的都是单一架构的项目。
    单一架构;整个项目只有一个工程。
    但是,以后我们要开发分布式架构。
    分布式架构:一个项目是由很多个工程组成的,而各个工程之间存在下面四种关系:
    依赖:由Maven实现
    继承:由Maven实现
    聚合:由Maven实现
    调用:需要借助其他分布式架构技术实现
    Dubbo+Zookeeper组合
    SpringBoot+SpringCloud组合
    2.3自动化构建
    构建的概念
    “构建”其实就是以开发时所编写的代码为“原材料”去“生产”出来一个可以运行的项目过程。
    我们开发的是工程,但是真正在服务器上运行的是工程“构建”的结果。
    工程→一只鸡
    构建→炖熟了
    构建结果→可以吃的鸡
    在没有具体使用Maven这样的构建工具前,其实在Eclipse中我们已经不知不觉的进行了构建的操作。
    例如:清理、测试、编译、部署等等。

    在这里插入图片描述
    构建过程中的主要环节
    清理:把上一次编译得到的*.class字节码文件删除,为下一次编译做好准备。
    编译:重新将Java源程序编译为*.class字节码文件。
    主体程序编译
    测试程序编译
    测试:执行预先写好的测试程序对主体程序进行测试
    报告:测试结果
    打包:将整个工程中的所有代码和配置文件等资源封装到一个压缩文件中,为部署做好准备
    Java工程:jar包
    Web工程:war包
    安装:在Maven这样的工具中将打包得到的文件存放到Maven的仓库中。
    部署:将打包的结果放到服务器的指定目录下使其可以运行。
    构建工具在自动化部署过程中的作用

    在这里插入图片描述
    3Maven工具的使用
    3.1工作机制

    在这里插入图片描述
    3.2解压配置Maven的核心程序
    apache-maven-3.5.4-bin.zip解压到非中文没有空格的目录下。
    配置环境变量
    path
    套路:bin目录

    在这里插入图片描述
    MAVEN_HOME
    套路:bin目录的上一级目录
    在这里插入图片描述

    ※验证:在命令行查看Maven的版本
    mvn -v
    在这里插入图片描述

    ※注意:当前系统中必须正确安装了JDK

    在这里插入图片描述

    3.3核心程序配置
    配置文件路径
    MAVEN_HOME/conf/settings.xml

    例如:MAVEN_HOME=D:installationsapacheapache-maven-3.5.4
    那么settings.xml的路径是:
    D:installationsapacheapache-maven-3.5.4confsettings.xml
    settings.xml配置文件结构,还没有配置

    <?xml version="1.0" encoding="UTF-8"?>
    
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
      <!-- localRepository
      我们在这里配置本地仓库位置
      <localRepository>/path/to/local/repo</localRepository>
      -->
      <pluginGroups></pluginGroups>
      <proxies></proxies>
    
      <servers></servers>
      
      <!-- 在这里配置阿里云镜像服务器地址 -->
      <mirrors></mirrors>
      
      <!-- 指定Maven工程的JDK版本 -->
      <profiles></profiles>
    </settings>
    

    配置本地仓库路径
    一定要记得从注释中拿出来,否则无效!!!

      <!-- localRepository
       | The path to the local repository maven will use to store artifacts.
       |
       | Default: ${user.home}/.m2/repository
      <localRepository>/path/to/local/repo</localRepository>
      -->
      <!--配置自己的路径-->
    <localRepository>D:RepMaven0906</localRepository>
    

    配置阿里云镜像服务器地址
    注意:一定到配置到mirrors标签的里面

    <mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
     <!--这个是固定不变的-->
    <mirror>
    	<id>nexus-aliyun</id>
    	<mirrorOf>central</mirrorOf>
    	<name>Nexus aliyun</name>
    	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    </mirrors>
    

    配置Maven工程的JDK版本
    一定要配置到profiles标签的里面!!!可以直接复制

    <profiles>
       <profile>
          <id>jdk-1.8</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>
    </profiles>
    

    注意:Maven工程能够使用的JDK版本会受到Maven核心程序版本的限制。

    3.4Eclipse中设置Maven插件
    要设置的点
    更换工作区后需要重新设置

    在这里插入图片描述
    指定Maven核心程序的位置

    在这里插入图片描述
    指定settings.xml配置文件路径
    在这里插入图片描述

    4单个的Maven工程
    4.1创建打包方式为jar的Maven工程

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    Finish
    4.2创建打包方式为war的Maven工程
    总体步骤和创建jar包工程一致,只是在选择打包方式的时候选择war。

    在这里插入图片描述

    然后需要生成web.xml,做法是工程→右键

    在这里插入图片描述
    4.3创建打包方式为pom的Maven工程
    创建过程和前面基本一致,只是把打包方式改成pom即可。这样的工程中不写Java代码、框架配置文件、页面等等,而是管理其他Maven工程。

    在这里插入图片描述

    在这里插入图片描述

    4.4相关概念
    坐标:在Maven仓库的众多jar包中唯一的定位到某一个jar包
    groupId:公司或组织域名倒序+项目名称
    artifactId:模块名称(当前正在创建的工程的工程名)
    version:版本
    约定的目录结构
    Maven为了实现自动化构建,设计约定的目录结构,基于约定的目录结构,Maven就知道在工程中Java源文件位置、配置文件位置、测试程序的位置等等,进而可以对源文件进行编译、执行、加载读取配置文件以及执行测试。

    在这里插入图片描述

    POM
    Project Object Model工程对象模型
    Maven对每一个Maven工程进行构建环节操作和依赖的管理都是基于pom.xml
    生命周期
    特点:在每一个生命周期内部,执行任何一个环节,Maven都会从整个生命周期最初的位置开始执行。所以,假设我们想执行下面几个操作:
    compile
    test
    package
    install
    那么,直接执行install就可以了,compile、test、package都会包含在install执行的过程中。
    Maven这样设计的目的是为了进一步提高构建过程的自动化程度,想构建的时候不必过问具体的构建过程,而是直接执行最终步骤即可。
    Clean生命周期[了解]
    pre-clean
    clean
    post-clean
    Default生命周期[了解]
    最重要的生命周期,包含了主要的构建环节
    ……
    compile
    ……
    test-compile
    ……
    test
    ……
    package
    ……
    install
    deploy
    Site生命周期[了解]
    pre-site
    site
    post-site
    site-deploy
    4.5常用Maven命令
    命令行执行
    第一步:打开命令行窗口
    第二步:进入pom.xml所在的目录
    D:workstationStation180906Pro14_MavenSingleProject
    第三步:执行Maven命令
    mvn clean
    mvn compile
    mvn test
    mvn package
    mvn install
    mvn deploy

    执行效果参考如下:

    在这里插入图片描述

    Eclipse执行

    在这里插入图片描述
    在pom.xml文件上点右键→Run As→Maven clean等等
    执行效果参考如下:

    在这里插入图片描述

    如果想要执行没有提供的Maven命令,点击Maven build…

    在这里插入图片描述

    在这里插入图片描述
    如果点击Maven build可以直接执行以前执行过的Maven命令。
    具体命令介绍
    mvn clean
    清理
    mvn compile
    编译主程序
    mvn test-compile
    编译测试程序
    mvn test
    执行junit测试程序

    在这里插入图片描述
    mvn package
    执行打包操作。Java工程打jar包,Web工程打war包。生成的jar包或war包会放在target目录下。

    5Maven jar包下载失败
    5.1现象表现
    表现形式不局限于这一种,但是这是最典型、最直接的表现。

    在这里插入图片描述

    另一种表现形式:
    在这里插入图片描述

    *.lastUpdated结尾的文件:Maven在下载jar包的过程中文件名都是以lastUpdated结尾的,表示这个文件正在下载。但是如果下载失败,那么Maven不会自动删除lastUpdated后缀。
    下次重新下载时,Maven会忽略以lastUpdated为后缀的文件,也不会重新下载。我们如果不进行人为干预、处理,那么这些下载失败的jar包就会一直保持这个状态。
    人为干预的方式是:手动把lastUpdated结尾的文件删除,让Maven重新下载。而这个操作使用clearLastUpdated.bat脚本后可以提高效率。

    5.2clearLastUpdated.bat脚本使用
    第一步
    将clearLastUpdated.bat文件放在Maven仓库的根目录下。
    第二步
    使用文本编辑器打开clearLastUpdated.bat文件,如果没有文本编辑器使用记事本也一样

    在这里插入图片描述
    第三步
    双击打开,按照提示使用

    在这里插入图片描述
    有可能遇到的问题
    cls
    @ECHO OFF
    SET CLEAR_PATH=D:
    SET CLEAR_DIR=D:Program Filesmaven

    在这里插入图片描述

    解决办法:让Maven仓库的路径没有空格!!!

    5.3基本思路
    将下载失败的jar包删除,让Eclipse重新下载。
    找到jar包的存储位置
    jar包→右键→properties→复制路径
    删除
    点击工程→alt+F5→OK
    如果再次下载的jar包还是损坏的,就再试一次

    5.4文件校验工具的使用
    原理:哈希加密算法
    哈希算法中包含很多具体算法,具体算法之间主要的区别是加密强度不同。具体加密算法包括:MD5、CRC32、SHA1等等
    特点1:不可逆,不能通过密文反推出明文。
    特点2:在具体加密算法确定的前提下,不管输入的数据体积多么庞大或多么小,输出的数据长度固定。例如:MD5加密的结果固定是32位,不管输入的是1KB的数据还是100T的数据输出的结果都是32位。
    特点3:在具体加密算法确定的前提下,输入数据有细微改变,输出数据跟着改变;输入数据不变,任何时候执行加密结果都一样。
    校验文件原理
    在这里插入图片描述
    基于哈希加密的文件校验工具使用

    在这里插入图片描述

    在这里插入图片描述

    6工程之间的关系
    6.1依赖
    概念
    A工程(jar包)用到了B工程(jar包)中的类,那么A依赖B。
    Maven工程中通过坐标配置依赖信息

    <!-- 配置junit依赖 -->
    <dependencies>
    	<!-- 具体依赖 -->
    	<dependency>
    		<!-- junit的jar包的坐标 -->
    		<groupId>junit</groupId>
    		<artifactId>junit</artifactId>
    		<version>4.12</version>
    		<!-- 依赖的范围 -->
    		<scope>test</scope>
    	</dependency>
    	<!-- 依赖Spring-core -->
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-core</artifactId>
    		<version>4.0.0.RELEASE</version>
    	</dependency>
    </dependencies>
    

    在工程间建立依赖关系

    <dependencies>
    	<!-- 配置对Dao工程的依赖 -->
    	<dependency>
    		<groupId>com.maven</groupId>
    		<artifactId>Dependency_Dao</artifactId>
    		<version>0.0.1-SNAPSHOT</version>
    	</dependency>
    </dependencies>
    

    根据坐标在本地仓库中查找jar包的方式

    		<groupId>com.maven</groupId>
    		<artifactId>Dependency_Dao</artifactId>
    		<version>0.0.1-SNAPSHOT</version>
    

    Maven仓库的根目录/com/maven/Dependency_Dao/0.0.1-SNAPSHOT/Pro18_Dependency_Dao-0.0.1-SNAPSHOT.jar

    Maven根据依赖的jar包的坐标到Maven本地仓库中查找jar包,如果找不到就无法解析依赖信息。
    Maven的install命令
    将Maven工程安装到本地仓库
    依赖的传递性
    A依赖B,B依赖C,A是否可以不配置依赖信息直接使用C?可以使用。但是需要参照依赖范围:
    compile范围:可以传递
    test范围:不能传递
    provided范围:不能传递
    依赖的范围
    compile:默认的依赖范围。
    对main目录下的代码:有效
    对test目录下的代码:有效
    部署到服务器:有效
    test:专门用于测试的jar包
    对main目录下的代码:无效
    对test目录下的代码:有效
    部署到服务器:不参与
    provided:表示“已提供”的jar包
    对main目录下的代码:有效
    对test目录下的代码:有效
    部署到服务器:不参与

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

    开发阶段:有效
    部署阶段:无效
    依赖传递的排除
    作用:在依赖一个jar包的时候,将这个jar包传递给我们的某个jar包排除

    	<!-- 依赖Spring-core -->
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-core</artifactId>
    		<version>4.0.0.RELEASE</version>
    		<scope>compile</scope>
    		<!-- 配置依赖的排除 -->
    		<exclusions>
    			<exclusion>
    				<groupId>commons-logging</groupId>
    				<artifactId>commons-logging</artifactId>
    			</exclusion>
    		</exclusions>
    	</dependency>
    

    6.2继承
    概念
    工程A继承工程B。
    作用
    在父工程中统一管理依赖信息。
    要求
    作为父工程的Maven工程打包方式必须是pom。
    测试

    在这里插入图片描述
    在这里插入图片描述
    在子工程中指定父工程

    <!-- 指定当前工程的父工程 -->
    <parent>
    	<groupId>com</groupId>
    	<artifactId>Parent</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	
    	<!-- 父工程的pom.xml文件的相对路径 -->
    	<relativePath>../Parent/pom.xml</relativePath>
    </parent>
    

    PS:此时子工程中会提示groupid和version相对于父工程重复,可以删除。

    当然了创建子工程可以使用maven module
    在这里插入图片描述

    对依赖进行管理
    父工程

    <dependencyManagement>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-core</artifactId>
    			<version>4.0.0.RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>4.0.0.RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-beans</artifactId>
    			<version>4.0.0.RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-expression</artifactId>
    			<version>4.0.0.RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-jdbc</artifactId>
    			<version>4.0.0.RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-orm</artifactId>
    			<version>4.0.0.RELEASE</version>
    		</dependency>
    	</dependencies>
    </dependencyManagement>
    

    子工程

    <dependencies>
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-core</artifactId>
    	</dependency>
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-context</artifactId>
    	</dependency>
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-beans</artifactId>
    	</dependency>
    </dependencies>
    

    依赖统一管理的好处
    开发人员在需要某个jar包的依赖信息时不必到网上去找,直接从父工程中复制进来即可。整个项目中使用的依赖信息有一个统一的来源,不会变的杂乱。
    如果需要统一修改一组jar包的版本时,不必到各个子工程中逐个修改,在父工程中统一修改即可。一处修改,处处生效。

    配置properties

    <!-- 配置properties -->
    <properties>
    	<atguigu.spring.version>4.0.0.RELEASE</atguigu.spring.version>
    </properties>
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework</groupId>
    				<artifactId>spring-core</artifactId>
    				<version>${atguigu.spring.version}</version>
    			</dependency>
    			……
    

    6.3聚合
    概念
    将各个模块工程聚合在一起形成项目的整体。
    作用
    让项目模块化程度更高,结构更清晰。
    一键安装。
    测试

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    聚合的配置

    <!-- 配置聚合 -->
    <modules>
    	<module>../Two/pom.xml</module>
    	<module>../Three/pom.xml</module>
    </modules>
    

    对聚合工程执行install命令
    能够自动理顺安装顺序

    在这里插入图片描述

    7Maven酷站
    https://mvnrepository.com/
    http://maven.aliyun.com/mvn/search

  • 相关阅读:
    C语言I博客作业03
    C语言I博客作业02
    macwingIDE python3.5 配置
    JAVA必会算法插入排序
    java匿名内部类的另一个用途
    JAVA必会算法选择排序
    Mac elasticsearch 5.2.2 单机双节点配置
    JAVA必会算法二分查找法
    AOP 事物连接,记忆连接数据库,连接池
    线程的意义与一些常见面试问题
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812059.html
Copyright © 2020-2023  润新知