文章目录
参考文章
个人笔记,不同意见,望有交流
直接可以点击跳转连接
作者 菜鸟教程
作者:JavaEdge :maven clean/install/build/package命令行详解
一、Maven
如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。
以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。
而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
1、Maven是什么
Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型 (POM) 的概念,Maven
可以从一条中心信息管理项目的构建、报告和文档。
Maven 是意第绪语,意思 是知识的积累者,最初是为了简化 Jakarta Turbine 项目中的构建过程。有几个项目,每个项目都有自己的 Ant 构建文件,它们都略有不同。JAR 被检入 CVS。我们想要一种标准的方式来构建项目,清楚地定义项目的组成,发布项目信息的简单方法,以及在多个项目之间共享 JAR 的方法。
现在可以用于构建和管理任何基于 Java 的项目的工具。
我们希望我们已经创建了一些东西,可以让 Java 开发人员的日常工作更轻松,并且通常有助于理解任何基于 Java 的项目。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
2、特征(官网的)
-
遵循最佳实践的简单项目设置 - 在几秒钟内启动新项目或模块
(就是搭建项目模块都挺快) -
所有项目的一致使用 - 意味着新开发人员进入项目没有加速时间
(可以在项目中规定统一pomjar包版本,这样开发有利于版本统一) -
高级依赖管理,包括自动更新、依赖关闭(也称为传递依赖)
(依赖的自定义,可以设置自动加载,更新依赖,等)
-
能够轻松地同时处理多个项目
(字面意思) -
一个庞大且不断增长的库和元数据存储库,开箱即用,并与最大的开源项目安排到位,以实时提供最新版本
(就是说他的jar包中央仓库) -
可扩展,能够轻松地用Java 或脚本语言编写插件
(可以轻松的通过一定的自定义方式满足工作上的要求) -
只需很少或无需额外配置即可即时访问新功能
-
在 Maven 之外进行依赖管理和部署的 Ant 任务
作者 :雨临Lewis:Maven和Ant简介以及两者的区别 -
基于模型的构建:Maven 能够将任意数量的项目构建为预定义的输出类型,例如 JAR、WAR 或基于项目元数据的分发,而在大多数情况下无需编写任何脚本。
(大概的意思就是打成什么包) -
项目信息的一致站点:使用与构建过程相同的元数据,Maven 能够生成一个网站或 PDF,包括您想要添加的任何文档,并添加到该标准报告中关于项目的开发状态。此信息的示例可以在本网站左侧导航底部的“项目信息”和“项目报告”子菜单下查看。
-
发布管理和分发发布:无需太多额外配置,Maven 将与您的源代码控制系统(如 Subversion 或 Git)集成,并根据某个标签管理项目的发布。它还可以将其发布到分发位置以供其他项目使用。Maven 能够发布单独的输出,例如 JAR、包含其他依赖项和文档的存档,或作为源分发。
-
依赖管理:Maven 鼓励使用 JAR 和其他依赖的中央存储库。Maven 带有一种机制,项目的客户可以使用该机制从中央 JAR 存储库下载构建项目所需的任何 JAR,这与 Perl 的 CPAN 非常相似。这允许 Maven 的用户跨项目重用 JAR,并鼓励项目之间的通信以确保处理向后兼容性问题。
二、安装
Maven是基于java的,所以jdk必须先安装,不同版本要求的不同,8.0就行
官网下载
2.1、下载
一般使用windows直接下载解压到你的文件夹内就行
2.2、配置
- 先 配环境变量 这和其他的差不多
MAVEN_HOME 加 绝对路劲
path添加 %MAVEN_HOME%\bin
检查是否成功
- idea配置Maven
设置的build Execution deployment里面的Maven
设置你的Maven的位置 本地厂库 设置文件 ,这个本地路劲会根据settings走 - 对了,还有一般情况大家都把中央仓库还是配上阿里的中央仓库吧
- 修改setting文件:conf\Setting
添加阿里巴巴镜像文件
<mirror>
<id>aliyun-maven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven mirror</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
修改本地厂库位置
有默认的,但是建议自定义
修改maven默认为jdk1.8
<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>
三、Maven的文件目录
3.1. Maven规定的程序目录结构
Maven 为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用。
Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建 Maven 工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。
目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码。
3.2. Maven软件的文件目录
3.3. 坐标和仓库中 jar 包的存储路径之间的对应关系
四、创建一个Maven项目(超级简单)
在idea中直接 new -》 project-》 Maven
我们一般会去选择一个模板去创建Maven项目,这样更方便
这个是Maven官网的文档里面说明了这些原型模板
Archetype ArtifactIds | Description |
---|---|
maven-archetype-archetype | 用于生成示例原型项目的原型。 |
maven-archetype-j2ee-simple | 用于生成简化示例 J2EE 应用程序的原型。 |
maven-archetype-mojo | 用于生成示例 Maven 插件示例的原型。 |
maven-archetype-plugin | 用于生成示例 Maven 插件的原型。 |
maven-archetype-plugin-site | 用于生成示例 Maven 插件站点的原型。 |
maven-archetype-portlet | 用于生成示例 JSR-268 Portlet 的原型。 |
maven-archetype-quickstart | 用于生成示例 Maven 项目的原型。 |
maven-archetype-simple | 用于生成简单 Maven 项目的原型。 |
maven-archetype-site | 用于生成示例 Maven 站点的原型,该站点演示了一些受支持的文档类型,例如 APT、XDoc 和 FML,并演示了如何创建您的站点。 |
maven-archetype-site-simple | 用于生成示例 Maven 站点的原型。 |
maven-archetype-webapp | 用于生成示例 Maven Webapp 项目的原型。 |
五、常用命令
构建命令
运行 Maven 中和构建操作相关的命令时,必须进入到 pom.xml 所在的目录。如果没有在 pom.xml 所在的目录运行 Maven的构建命令,那么会看到下面的错误信息:
The goal you specified requires a project to execute but there is no POM in this directory
TIP
mvn -v 命令和构建操作无关,只要正确配置了 PATH,在任何目录下执行都可以。
而构建相关的命令要在 pom.xml 所在目录下运行——操作哪个工程,就进入这个工程的 pom.xml 目录。
2、清理操作 mvn clean
mvn clean
效果:删除 target 目录
3、编译操作mvn compile test-compile
主程序编译:mvn compile
- 错误记录:mvn全局命令突然不能用了,解决方式是,在path环境变量中吧MAVEN_HOME移动到java_home后面了
编译 成功截图
主体程序编译结果存放的目录:target/classes
测试程序编译:mvn test-compile
编译 成功截图生成测试代码
测试程序编译结果存放的目录:target/test-classes
4、测试操作 mvn test
mvn test
测试的报告存放的目录:target/surefire-reports
5、打包操作 mvn package
mvn package
打包的结果——jar 包,存放的目录:target
6、安装操作 mvn install
mvn install
[INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\target\pro01-maven-java-1.0-SNAPSHOT.jar to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
[INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\pom.xml to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.pom
安装的效果是将本地构建过程中生成的 jar 包存入 Maven 本地仓库。这个 jar 包在 Maven 仓库中的路径是根据它的坐标生成的。
坐标信息如下:
com.atguigu.maven
pro01-maven-java
1.0-SNAPSHOT
在 Maven 仓库中生成的路径如下:
D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
另外,安装操作还会将 pom.xml 文件转换为 XXX.pom 文件一起存入本地仓库。所以我们在 Maven 的本地仓库中想看一个 jar 包原始的 pom.xml 文件时,查看对应 XXX.pom 文件即可,它们是名字发生了改变,本质上是同一个文件。
六、Maven的命令使用和一些操作
- 运行
mvn archetype:generate
开始创建
6.1创建web工程 mvn archetype:generate
在学习尚硅谷web工程的时候离谱的报了一个druid这个类找不到错误,真的离谱,这个时候你需要把这个jar包放到你的Tomcat的lib包里面就行了
创建
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
-- 输入id
Define value for property 'groupId': com.atguigu.maven
-- 名称
Define value for property 'artifactId': pro02-maven-web
-- 版本
Define value for property 'version' 1.0-SNAPSHOT: :【直接回车,使用默认值】
Define value for property 'package' com.atguigu.maven: :【直接回车,使用默认值】
--
Confirm properties configuration: groupId: com.atguigu.maven artifactId: pro02-maven-web version: 1.0-SNAPSHOT package: com.atguigu.maven Y: :【直接回车,表示确认】
打包 mvn package
部署 放到Tomact的wabapps目录 然后运行Tomact就行了
6.2、Web工程依赖java工程
导入java工程的坐标
<!-- 配置对Java工程pro01-maven-java的依赖 -->
<!-- 具体的配置方式:在dependency标签内使用坐标实现依赖 -->
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
打包 mvn package
查看lib中的是否有导入的包
查看工程依赖 mvn dependency:list
groupId:artifactId:打包方式:version:依赖的范围
以树形结构查看工程依赖 mvn dependency:tree
6.3 jar包的依赖范围scope标签
compile | test | provided | system | runtime | import
编译
测试
规定(服务器已经部署的jar包不参与部署)
系统依赖 ( )
运行(只对测试和运行的classpath有效)
,该依赖与classpath的关系与 provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
导入依赖
该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中。
6.4 jar包的依赖传递
在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。
- B 依赖 C 时使用 compile 范围:可以传递
- B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。
6.5 依赖排除
当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
七、生命周期等东西
验证 编译 测试(可选) 打包 检查 安装 部署
为了让构建过程自动化完成,Maven 设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作
7.2、Maven 中的聚合
和继承类似原理
聚合可以让你一键执行 Maven 命令 很多构建命令都可以在“总工程”中一键执行。
以 mvn install 命令为例:Maven 要求有父工程时先安装父工程;有依赖的工程时,先安装被依赖的工程。我们自己考虑这些规则会很麻烦。但是工程聚合之后,在总工程执行 mvn install 可以一键完成安装,而且会自动按照正确的顺序执行。
配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然
不要出现依赖循环
A 工程依赖 B 工程,B 工程依赖 C 工程,C 工程又反过来依赖 A 工程,那么在执行构建操作时会报下面的错误:
DANGER
[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:
7.3 插件
Maven 的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由 Maven 插件完成的。例如:编译就是由
maven-compiler-plugin-3.1.jar 插件来执行的。
一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。Default 生命周期中有 compile 和 test-compile 两个和编译相关的环节,这两个环节对应 compile 和
test-compile 两个目标,而这两个目标都是由 maven-compiler-plugin-3.1.jar 插件来执行的。
简单的来说具体的功能都是有一些jar包提供的,而一个jar包可能对应多个功能
7.4、仓库的概念
-
本地仓库
-
远程仓库
局域网:我们自己搭建的 Maven 私服,例如使用 Nexus 技术。
中央仓库
镜像仓库:内容和中央仓库保持一致,但是能够分担中央仓库的负载,同时让用户能够就近访问提高下载速度,例如:Nexus aliyun
八、pom.xml(Maven核心)
POM======Project Object Model,项目对象模型。和 POM 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现
8.1、基础生成的pom
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!--项目坐标信息-->
<groupId>com.bbb</groupId><!--公司组织项目-->
<artifactId>ssm_swagger_20220804</artifactId><!--模块-->
<version>1.0-SNAPSHOT</version><!-- 版本-->
<!-- 当前Maven工程的打包方式,可选值有下面三种: -->
<!-- jar:表示这个工程是一个Java工程 -->
<!-- war:表示这个工程是一个Web工程 -->
<!-- pom:表示这个工程是“管理其他工程”的工程 -->
<packaging>war</packaging>
<!--定义属性值-->
<properties>
<!-- 工程构建过程中读取源码时使用的字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- 当前工程所依赖的jar包 -->
<dependencies>
<!-- 使用dependency配置一个具体的依赖 -->
<dependency>
<!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- scope标签配置依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
九、父子项目(继承)
Maven工程之间,A 工程继承 B 工程 。
就是pom配置继承。
作用
管理依赖信息的版本。
大型项目的模块拆分。
不同模块都需要配置自己的依赖信息
- 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
- 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
- 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。
具体操作
命令操作
- 创建父工程
修改pom
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>
-
在父工程下面创建子模块
-
管理依赖
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。
如果你自己配置了version 那子过程就会覆盖父工程的,采纳子过程的内容
-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependencies>
- 声明自定义属性
<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 自定义标签,维护Spring版本数据 -->
<atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${atguigu.spring.version}</version>
</dependency>
IDEA操作
- 创建一个Maven父工程
- 创建子工程
- pom.xml的变化
父中的变化
<groupId>com.atguigu</groupId>
<artifactId>pro07-maven-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>pro08-maven-parent</module>
</modules>
子中多了一个parent
<parent>
<artifactId>pro07-maven-parent</artifactId>
<groupId>com.atguigu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
十、IDEA使用Maven
10.1. 指定Maven
IDEA 会根据我们在这里指定的 Maven 家目录自动识别到我们在 settings.xml 配置文件中指定的本地仓库。每次创建 Project 后都需要设置 Maven 家目录位置,否则 IDEA 将使用内置的 Maven 核心程序(不稳定)并使用默认的本地仓库位置。(一般设置一次就可以了,但是有的时候又脑抽过默认的了)
10.2. 使用Maven命令
命令可以很复杂,本人不太会
比如
# -D 表示后面要附加命令的参数,字母 D 和后面的参数是紧挨着的,中间没有任何其它字符
# maven.test.skip=true 表示在执行命令的过程中跳过测试
mvn clean install -Dmaven.test.skip=true
注意命令的作用范围
10.3. 拉取其他模块到这个工程(导入模块)
目前我们通常使用的都是 Git(本地库) + 码云(远程库)的版本控制系统,结合 IDEA 的相关操作方式
导入整个工程比较容易直接把包拿过来,重新配置一下maven仓库就行
导入一个单独的模块的时候就麻烦一点了
选择导入的模块,在选择导入的方式,web模块注意web。xml文件目录