Maven学习笔记
1.基本介绍
1.1 为什么会出现maven
1)java项目会有大量的jar包需要依赖,各个jar包又有自己的依赖。
2)项目需要拆分成多个工程模块,模块之间的依赖关系也需要管理。
所以需要一个管理工具,统一管理。maven就出现了。
1.2 maven简介
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。
构建:
1)清理:删除以前的编译结果,为重新编译做好准备。
2)编译:将 Java 源程序编译为字节码文件。
3)测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
4)报告:在每一次测试后以标准的格式记录和展示测试结果。
5)打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应 war 包。
6)安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
7)部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行
1.3 maven核心概念
1)POM
2)约定的目录结构
3)坐标
4)依赖管理
5)仓库管理
6)生命周期
7)插件和目标
8)继承
9)聚合
1.4 如何使用
1)下载maven的bin,在apache官方网站可以下载。
2)配置环境变量。
Maven 的核心程序中仅仅定义了抽象的生命周期,而具体的操作则是由 Maven 的插件来完成的。可是
Maven 的插件并不包含在 Maven 的核心程序中,在首次使用时需要联网下载。
下载得到的插件会被保存到本地仓库中。本地仓库默认的位置是:~\.m2\repository。
maven部署
1)部署maven核心程序
1)检查JAVA_HOME环境变量
C:\Windows\System32>echo %JAVA_HOME%
D:\DevInstall\jdk1.7.0_07
2)解压Maven的核心程序
将apache-maven-3.2.2-bin.zip解压到一个非中文无空格的目录下。
3)配置环境变量
M2_HOME D:\DevInstall\apache-maven-3.2.2
path D:\DevInstall\apache-maven-3.2.2\bin
4)查看Maven版本信息验证安装是否正确
C:\Windows\System32>mvn -v
Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T21:51:42+08:00)
Maven home: D:\DevInstall\apache-maven-3.2.2\bin\..
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: D:\DevInstall\jdk1.7.0_07\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
2)修改默认仓库
1)默认本地仓库位置:~\.m2\repository
~表示当前用户的家目录,例如:C:\Users\[你当前登录系统的用户名]
2)指定本地仓库位置的配置信息文件:apache-maven-3.2.2\conf\settings.xml
3)在根标签settings下添加如下内容:<localRepository>[本地仓库路径,也就是RepMaven.zip的解压目录]</localRepository>
2. maven目录结构
2.1 maven项目目录结构
Hello
|---src
|---|---main
|---|---|---java
|---|---|---resources
|---|---test
|---|---|---java
|---|---|---resources
|---pom.xml
2.2 项目目录对应关系
类路径
src目录下的源代码叫类路径
也会把classes下的编译后的目录叫类路径
webContent
对应编译后的项目名称文件夹,这个文件夹最后放在服务器上,如tomcat下的webapps
2.3 WEB-INF、BOOT-INF、META-INF
WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
/WEB-INF/web.xml : Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/ : 包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中。
/WEB-INF/lib/ : 存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。
页面放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html
META-INF 相当于一个信息包,目录中的文件和目录获得 Java 2 平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件,在打包时自动生成。
简单的说法:就是存储了项目的元信息,其中文件manifest.mf仅此一份,描述了程序的基本信息、Main-Class的入口、jar依赖路径Class-Path。
BOOT-INF
spring-boot maven打包,一般pom.xml文件里会加
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
这样打的jar里会多一个目录BOOT-INF。
解决办法,如果A子模块包依赖了B子模块包,在B子模块的pom文件,加入
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
https://blog.csdn.net/cdnight/article/details/88728359
https://cloud.tencent.com/developer/article/1445768
3. pom
Project Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。
Maven 工程的核心配置。
4. 坐标
GAV
[1]groupid:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本
<groupId>com.xxx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
SNAPSHOT 快照版本
RELEASE 稳定版本
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.xx.mec</groupId>
<artifactId>mec-parent</artifactId>
<version>0.6-SNAPSHOT</version>
</dependency>
5. 依赖
当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖。
用 dependency 标签指定被依赖 jar 包的坐标就可以了
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
依赖具有传递性
A依赖B,B依赖C,A正常情况下是可以使用C的 主要看scope依赖的范围是否未compile
3.1 依赖的范围
scope 依赖的范围
<scope>test</scope>
<scope>compile</scope>
<scope>provided</scope>
test 测试范围
compile 编译范围
provided 已提供范围
compile test provided
主程序 √ × √
测试程序 √ √ √
参与部署 √ × ×
3.2 依赖的排除
依赖的排除
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
3.3 统一管理版本
统一管理所依赖 jar 包的版本
<properties>
<xx.spring.version>4.1.1.RELEASE</xx.spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${atguigu.spring.version}</version>
</dependency>
</dependencies>
properties可用于标识任意属性,不一定非要是版本version.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
6. 仓库
本地仓库
远程仓库
局域网-私服 Nexus
中央仓库
中央仓库镜像
仓库里的内容:
maven自身所需的插件
第三方工具或框架的jar包
自己开发的maven工程
ps 第一方jdk 第二方开发者自己 第三方其他人
7. 生命周期
生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。
运行任何一个阶段的时候,它前面的所有阶段都会被运行。
Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
每个插件都能实现多个功能,每个功能就是一个插件目标。
Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标。
clean
validate
compile
test
package
install
deploy
有三套相互独立的生命周期,分别是:
1)Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
2)Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
3)Site Lifecycle 生成项目报告,站点,发布站点
Clean 生命周期
1)pre-clean 执行一些需要在 clean 之前完成的工作
2)clean 移除所有上一次构建生成的文件
3)post-clean 执行一些需要在 clean 之后立刻完成的工作
Site 生命周期
1)pre-site 执行一些需要在生成站点文档之前完成的工作
2)site 生成项目的站点文档
3)post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
4)site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大
的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。
Default 生命周期
Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,
只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
8. 继承
需要一个统一的父工程,统一管理版本信息等。
8.1 创建父工程
创建父工程和创建一般的 Java 工程操作一致,唯一需要注意的是:打包方式处要设置为 pom。
父工程:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
8.2 在子工程中引用父工程
子项目
此时如果子工程的 groupId 和 version 如果和父工程重复则可以删除。
<parent>
<!-- 父工程坐标 -->
<groupId>com.xxx.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>>../Parent/pom.xml</relativePath>
<!-- 指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径 -->
</parent>
在子项目中重新指定需要的依赖,可不写范围和版本号。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
9. 聚合
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行 clean 操作。
而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作。
<modules>
<module>../Hello</module>
<module>../Hello1</module>
<module>../Hello2</module>
</modules>
maven核心概念
POM
约定的目录结构
坐标gav
依赖
仓库
生命周期
插件和目标
继承
聚合
maven常用命令
命令 | 解释 |
---|---|
mvn compile | |
mvn test-compile | |
mvn test | |
mvn site | |
mvn package | |
mvn install | |
mvn clean | |
mvn eclipse:eclipse | |
mvn idea:idea | |
mvn -Dtest package | |
mvn jar:jar | |
mvn test -skipping compile -skipping test-compile | |
mvn eclipse:clean | |
mvn dependency:list | |
mvn deploy | |
mvn clean install-U | |
mvn source:jar mvn source:jar-no-fork | |
https://www.cnblogs.com/wkrbky/p/6352188.html