maven学习笔记整理
1.Maven是什么?
Maven【[ˈmevən]】这个词可以翻译为"专家",“内⾏”。 作为Apache组织中的⼀个颇为成功的开源项⽬, Maven主要服务于基于java平台的项⽬构建,依赖管理和项⽬信息管理。
Apache Maven 是一套软件工程管理和整合工具。基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建、报告和文档。
maven可以简单理解为项目构建工具,非常容易管理项目
2.什么是项目构建工具
项⽬构建
不管你是否意识到什么是项目构建,构建(build)是每⼀位程序员每天都在做的⼯作。
来到公司,我们做的第⼀ 件事就是从源码库签出最新的代码,然后进⾏单元测试,如果测试失败,调试,修 复错误代码。
编写⾃⼰的单元测试及产品代码。
除了编写源代码,有相当⼀部分时间花在了编译,运⾏单元测 试,⽣成⽂档,打包和部署等繁琐且不起眼的⼯作上,这就是构建。
让这⼀系列⼯作完全⾃动化,使得软件的构建可以像全⾃动流⽔线 ⼀样,只需要⼀条简单的命令,所有繁琐的步骤都能够⾃动完成
构建工具有哪些
Ant构建
最早的构建⼯具,基于IDE, ⼤概是2000年有的,当时是最流⾏java构建⼯具,不过它的XML脚本编写格 式让XML⽂件特别⼤。对⼯程构建过程中的过程控制特别好
Gradle
属于结合以上两个的优点,它继承了Ant的灵活和Maven的⽣命周期管理,它最后被google作为了 Android御⽤管理⼯具。它最⼤的区别是不⽤XML作为配置⽂件格式,采⽤了DSL格式,使得脚本更加简 洁。
3.Maven的四大特性
3.1依赖管理系统
Maven为Java世界引⼊了⼀个新的依赖管理系统jar包管理 jar 升级时修改配置⽂件即可。在Java世界 中,可以⽤groupId、artifactId、version组成的Coordination(坐标)唯⼀标识⼀个依赖。
任何基于Maven构建的项⽬⾃身也必须定义这三项属性,⽣成的包可以是Jar包,也可以是war包
<dependency>
<groupId>javax.servlet</groupId> com.baidu
<artifactId>javax.servlet-api</artifactId> ueditor echarts
<version>3.1.0</version>
</dependency>
坐标属性的理解
groupId
定义当前Maven项⽬⾪属的实际项⽬-公司名称。(jar包所在仓库路径) 由于Maven中模块的概念,因 此⼀个实际项⽬往往会被划分为很多模块。 ⽐如spring是⼀个实际项⽬,其对应的Maven模块会有很 多,如spring-core,spring-webmvc等。
artifactId
该元素定义实际项⽬中的⼀个Maven模块-项⽬名, 推荐的做法是使⽤实际项⽬名称作为artifactId的前 缀。 ⽐如: spring-bean, spring-webmvc等。
version
该元素定义Maven项⽬当前所处的版本。
3.2maven多模块构建
项⽬复查时 dao service controller
层分离将⼀个项⽬分解为多个模块已经是很通⽤的⼀种⽅式。
在Maven中需要定义⼀个parent POM作为⼀组module的聚合POM。在该POM中可以使⽤ 标签来定义⼀ 组⼦模块。
parent POM不会有什么实际构建产出。⽽parent POM中的build配置以及依赖配置都会⾃动继 承给⼦module。
3.3maven⼀致的项⽬结构
Ant时代⼤家创建Java项⽬⽬录时⽐较随意,然后通过Ant配置指定哪些属于source,那些属于 testSource等。
⽽Maven在设计之初的理念就是Conversion over configuration(约定⼤于配置)。
其制定 了⼀套项⽬⽬录结构作为标准的Java项⽬结构,解决不同ide 带来的⽂件⽬录不⼀致问题。
3.4maven⼀致的构建模型和插件机制
例如
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextPath>/test</contextPath>
</configuration>
</plugin>
4.maven安装配置和⽬录结构
Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。
系统要求
项目 | 要求 |
---|---|
JDK | Maven 3.3 要求 JDK 1.7 或以上 Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上 |
内存 | 没有最低要求 |
磁盘 | Maven 自身安装需要大约 10 MB 空间。除此之外,额外的磁盘空间将用于你的本地 Maven 仓库。你本地仓库的大小取决于使用情况,但预期至少 500 MB |
操作系统 | 没有最低要求 |
步骤 1:检查 Java 安装
现在打开控制台,执行下面的 java
命令。
操作系统 | 任务 | 命令 |
---|---|---|
Windows | 打开命令控制台 | c:\> java -version |
Linux | 打开命令终端 | $ java -version |
Mac | 打开终端 | machine:~ joseph$ java -version |
如果你没有安装 Java,从以下网址安装 Java 软件开发套件(SDK):http://www.oracle.com/technetwork/java/javase/downloads/index.html。我们假定你安装的 Java 版本为1.8。
步骤 2:设置 Java 环境
设置 JAVA_HOME
环境变量,并指向你机器上的 Java 安装目录。例如:
操作系统 | 输出 |
---|---|
Windows | Set the environment variable JAVA_HOME to C:\Program Files\Java\jdk1.8.0_121 |
Linux | export JAVA_HOME=/usr/local/java-current |
Mac | export JAVA_HOME=/Library/Java/Home |
将 Java 编译器地址添加到系统路径中。
操作系统 | 输出 |
---|---|
Windows | 将字符串;C:\Program Files\Java\jdk1.8.0_121添加到系统变量“Path”的末尾 |
Linux | export PATH= P A T H : PATH: PATH:JAVA_HOME/bin/ |
Mac | not required |
使用上面提到的 java -version 命令验证 Java 安装。
步骤 3:下载 Maven 文件
从以下网址下载 Downloading Apache Maven 3.8.1:http://maven.apache.org/download.html
目前maven的最新版本为3.8.1
步骤 4:解压 Maven 文件
解压文件到你想要的位置来安装 apache-maven-3.8.1-bin,你会得到 apache-maven-3.8.1子目录。
这里我的是d盘
操作系统 | 位置 (根据你的安装位置而定) |
---|---|
Windows | D:\Environment\apache-maven-3.8.1-bin |
Linux | /usr/local/apache-maven |
Mac | /usr/local/apache-maven |
步骤 5:设置 Maven 环境变量
之前在安装3.6的版本截图,现在换成3.8.1
1.首先确保电脑JDK已经安装好,进入环境变量的系统变量新建变量名MAVEN_HOME
,值为刚才解压的Maven文件的路径。
2.确认后再进入到系统变量的Path
新建%MAVEN_HOME%\bin
3.在cmd窗口输入mvn -v
显示出版本信息则说明已经配置成功。
5.maven的目录结构
官网
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LakqM6YW-1621738735228)(https://static01.imgkr.com/temp/a3fc517115864527814a75ed766e041c.png)]
标准的maven目录结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AwUsbFLM-1621738735229)(https://static01.imgkr.com/temp/89c49ae65b884896a88116dda8bc04dc.png)]
6.手动创建maven项目
6.1⼿动创建⼀个Maven项⽬,并编译运⾏成功!
创建⼀个⽂件夹作为项⽬的根⽬录 在根⽬录中创建⼀个pom.xml⽂件,内容如下
<?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.xxxx</groupId>
<artifactId>maven01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven01</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
标签定义解释
根⽬录下的第⼀个⼦元素
ModelVersion
指定当前Pom模型的版本,对于Maven3来说,它只能是4.0.0 。指定了当 前Maven模型的版本号,对于Maven2和Maven3来说,它只能是4.0.0
<groupId>
定义了项⽬属于哪个组, 这个组往往和项⽬所在的组织和公司存在关联。 ⽐如: com.xxxx
artifactId
定义了当前Maven项⽬在组中唯⼀的ID。
Version
X.X.X-⾥程碑
⽐如:1.0.0-SNAPSHOT
第⼀个X ⼤版本 有重⼤变⾰
第⼆个X ⼩版本 修复bug,增加功能
第三个X 更新
⾥程碑版本:
- SNAPSHOT (快照,开发版)
- alpha(内部测试)
- beta(公开测试)
- Release | RC( 发布版)
- GA(正常版本)
- 使⽤name标签声明⼀个对于⽤户更为友好的项⽬名称,虽然不是必须的,但还是推荐为每个Pom声明name,以⽅便信 息交流。
6.2编写主函数
package com.xxxx.demo;
public class Hello {
public static void main(String[] args) {
System.out.println("hello maven");
}
}
6.3cmd 下编译并运⾏
cmd下⾯,进⼊项⽬的根⽬录
- 编译java⽂件 mvn compile
- 执⾏main ⽅法 mvn exec:java -Dexec.mainClass=“com.xxxx.demo.Hello”
注意:如果编译不成功,可能出现的问题
- 不是使⽤管理员权限执⾏dos命令
- 2JDK环境配置有问题,重装JDK
- 代码编写时,类⾥⾯没设置包名(如果编译时类没加包名,执⾏时也不需要加包名)
7.关于maven的pom.xml标签超详细解释
pom作为项目对象模型。
通过xml表示maven项目,使用pom.xml来实现。
主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。-->
<parent>
<!--被继承的父项目的构件标识符-->
<artifactId/>
<!--被继承的父项目的全球唯一标识符-->
<groupId/>
<!--被继承的父项目的版本-->
<version/>
<!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项 目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。-->
<relativePath/>
</parent>
<!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。-->
<modelVersion>4.0.0</modelVersion>
<!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app-->
<groupId>asia.banseon</groupId>
<!-- 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个 特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。-->
<artifactId>banseon-maven2</artifactId>
<!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型-->
<packaging>jar</packaging>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->
<version>1.0-SNAPSHOT</version>
<!--项目的名称, Maven产生的文档用-->
<name>banseon-maven</name>
<!--项目主页的URL, Maven产生的文档用-->
<url>http://www.baidu.com/banseon</url>
<!-- 项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标 签), 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。-->
<description>A maven project to study maven.</description>
<!--描述了这个项目构建环境中的前提条件。-->
<prerequisites>
<!--构建该项目或使用该插件所需要的Maven的最低版本-->
<maven/>
</prerequisites>
<!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira-->
<issueManagement>
<!--问题管理系统(例如jira)的名字,-->
<system>jira</system>
<!--该项目使用的问题管理系统的URL-->
<url>http://jira.baidu.com/banseon</url>
</issueManagement>
<!--项目持续集成信息-->
<ciManagement>
<!--持续集成系统的名字,例如continuum-->
<system/>
<!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。-->
<url/>
<!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告)-->
<notifiers>
<!--配置一种方式,当构建中断时,以该方式通知用户/开发者-->
<notifier>
<!--传送通知的途径-->
<type/>
<!--发生错误时是否通知-->
<sendOnError/>
<!--构建失败时是否通知-->
<sendOnFailure/>
<!--构建成功时是否通知-->
<sendOnSuccess/>
<!--发生警告时是否通知-->
<sendOnWarning/>
<!--不赞成使用。通知发送到哪里-->
<address/>
<!--扩展配置项-->
<configuration/>
</notifier>
</notifiers>
</ciManagement>
<!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。-->
<inceptionYear/>
<!--项目相关邮件列表信息-->
<mailingLists>
<!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。-->
<mailingList>
<!--邮件的名称-->
<name>Demo</name>
<!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建-->
<post>banseon@126.com</post>
<!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建-->
<subscribe>banseon@126.com</subscribe>
<!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建-->
<unsubscribe>banseon@126.com