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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Maven自动化构建依赖管理工具

20181206153018397.jpg1Maven简介

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中我们已经不知不觉的进行了构建的操作。

例如:清理、测试、编译、部署等等。

20181206141914260.png

构建过程中的主要环节

清理:把上一次编译得到的*.class字节码文件删除,为下一次编译做好准备。

编译:重新将Java源程序编译为*.class字节码文件。

主体程序编译

测试程序编译

测试:执行预先写好的测试程序对主体程序进行测试

报告:测试结果

打包:将整个工程中的所有代码和配置文件等资源封装到一个压缩文件中,为部署做好准备

Java工程:jar包

Web工程:war包

安装:在Maven这样的工具中将打包得到的文件存放到Maven的仓库中。

部署:将打包的结果放到服务器的指定目录下使其可以运行。

构建工具在自动化部署过程中的作用

20181206142139458.png

3Maven工具的使用

3.1工作机制

20181206142155861.png

3.2解压配置Maven的核心程序

apache-maven-3.5.4-bin.zip解压到非中文没有空格的目录下。

配置环境变量

path

套路:bin目录

20181206142257602.png

MAVEN_HOME

套路:bin目录的上一级目录

20181206142333738.png

※验证:在命令行查看Maven的版本

mvn -v

20181206142354259.png

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

20181206142414449.png

3.3核心程序配置

配置文件路径

MAVEN_HOME/conf/settings.xml


例如:MAVEN_HOME=D:\installations\apache\apache-maven-3.5.4

那么settings.xml的路径是:

D:\installations\apache\apache-maven-3.5.4\conf\settings.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插件

要设置的点

更换工作区后需要重新设置

20181206143253944.png

指定Maven核心程序的位置

20181206143314350.png

20181206143336840.png

4单个的Maven工程

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


20181206143353743.png

20181206143401974.png


20181206143409224.png

Finish

4.2创建打包方式为war的Maven工程

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

20181206143441315.png

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

20181206143502352.png

4.3创建打包方式为pom的Maven工程

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

20181206143518679.png

20181206143526931.png

4.4相关概念

坐标:在Maven仓库的众多jar包中唯一的定位到某一个jar包

groupId:公司或组织域名倒序+项目名称

artifactId:模块名称(当前正在创建的工程的工程名)

version:版本

约定的目录结构

Maven为了实现自动化构建,设计约定的目录结构,基于约定的目录结构,Maven就知道在工程中Java源文件位置、配置文件位置、测试程序的位置等等,进而可以对源文件进行编译、执行、加载读取配置文件以及执行测试。

20181206143550263.png

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:\workstation\Station180906\Pro14_MavenSingleProject

第三步:执行Maven命令

mvn clean

mvn compile

mvn test

mvn package

mvn install

mvn deploy


执行效果参考如下:


20181206143645671.png

Eclipse执行

20181206143713827.png

在pom.xml文件上点右键→Run As→Maven clean等等

执行效果参考如下:

20181206143730831.png

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

2018120614380485.png

2018120614381494.png

如果点击Maven build可以直接执行以前执行过的Maven命令。

具体命令介绍

mvn clean

清理

mvn compile

编译主程序

mvn test-compile

编译测试程序

mvn test

执行junit测试程序

20181206143833282.png

mvn package

执行打包操作。Java工程打jar包,Web工程打war包。生成的jar包或war包会放在target目录下。

5Maven jar包下载失败

5.1现象表现

表现形式不局限于这一种,但是这是最典型、最直接的表现。

2018120614385814.png

另一种表现形式:


20181206143927295.png


*.lastUpdated结尾的文件:Maven在下载jar包的过程中文件名都是以lastUpdated结尾的,表示这个文件正在下载。但是如果下载失败,那么Maven不会自动删除lastUpdated后缀。

下次重新下载时,Maven会忽略以lastUpdated为后缀的文件,也不会重新下载。我们如果不进行人为干预、处理,那么这些下载失败的jar包就会一直保持这个状态。

人为干预的方式是:手动把lastUpdated结尾的文件删除,让Maven重新下载。而这个操作使用clearLastUpdated.bat脚本后可以提高效率。


5.2clearLastUpdated.bat脚本使用

第一步

将clearLastUpdated.bat文件放在Maven仓库的根目录下。

第二步

使用文本编辑器打开clearLastUpdated.bat文件,如果没有文本编辑器使用记事本也一样

20181206144213672.png

第三步

双击打开,按照提示使用

20181206144230316.png


有可能遇到的问题

cls

@ECHO OFF

SET CLEAR_PATH=D:

SET CLEAR_DIR=D:\Program Files\maven

20181206144255564.png

解决办法:让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:在具体加密算法确定的前提下,输入数据有细微改变,输出数据跟着改变;输入数据不变,任何时候执行加密结果都一样。

校验文件原理

20181206144427349.png

基于哈希加密的文件校验工具使用

20181206144443658.png

20181206144452927.png

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。

测试

20181206145857116.png

20181206145950478.png

在子工程中指定父工程

<!-- 指定当前工程的父工程 -->
<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

20181208085731473.png


对依赖进行管理

父工程

<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聚合

概念

将各个模块工程聚合在一起形成项目的整体。

作用

让项目模块化程度更高,结构更清晰。

一键安装。

测试

20181206151631718.png

20181206151717924.png

20181206151810330.png


聚合的配置

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


对聚合工程执行install命令

能够自动理顺安装顺序

20181206152308755.png

7Maven酷站

https://mvnrepository.com/

http://maven.aliyun.com/mvn/search

相关文章
|
1月前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
47 1
|
1月前
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
3天前
|
缓存 Java Maven
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法!在处理Maven项目问题时,首先检查Maven配置是否正确。接着通过“File--Invalidata Caches”清除IDEA缓存并重启。使用Maven命令`mvn dependency:purge-local-repository`和`mvn dependency:resolve`清除本地依赖缓存。最后,在Terminal中输入`mvn clean install`完成构建。
【简单四步教你解决♥十分有效】Maven依赖报错、依赖或插件导入失败的万能解决办法
|
24天前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
78 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
9天前
|
Serverless 决策智能 UED
构建全天候自动化智能导购助手:从部署者的视角审视Multi-Agent架构解决方案
在构建基于多代理系统(Multi-Agent System, MAS)的智能导购助手过程中,作为部署者,我体验到了从初步接触到深入理解再到实际应用的一系列步骤。整个部署过程得到了充分的引导和支持,文档详尽全面,使得部署顺利完成,未遇到明显的报错或异常情况。尽管初次尝试时对某些复杂配置环节需反复确认,但整体流程顺畅。
|
29天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
48 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
14天前
|
缓存 监控 安全
公司电脑监控软件的 Gradle 构建自动化优势
在数字化办公环境中,公司电脑监控软件面临代码更新频繁、依赖管理和构建复杂等挑战。Gradle 构建自动化工具以其强大的依赖管理、灵活的构建脚本定制及高效的构建缓存与增量构建特性,显著提升了软件开发效率和质量,支持软件的持续更新与优化,满足企业对员工电脑使用情况的监控与管理需求。
28 3
|
26天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
49 9
|
24天前
|
运维 jenkins Java
Jenkins 自动化局域网管控软件构建与部署流程
在企业局域网管理中,Jenkins 作为自动化工具,通过配置源码管理、构建及部署步骤,实现了高效、稳定的软件开发与部署流程,显著提升局域网管控软件的开发与运维效率。
39 5
|
1月前
|
jenkins 测试技术 持续交付
自动化测试框架的构建与优化:提升软件交付效率的关键####
本文深入探讨了自动化测试框架的核心价值,通过对比传统手工测试方法的局限性,揭示了自动化测试在现代软件开发生命周期中的重要性。不同于常规摘要仅概述内容,本部分强调了自动化测试如何显著提高测试覆盖率、缩短测试周期、降低人力成本,并促进持续集成/持续部署(CI/CD)流程的实施,最终实现软件质量和开发效率的双重飞跃。通过具体案例分析,展示了从零开始构建自动化测试框架的策略与最佳实践,包括选择合适的工具、设计高效的测试用例结构、以及如何进行性能调优等关键步骤。此外,还讨论了在实施过程中可能遇到的挑战及应对策略,为读者提供了一套可操作的优化指南。 ####