Maven的简介
简介
Maven【[ˈmevən]】这个词可以翻译为”专家”,”内⾏”。 作为Apache组织中的⼀个颇为成功的开源项⽬, Maven主要服务于基于java平台的项⽬构建,依赖管理和项⽬信息管理。 ⽆论是⼩型的开源类库项⽬,还是⼤型的企业级应⽤; ⽆论是传统的瀑布式开发,还是流⾏的敏捷开 发,Maven都能⼤显身⼿。
###项目构建
不管你是否意识到,构建(build)是每⼀位程序员每天都在做的⼯作。早上来到公司,我们做的第⼀ 件事就是从源码库签出最新的代码,然后进⾏单元测试,如果测试失败,会找相关的同事⼀起调试修复错误代码。 接着回到⾃⼰的⼯作上来,编写⾃⼰的单元测试及产品代码。
我们会发现,除了编写源代码,我们每天有相当⼀部分时间花在了编译,运⾏单元测 试,⽣成⽂档,打包和部署等繁琐且不起眼的⼯作上,这就是构建。 如果我们现在还⼿⼯这样做,那成 本也太⾼了,于是有⼈⽤软件的⽅法让这⼀系列⼯作完全⾃动化,使得软件的构建可以像全⾃动流⽔线 ⼀样,只需要⼀条简单的命令,w所有繁琐的步骤都能够⾃动完成,很快就能得到最终结果。
###项目构建工具
Ant构建
最早的构建⼯具,基于IDE, ⼤概是2000年有的,当时是最流⾏java构建⼯具,不过它的XML脚本编写格式让XML⽂件特别⼤。对⼯程构建过程中的过程控制特别好。
Maven【Java】
项⽬对象模型,通过其描述信息来管理项⽬的构建,报告和⽂档的软件项⽬管理⼯具。它填补了Ant缺 点,Maven第⼀次⽀持了从⽹络上下载的功能,仍然采⽤xml作为配置⽂件格式。Maven专注的是依赖管理,使⽤Java编写。
Gradle
属于结合以上两个的优点,它继承了Ant的灵活和Maven的⽣命周期管理,它最后被google作为了 Android御⽤管理⼯具。它最⼤的区别是不⽤XML作为配置⽂件格式,采⽤了DSL格式,使得脚本更加简洁。 ⽬前市⾯上Ant⽐较⽼, 所以⼀般是⼀些⽐较传统的软件企业公司使⽤, Maven使⽤Java编写, 是当下⼤多数互联⽹公司会使⽤的⼀个构建⼯具, 中⽂⽂档也⽐较⻬全, gradle是⽤groovy编写, ⽬前⽐较新型的构建⼯具⼀些初创互联⽹公司会使⽤, 以后会有很⼤的使⽤空间。
Maven的四大特性
依赖管理系统
Maven为Java世界引⼊了⼀个新的依赖管理系统jar包管理 jar 升级时修改配置⽂件即可。在Java世界中,可以⽤groupId、artifactId、version组成的Coordination(坐标)唯⼀标识⼀个依赖。
任何基于Maven构建的项⽬⾃身也必须定义这三项属性,⽣成的包可以是Jar包,也可以是war包或者 jar包。⼀个典型的依赖引⽤如下所示:
1 | <dependency> |
坐标属性的理解
- groupId
定义当前Maven项⽬⾪属的实际项⽬-公司名称。(jar包所在仓库路径) 由于Maven中模块的概念,因 此⼀个实际项⽬往往会被划分为很多模块。 ⽐如spring是⼀个实际项⽬,其对应的Maven模块会有很 多,如spring-core,spring-webmvc等。
- artifactId
该元素定义实际项⽬中的⼀个Maven模块-项⽬名, 推荐的做法是使⽤实际项⽬名称作为artifactId的前 缀。 ⽐如: spring-bean, spring-webmvc等。
- version
该元素定义Maven当前所处的版本
项目的多模块构建
项⽬复查时 dao service controller 层分离将⼀个项⽬分解为多个模块已经是很通⽤的⼀种⽅式。 在Maven中需要定义⼀个parent POM作为⼀组module的聚合POM。在该POM中可以使⽤ 标签来定义⼀ 组⼦模块。parent POM不会有什么实际构建产出。⽽parent POM中的build配置以及依赖配置都会⾃动继承给⼦module。
一致的构建模型和插件机制
1 | <plugin> |
Maven的安装配置和目录结构
Maven的安装与配置
打开cmd窗口,通过命令查看maven是否安装成功
认识Maven的目录结构
创建一个文件夹作为项目的根目录
在根目录中创建一个pom.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
PS:标签定义解释
1 | /** |
编写主函数
1 | package com.xxxx.demo; |
cmd下编译并且运行
cmd下面,进入项目根目录
1.编译Java文件
mvn compile
2.执行main方法
mvn exec:java -Dexec.mainClass=”com.xxxx.demo.hello”
注:第⼀次下载会⽐较慢,要修改maven解压之后的conf⽬录下的settings.xml。
1 | 1.1.修改默认仓库位置 |
如果编译不成功,可能出现的问题
1.不是使用管理员权限执行的dos命令
2.JDK环境配置有问题,重装JDK
3.代码编写时,类里面没有设置包名
##Maven命令
作为开发利器的maven,为我们提供了⼗分丰富的命令,了解maven的命令⾏操作并熟练运⽤常⻅的 maven命令还是⼗分必要的,即使譬如IDEA等⼯具给我提供了图形界⾯化⼯具,但其底层还是依靠 maven命令来驱动的。
Maven的命令格式如下:
maven [plugin-name] : [goal-name]
命令代表的含义:执⾏ plugin-name 插件的 goal-name ⽬标
maven命令 | 描述 |
---|---|
mvn clean | 清理项⽬⽣产的临时⽂件,⼀般是模块下的target⽬录 |
mvn compile | 编译源代码,⼀般编译模块下的src/main/java⽬录 |
mvn package | 项⽬打包⼯具,会在模块下的target⽬录⽣成jar或war等⽂件 |
mvn test | 测试命令,或执⾏src/test/java/下junit的测试⽤例 |
mvn -version | 显示版本信息 |
mvn install | 将打包的jar/war⽂件复制到你的本地仓库中,供其他模块使⽤ |
mvn deploy | 将打包的⽂件发布到远程参考,提供其他⼈员进⾏下载依赖 |
mvn site | 生成项目相关信息的网站 |
mvn eclipse:eclipse | 将项目转换为Eclipse项目 |
mvn dependency:tree | 打印出整个项目的依赖树 |
mvn archetype:generate | 创建maven的普通Java项目 |
mvn tomcat:run | 在tomcat容器中运行web应用 |
mvn jetty:run | 调用jetty插件的Run目标在jetty servlet容器中启动web应用 |
注意:运⾏maven命令的时候,⾸先需要定位到maven项⽬的⽬录,也就是项⽬的pom.xml⽂件所在的⽬录。否则, 必以通过参数来指定项⽬的⽬录。
命令参数
上⾯列举的只是⽐较通⽤的命令,其实很多命令都可以携带参数以执⾏更精准的任务。
-D传入属性参数
例如:
mvn package -Dmaven.test.skip=true
以 -D 开头,将 maven.test.skip 的值设为 true ,就是告诉maven打包的时候跳过单元测试。同 理, mvn deploy-Dmaven.test.skip=true 代表部署项⽬并跳过单元测试。
-P使用指定的Profile配置
⽐如项⽬开发需要有多个环境,⼀般为开发,测试,预发,正式4个环境,在pom.xml中的配置如下:
1 | <profiles> |
profiles 定义了各个环境的变量 id , filters 中定义了变量配置⽂件的地址,其中地址中的环境 变量就是上⾯ profile 中定义的值, resources 中是定义哪些⽬录下的⽂件会被配置⽂件中定义的变量替换。 通过maven可以实现按不同环境进⾏打包部署,例如:
mvn package -Pdev -Dmaven.test.skip=true