- 提问:什么是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:
dependencies
和dependencyManagement
有什么区别?
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
格式。
tar
是tape 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_profile
d底部添加了: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.搞定