一、什么是Maven?
Maven是一款软件项目管理和理解工具。基于项目对象模型(POM)的概念,通过添加一小段描述来管理项目的构建。
二、为什么要使用Maven?
以前在用Java开发一个项目时,往往需要引入几十或者上百个Jar包,那么这些Jar可能分散在不同的地址,我们需要一个一个去下载,然后在导入到我们项目中!有时一个Jar包找到合适的版本可能需要几个小时。更让人痛苦的是一个大项目开发需要多人协同开发。那么项目依赖的Jar包就需要有一份公共的来解决不同人引入相同的Jar不同版本的依赖从而导致冲突。
现在使用Maven来构建,Maven通过一个POM文件来管理项目依赖,只要在POM中加入想要的Jar包依赖,Maven会在本地仓库中查找依赖包。如果本地没有找到就会从配置的私服中下载依赖,没有配置私服Maven就会从Maven的中央仓库(99%的开源项目都可以在Maven中央仓库中找到)中去找到指定版本的Jar包。
三、约定规范
src : 源代码和测试代码的根目录
main : 应用代码目录
java : 源代码目录
resources : 配置文件目录
test : 测试代码目录
testResources : 测试使用的配置文件
webapp : 当你的项目是一个web项目时才会需要这个文件夹,里面都是存放项目静态文件。如果你的项目是jar项目那就不需要这个目录了。
target : 项目打包时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.test</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>maven-test Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
/**
* POM文件中使用的变量声明
* 可以在这里声明各种文件的版本号
* 例如 : <spring.version>4.3.9.RELEASE</spring.version>
* 在下面的依赖引入时可以声明一个公共版本
*/
<spring.version>4.3.9.RELEASE</spring.version>
</properties>
<dependencies>
/**
* 一个 dependency 为一个依赖
* groupId : 项目组织唯一的标识符,对应JAVA的包的结构,在main目录里面java的目录结构 (groupId可以多个项目使用一个)
* artifactId : 项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。(每个项目中同样的版本只能有一个)
*/
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<finalName>maven-test</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
/**
* 这边是maven插件配置
* 需要打包jar时,就需要配置mainClass
* 多模块时,需要配置子模块文件引入插件
*/
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
复制代码
五、模块化项目管理
Maven模块化项目管理,适用于一些比较大的项目,通过功能的模块拆分,实现代码的解耦合,便于代码的复用和维护及管理。开源框架在便于阅读源码前提下基本都是采用模块化的方式,提供模块集成,用户可以根据需求配置指定的模块。
父模块配置:
dependencies : 在子模块中不写该依赖项,那么子模块仍然会从父模块中继承该依赖项(全部继承,上面使用的截图就是dependencies)
dependencyManagement : 父模块里只是声明依赖(在dependencies外层在包一个dependencyManagement标签说明),并不实现引入,因此子模块需要显示的声明需要用的依赖。如果不在子模块中声明依赖,是不会从父模块中继承下来的;只有在子模块中写了该依赖项,并且没有指定具体版本,才会从父模块中继承该项,并且version和scope都读取自父pom。另外如果子模块中指定了版本号,那么会使用子模块中指定的Jar版本。
部分信息参考来自网络.