Maven是构建工具,能把项目抽象成POM(project object model),Maven使用POM对项目进行构建、打包、文档化等操作。最重要的是解决了项目需要类库的依赖管理,简化了项目开发环境搭建的过程,使得我们开发一个从简单到大型的复杂项目变得很容易。
Maven介绍
Maven采用了不同方式对项目构建进行抽象,比如源码位置总是在src/main/java,配置文件则在src/main/resources中,编译好的类总是放在项目的target目录下,总的来说,Maven实现了以下目标:
使构建项目变得很容易,Maven屏蔽了构建的复杂过程。比如,你只需要输入maven package就可以构建整个Java项目。
统一了构建项目的方式,不同人、不同公司的项目都有同样的描述项目和构建项目的方式,Maven通过pom.xml来描述项目,并提供一系列插件来构建项目。
提出了一套开发项目的最佳实践,而不用每个项目都有不同结构和构建方式,比如源代码在src/main/java中,测试代码在src/test/java中,项目需要的配置文件则放在src/main/resources中。
包含不同环境项目的构建方式
解决了类库依赖的问题,只需要声明使用的类库,Maven会自动从仓库下载依赖的jar包,并能协助你管理jar包之间的冲突。
POM文件
Maven的核心是pom.xml,用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>me.rowkey</groupId> <artifactId>test</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>antares</name> <url>http://maven.apache.org</url> <repositories> <repository> <id>nexus-suishen</id> <name>Nexus suishen</name> <url>http://maven.etouch.cn/nexus/content/groups/public/</url> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </snapshots> </repository> </repositories> <properties> <slf4j.version>1.7.21</slf4j.version> </properties> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf5j.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build></project>
pom.xml通常有以下元素:
groupId:表示项目所属的组,通常是一个公司或组织的名称,如org.springframework;
artifactId: 项目唯一的标志,比如,有spring-boot-starter-web、spring-boot-devtools。groupId和artifactId能唯一标识一个项目或者一个库,我们通常称之为项目坐标。
packaing: 项目的类型,常用的有jar和war两种,jar表示项目会打包成一个jar包,这是Spring Boot的默认使用方式。
version:项目的版本号
通常来说,项目版本号分三段,主版本号.次版本号.修订版本号。主版本号变动代表架构变动或者不兼容实现,次版本号是兼容性修改、功能增强,修订版本则是bug修复。
modelVersion: 代表pom文件的Maven的版本
properties 是全局属性的配置
dependencies:此元素下包含了多个dependency,用来声明项目的依赖,这是pom最核心的部分。
dependency:包含在dependencies中,用来声明项目的依赖。
scope: scope代表此类库与项目的关系,默认是compile,也就是编译和打包都需要此类库。test表示仅仅在单元测试的时候需要;provided表示在编译阶段需要此类库,但打包阶段不需要,这是因为项目的目标环境已经提供了。runtime表示在编译和打包的时候都不需要,但在运行的时候需要。
build:此项在pom中可选,build包含了多个插件plugin,用来辅助项目构建。
plugins:对插件的管理
pom的继承
可以通过parent实现POM的继承以完成统一配置管理,子POM中的配置优先级高于父POM。
例如,以Spring Boot为基础的项目中,pom.xml文件中往往有如下属性:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version></parent>
这样spring-boot-starter-*依赖就不需要指明version版本了,起到了统一控制版本的作用:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency></dependencies>
能够继承的元素如下:
groupId,version
Project Config
Dependencies
Plugin configuration
此外,<dependencyManagement>和<pluginManagement>可以统一做依赖和插件的配置管理,不同于<dependencies>和<plugins>的是,如果子POM中没有声明<dependency>和<plugin>则并不生效。
标准Web项目结构
在Maven中,一个Web项目的标准结构,如下所示:
2291536764978_.pic.jpg
其中:
src/main/java Java代码目录
src/main/resources 配置文件目录
src/main/webapp webapp根目录
src/test/java 测试代码目录
src/test/resources 测试配置目录
target/classes 代码编译结果目标目录
target/test-classes 测试代码编译结果目标目录
自定义项目结构
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> </configuration> </plugin> </plugins> <sourceDirectory>src</sourceDirectory> <testSourceDirectory>test/java</testSourceDirectory> <testResources> <testResource> <directory>test/resources</directory> </testResource> </testResources> <directory>build</directory></build>
作者:打铁大师
链接:https://www.jianshu.com/p/1427fe00deb8