【项目管理工具】Apache Maven

  • 提问:什么是Maven

一款Apache提供的自动化构建工具;
用于「自动化构建」和「依赖管理」;
在这里插入图片描述

  • 提问:项目无MAVEN这类项目管理工具时,有哪些麻烦事?
    一个层(表现层/业务逻辑层/持久化层)就需要创建一个工程,所以项目庞大时就会异常麻烦;
    必须搜集好所有JAR包;
    一个JAR包依赖的其他JAR包需要自己手动添加到项目中;同样的JAR包会出现在不同项目中,浪费空间,也让工程臃肿;(Maven让JAR包保存在仓库中,只需要引用接口)
    需要把JAR包手动复制粘贴到指定路径下,且在IDE中手动配置他们;

  • 提问:Spring Boot中如何手动添加JAR包?

  • 提问:Maven是什么?

1.一款服务于【Java】平台的【自动化构建】工具;
(工具的演进:Make - Ant - Maven - Gradle)
2.构建;编译;

Maven的核心概念

约定的目录结构(重要)

在这里插入图片描述

POM(重要)

POM.xml的官方文档模版:
https://maven.apache.org/pom.html

<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.0</modelVersion>
 
  <!-- The Basics -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>...</packaging>
  <dependencies>...</dependencies>
  <parent>...</parent>
  <dependencyManagement>...</dependencyManagement>
  <modules>...</modules>
  <properties>...</properties>
 
  <!-- Build Settings -->
  <build>...</build>
  <reporting>...</reporting>
 
  <!-- More Project Information -->
  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>
 
  <!-- Environment Settings -->
  <issueManagement>...</issueManagement>
  <ciManagement>...</ciManagement>
  <mailingLists>...</mailingLists>
  <scm>...</scm>
  <prerequisites>...</prerequisites>
  <repositories>...</repositories>
  <pluginRepositories>...</pluginRepositories>
  <distributionManagement>...</distributionManagement>
  <profiles>...</profiles>
</project>

坐标(重要)

依赖(最重要)

传递依赖

如果项目中引用了一个JAR包,而该JAR包又引用了其他JAR包,那么默认情况下,项目编译时,Maven会把直接引用和间接引用的JAR包都下载到本地(~/.m2/repository
在这里插入图片描述

排除依赖

如果我们只想下载直接引用的JAR包,就需要在POM.xml中作如下配置,给出需要排出的坐标:
在这里插入图片描述

依赖冲突

无项目管理工具时,若项目中多个JAR同时引用了相同JAR时,会产生依赖冲突;
但Maven采用了【两种】【避免冲突的策略】,因为Maven中不存在依赖冲突;

策略1:短路优先

在这里插入图片描述
策略2:声明优先
在这里插入图片描述

仓库

Maven会先去【本地仓库】中寻找依赖;
若本地仓库无,会去【中央仓库】下载;
若中央仓库无,会看项目父POM中是否配置有远程仓库,会去【远程仓库】下载;
若远程仓库无,Maven报错;

生命周期/插件/目标

继承

  • 提问:父项目中POM:dependenciesdependencyManagement有什么区别?

dependencies:
即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

dependencyManagement:
只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
如果不在子项目中声明依赖,是不会从父项目中继承下来的;
只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

总结:
dependencies:父POM一旦写了依赖,子POM中会自动引入;
dependencyManagement:父POM写了依赖后,子POM也必须写相同依赖才会引入,否则不会;它的作用只是统一配置依赖版本,子POM写了依赖后不用再写版本,自动和父POM版本同步;

比如:

    <properties>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

聚合

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

其他操作

  • 提问:如何解压JAR包?压缩成JAR包?

解压缩:
$jar xvf 文件名.jar

创建指定文件名JAR包(若存在同名则会覆盖):
$jar cf 文件名.jar 文件名

创建指定文件名JAR包,且显示打包过程:
$jar cvf 文件名.jar 文件名
https://blog.csdn.net/zilaike/article/details/82147178

Maven报错

  • Element 'project' cannot have character [children],because the type's content type
    POM文件中输入有非法字符,仔细找一找;

  • The packaging for this project did not assign a file to the build artifact
    在这里插入图片描述
    在这里插入图片描述

——————————————————————————————————

废弃

Maven

Maven到底是什么呢?
Maven是基于项目对象模型,Maven的核心功能便是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包;
而这里pom.xml文件对于学了一点maven的人来说,就有些熟悉了,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来?
等等类似问题我们需要搞清楚,如果需要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目可以这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能了。

Maven是一个项目管理工具;
项目管理工具的意思是:管理项目的依赖模块关系。


Maven的命令

Mavan约定的目录结构:

src
    -main
        -package
-test
    -java
        -package
resources

在这里插入图片描述

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

  • 提问:compile/package/install的区别?

1.compile,编译命令,会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件及字节码文件;
2.package,这个命令会在你的项目路径下一个target目录,并且拥有compile命令的功能进行编译,同时会在target目录下生成项目的jar/war文件;
3.install,该命令包含了package命令功能,不但会在项目路径下生成class文件和jar包,同时会在你的本地maven仓库生成jar文件,供其他项目使用;
在这里插入图片描述

maven集成命令-U -B -P -e -X

  • -U
    强制打包;
    强制让Maven检查所有SNAPSHOT依赖更新,确保集成处于最新的状态;
    若无该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多;

  • -B
    让Maven使用批处理模式构建项目,能够避免一些需要人工参与交互而造成的挂起状态。

  • -P

  • -e
    若构建出现异常,该参数能让Maven打印完整的stack trace,以方便分析错误原因;

  • -X

mvn compile

执行mvn compile命令,完成编译操作
执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。

mvn clean

执行mvn clean命令
执行完毕后,会将target目录删除。

mvn clean compile
录入 mvn clean compile命令;
组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类;

mvn clean test
录入 mvn clean test命令;
组合指令,先执行clean,再执行test,通常应用于测试环节;

mvn clean package
cmd 中录入 mvn clean package命令;
组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前;

mvn clean package -DskipTests
不执行测试用例,但 编译测试用例类 生成相应的class文件至 target/test-classes 下;

mvn clean package -Dmaven.test.skip=true
不执行测试用例,也不编译测试用例类;

mvn clean package -Dmaven.test.skip=true -U
不执行测试用例,也不编译测试用例类;且强制打包(让Maven检查所有SNAPSHOT依赖更新);

mvn test

执行mvn test命令,完成单元测试操作;
执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)

mvn package

执行mvn package命令,完成打包操作;
执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war;

mvn install

执行mvn install命令,完成将打好的jar包安装到本地仓库的操作;
执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用;

执行过程:
清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包

mvn clean install
录入 mvn clean install 查看仓库,当前项目被发布到仓库中
组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前

执行过程:
清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包
部署————将打好的包发布到资源仓库中


下载 ON MAC

查看版本:
mvn -version 或者 mvn -v

显示信息:
Apache Maven 3.6.0 
Maven home: /Library/apache-maven-3.6.0
Java version: 1.8.0_131, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.1", arch: "x86_64", family: "mac"

下载
brew install maven

POM:最重要,一个xml文件
=Project Object Model
可以通过配置完成很多功能:依赖管理(含直接依赖和传递依赖)、生命周期、插件需要

Dependency:依赖
开发一个项目A需要很多依赖(dependencies):如依赖项目B和C;
项目B依赖于项目D,项目C依赖于项目E;
可以说A也间接依赖(transitive dependencies)于DE。
所以开发项目A的时候,需要项目BCDE的JAR包。

于是开发时,需要下载大量的JAR包;数量多还不是最重要,最重要不知谁依赖于谁,依赖关系很复杂

Maven帮助解决复杂的依赖关系。在Maven的POM中添加依赖块,如junit包:

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>${junit,version}</version>
   <scope>test</scope>
</dependency>

<dependency>
   <groupId>org.xxx</groupId>
   <artifactId>spring-webmvc</artifactId>
</dependency>

Maven还提供所有的传递依赖管理,这是个透明过程。

Maven是如何实现这些功能的?
Coordinates 坐标
Maven看作一个仓库,所有软件提供商将商品提供到仓库中;Maven痛过坐标(4个要素)可以找到这些软件:

groupId (可省,省略后表示依赖的是JAR包,其他值可能是WAR包或POM对象)
artifactId
version
packaging

对Maven的配置文件进行修改,以满足自己需求
apache-maven-3.6.0 - conf - setting.xml
复制至User/用户名/.m2文件夹;
此文件夹需要在第一次项目运行后才自动生成,若还未生成,可手动创建;
或者输入mvn help:system生成;
生成后的.m2文件夹系统默认是隐藏的,查看Mac中隐藏文件的方式如下:
https://blog.csdn.net/weixin_42915286/article/details/84335176
*注:若需要升级Maven版本,不需要每次都重复此步骤,因已将setting.xml放入本地文档了。

1.Repository存放目录(可选项)

Default: ${user.home}/.m2/repository  //默认的仓库地址
<localRepository>/path/to/local/repo</localRepository>
 -->
<localRepository>/System/Library/......</localRepository>   //若想修改,修改于此

2.Mirror 镜像
中心仓库的副本,减少中心仓库的负载,访问成功率会大大提高;
使用国内镜像也可以避免Great Fire Wall的毒害;

如:阿里云镜像
<mirror>  
     <id>alimaven</id>  
     <name>aliyun maven</name>  
     <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
     <mirrorOf>central</mirrorOf>          
     </mirror>
  </mirrors>

在IDEA中配置Maven
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 提问:怎么在IDEA添加依赖 JAR包?
    1.POM添加(Maven);2.手动添加

1.POM添加
https://mvnrepository.com
在这里插入图片描述
或者Maven中央仓库:
https://search.maven.org/
在这里插入图片描述
在这里插入图片描述

2.下载添加
在这里插入图片描述
在这里插入图片描述
External Library保存地址为JAR包实际内存地址;
比如JAR包存放在桌面上再导入,接下来把桌面文件删除,项目中的JAR包地址也会删除;
建议将JAR包放入项目Lib文件夹中再导入。

注:在IDE中直接删除JAR包会导致本地文件也被删除,记得存档。

注:下载的JAR包若文件名最后为lastUpdated,代表包未下载完整,要重新下载。
————————
注:.tar.gz.zip的文件的区别

tar.gz压缩格式用于unix的操作系统;
zip用于windows的操作系统;但在windows系统中用WinRar工具同样可以解压缩tar.gz格式。

tartape archive(磁带存档)的简称,它出现在还没有软盘驱动器、硬盘和光盘驱动器的计算机早期阶段;
随着时间的推移, tar命令逐渐变为一个将很多文件进行存档的工具,目前许多用于Linux操作系统的程序就是打包为tar档案文件的形式。
在Linux里,tar一般和其他没有文件管理的压缩算法文件结合使用,用tar打包整个文件目录结构成一个文件,再用gz,bzip等压缩算法压缩成一次。也是Linux常见的压缩归档的处理方法。
.tar.gz其实上是2个工具。tar是打包工具,把很多文件打包成一个文件,gz是压缩格式;
因为太常用,所以*nix下tar命令是直接支持gz压缩和解压缩的。

参考博客:
https://blog.csdn.net/westos_linux/article/details/78968012


报错

  • -bash mvn: command not found
    此报错在Mac一文中也有提及:
    https://blog.csdn.net/weixin_42915286/article/details/84335176

此报错是因为系统找不到Maven的根目录,那么一定是bash_profile中关于Maven根目录的地址配置有问题(或者JDK配置有问题);
而我的问题在于:
1.bash_profiled底部添加了:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" export PATH,导致Maven的Path被覆盖;
可以用echo $PATH查看PATH是否更新正确
2.Maven的Path添加了变量,多了几行,导致写错的几率增加;建议不是用变量,只写一行;

*3.bash_profile更新后没有source ~/.bash_profile(本人没有忘记写,但是这是易错点)

这是一个规范例子:
export PATH=$PATH:/Library/apache-maven-3.6.0/bin

更多bash_profile语法:去了解Mac的Shell;
——————————————————————————

  • IDEA中Maven下载依赖不成功时,怎么重新下载?

1.在本地Repository中手动删除对应的包
在这里插入图片描述
2.Reimport(重新下载)

在这里插入图片描述
3.搞定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值