Maven入门
Maven入门
maven是一个java平台下的的软件项目管理和综合工具,由Apache组织中开发维护,基于项目对象模型的概念,maven可以根据一个中心信息来管理项目的构建,文档和报告;
注意此处的项目管理不是某种工作岗位,而是描述程序员开发工作中的一部分;
为何需要maven
在日常开发工作中,开发者需要自行管理项目依赖,频繁的编译,清理,测试,打包,发布等等.....虽然IDE都提供了相应的支持,但也免不了我们需要,花很多时间进行这些重复且没有技术含量的工作,我们将上述这些过程统称为项目构建
Maven的出现正是为了将开发者从繁杂的项目构建中解放出来
Maven能做什么
-
Making the build process easy
使得构建项目过程变得更简单,Maven不会消除对底层机制的了解,没有太过高级的封装,但可以让你免受许多细节的影响
-
Providing a uniform build system
提供了统一的构建系统,Maven使用其项目对象模型(POM)和一组插件来构建项目,一旦熟悉了一个Maven项目,就知道所有Maven项目是如何构建的;
-
Providing quality project information
提供了项目质量信息,这些信息部分来自POM,部分来自项目源代码,如:项目使用的依赖项,单元测试报告(包括覆盖率),交叉引用等
-
Encouraging better development practices
鼓励更好的开发实践,Maven收集了当前的最佳开发实践,并轻松地朝该方向指导项目。例如:单元测试的规范化,将测试的执行和报告作为Maven的常规构建周期的一部分,Maven还建议了一些有关项目目录结构的准则,Maven还协助项目工作流程,例如发布和问题管理等
Maven相关概念
POM(项目对象模型)
- Maven整体采用的就是POM,既将项目看做一个对象,我们可以对这个项目对象进行相关属性的设置,从而来完成项目的管理
- 一个POM可继承其他POM从而使用其中已经定义好的内容;
- 可将一个Maven项目拆分为多个不同Maven模块,只需要在POM中列出包含的模块信息即可;
repository(仓库)
所有Maven项目都具备自己的坐标,包括组织ID,坐标ID和版本号,有了坐标后,可将项目放入仓库中,以供其他人使用,仓库就是用来存放这些项目的地方,分为本地仓库,和远程仓库,以及中央仓库
中央仓库也属于远程仓库,是有maven官方维护的仓库,是最完整的jar仓库,为了区别于其他仓库,所以称之为中央仓库
Dependency Management(依赖管理)
依赖指得是项目运行所必须的组件(可以是jar,java,class),依赖管理是Maven提供的最核心的功能之一,可根据提供的项目坐标,自动的从仓库中下载需要的依赖,并且会帮助我们解决依赖冲突问题,
Project Lifecycle(项目生命周期)
项目生命周期指得是项目从创建工程开始到最终部署到服务器的所有动作(程序员要干的事情)的总称,如编译,测试,打包,部署,生成项目站点等....
Maven对这些动作进行了抽象,变成了一个个生命周期
生命周期
生命周期动作本质都是通过插件来完成的,所以Maven项目默认就存在与生命周期相关的几个插件,具体如下:
三个生命周期:
-
默认(default)的生命周期,处理从验证开始执行所有阶段一直到部署
-
清洁(clean)生命周期,处理项目的清理操作
-
站点(site)生命周期,处理项目站点的创建和部署
阶段
每个生命周期下包含若干个阶段,以下列出重要阶段(不区分周期)
阶段 | 插件 | 作用 |
---|---|---|
clean | clean | 清理自动生成的文件,也就是 target 目录 |
validate | 由 Maven 核心负责 | 验证项目是否正确以及所有必要的信息均可用。 |
compile | compile | 编译 Java 源码 |
test | surefire | 运行测试代码 |
package | war/jar/rar | 获取编译后的代码,并将其打包为可分发格式如jar/war |
verify | 由 Maven 核心负责 | 验证包是否有效并符合质量标准。 |
install | install | 将构件包安装到本地仓库 |
site | site | 生成项目站点,就是一堆静态网页文件,包括 JavaDoc |
deploy | deploy | 将构件包部署到远程仓库 |
安装与配置
下载安装
下载地址:https://maven.apache.org/download.cgi
正常使用下载binary二进制版本,需要查看源码则下载源码
下载后直接解压即可,CMD中使用需设置环境变量,Maven不区分版本,bin下提供了用于unix的sh和用于windows的cmd文件,将bin添加至环境变量即可;
目录:
添加环境变量后我们就可以,使用在命令行中使用mvn命令了,详细命令见该文章,
另外:IDEA中已经集成了Maven,无需额外安装,也不需要任何的命令
IDEA下配置Maven
在IDEA中我们可以自定义本地仓库路径和配置文件,在preferences中搜索Maven,可打开如下界面:
从上到下,分别是,Maven路径,配置文件,仓库路径
- IDEA默认使用自己集成的Maven,若需要可以指定为自己安装的其他maven
- IDEA会到~/.m下的查找settings.xml文件作为默认的Maven配置文件,但是该文件默认是没有的,我们需要从自己下载的Maven目录中复制一份到该目录下
- 本地仓库路径通常不需要修改
开始使用
IDEA中Maven使用步骤简述
- 创建Maven项目
- 指定仓库地址,以及配置文件(仅第一次)
- 编辑pom.xml配置文件,(项目坐标,依赖,插件等...)
- 使用命令或插件来帮助完成要进行的构建工作
创建Maven普通项目
骨架即模板,主要是为了帮助我们创建可能用到的目录结构
此处不选择骨架
输入项目名称,组织表示符(公司域名倒序),以及工件ID:
创建成功后目录结构如下:
第一次创建可能会耗时较长
查找需要的依赖
中央仓库地址:https://mvnrepository.com,我们可以在上面查找需要的jar包
选择版本
复制依赖
将复制的内容填写到pom.xml中的dependencies下即可
镜像仓库
Maven默认访问中央仓库来获取依赖,一些时候可能会很慢,我们可以在配置文件中添加镜像服务器来解决这个问题
需要强调的是,镜像仓库的jar包通常没有中央仓库齐全
根据idea的maven配置找到settings.xml文件在mirrors标签下添加内容
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
案例
依赖下载完成后我们就可以开始编写代码了
在src下编写如下代码:
public class MyClass {
public static void sayhello() {
System.out.println("hello maven");
}
public static void main(String[] args) {
sayhello();
}
}
编写完成后我们通常会利用Junit进行测试
.1添加junit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
.2编写测试代码:
import org.junit.Test;
public class MyTest {
@Test
public void te1(){
System.out.println("111111111111111");
int i = 1/0;
}
}
.3在idea右侧会有Maven的菜单,其中会显示maven提供的各个插件,双击即可执行,测试我们执行test
常见错误
当我们在执行test以下的阶段时maven会抛出以下异常:
不再支持源选项 5。请使用 6 或更高版本。
这是由于Maven默认编译版本为1.5,目前已经不受支持,我们需要在pom添加以下内容,用于指定编译版本和编码方式:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
以上方式只针对当前项目有效,当重新创建项目时又需要重新写一次,针对该问题,可以通过在settings.xml添加通用配置来解决:
根据idea中的配置信息找到settings.xml文件,在profiles
标签中添加以下内容:
<profile>
<id>jdk-1.8</id>
<activation> <!-- 配置激活条件 -->
<activeByDefault>true</activeByDefault> <!-- 是否是默认配置 -->
</activation>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</profile>
当配置被激活时,将应用到项目中的且覆盖pom中相同标签;
配置完成重新执行test即可查看到测试输出的信息:
其他常用操作
- 重新导入Maven项目,相当于刷新
- 更新所有Maven项目资源和文件夹
- 下载依赖和源码
- 添加新的Maven项目
- 运行某个生命周期指令
- 运行自定义指令
- 显示依赖关系图
- 关闭已展开
Web项目
在创建项目是勾选create from archetype
,然后选择webapp
该骨架没有自动创建常用的文件夹,需要手动补全,如下:
]
另一种创建webapp方式
1.先创建一个普通的maven项目
2.pom中添加<packaging>war</packaging>
3.手动在main下创建webapp目录
4.创建web.xml, 在工程名称上点击右键选择Open Module Settings
,
在弹出的窗口中指定将web.xml创建到webapp目录下:
运行WEB项目
Maven项目的运行与普通项目没有太大的区别,不过我们还可以通过Maven插件来运行web项目,tomcat和一些常见服务器都有Maven插件
需要强调的是,Tomcat的Maven插件,最后一次更新是8.x版本,如果要使用最新的web服务器还是需要单独下载
1.原始方式配置外部Tomcat
2.插件方式
2.1添加插件配置到pom.xml
<build>
<finalName>MavenP4</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
2.2添加运行配置
上述操作等同于在控制台输入指令mvn tomcat7:run
添加servlet依赖:
当需要使用servlet时,与非maven项目一样需要添加servlet的依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
deploy
deploy是将打包的结果部署到指定服务器,因此需要指出服务器的地址,支持的上传方式有SSH,FTP
FTP案例:
<distributionManagement>
<repository>
<id>ftp-repository</id>
<url>ftp://repository.mycompany.com/repository</url>
</repository>
</distributionManagement>
<build>
<extensions>
<!-- Enabling the use of FTP -->
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-beta-6</version>
</extension>
</extensions>
</build>
在settings.xml中找到servers
标签添加ftp的用户名和密码:
<server>
<id>ftp-repository</id>
<username>root</username>
<password>admin</password>
</server>
另外maven也支持部署到私有maven仓库,在一些公司可能会自己搭建maven私有仓库