内容简介:Maven快速入门指南
Maven是Apache基金会提供的项目管理工具, 其采用项目对象模型(Project Object Model, POM)描述项目配置, 并使用生命周期模型管理构建过程中各种操作.
POM
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.example</groupId> <artifactId>sample</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> </project>
pom.xml
的根元素为 <project>
元素, project
元素需要三个字段来唯一标识项目:
-
工程组
<groupId>
, 开发者的唯一标识 -
构件名
<artifactId>
, 项目名. -
版本号
<version>
这三个字段对于任何 pom.xml
来说都是不可或缺的.
在maven中每个项目被称为一个构件(artifact), 三个字段用于唯一标识构件. maven中每个依赖项都是构件, 我们开发的项目也是构件, 便于被其它项目引用.
SuperPOM
可以通过配置 <parent>
元素来指定另一个POM作为SuperPOM, 当前POM会继承SuperPOM的配置, 当前POM中的元素会覆盖SuperPOM中的同名配置项:
<?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.example</groupId> <artifactId>sample</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <parent> <artifactId>sample-parent</artifactId> <groupId>com.example</groupId> <version>1.0</version> </parent> </project>
Module
Maven可以将项目分为多个模块(Module), 每个Module包含一个 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.example</groupId> <artifactId>sample-parent</artifactId> <packaging>pom</packaging> <version>1.0</version> <modules> <module>service</module> <module>sample</module> <module>util</module> </modules> </project>
注意父模块的打包方式只能是 pom
, 不能是 jar
或 war
.
Properties
pom.xml
中可以定义 <property>
<properties> <java.version>1.8</java.version> <junit.version>4.12</junit.version> </properties>
使用propery避免硬编码:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency>
生命周期
maven使用生命周期的概念来管理构建中的各种操作. maven定义了三个周期(lifecycle), 每个周期分为若干阶段(phase):
- clean生命周期: 构建前的清理工作
- pre-clean阶段: 清理前要做的工作
- clean阶段: 清理上一次构建生成的文件
- post-clean阶段: 清理后要做的工作
- build生命周期: 构建生命周期, 又称default生命周期
- validate阶段: 检查配置是否正确
- compile阶段: 编译工程源码, 此阶段前会进行代码生成, 拷贝资源等阶段(操作).
- test-compile阶段: 编译测试源码
- test阶段: 执行测试代码
- package阶段: 将项目打包, 如jar, war等.
- verify阶段: 检查发布包是否合格
- install阶段: 将发布包安装到本地仓库中, 可以作为其它项目的依赖
- deploy 阶段: 将包发布到远程仓库, 以共享给其它项目或工程
- site生命周期: 生成报告, 部署站点
- pre-site阶段
- site阶段
- post-site阶段
- site-deploy阶段
常用的 mvn clean
命令将会执行clean生命周期的pre-clean和clean阶段, 而 mvn package
命令则执行build周期的validate到package阶段.
也就是说 mvn <phase>
命令会从相应生命周期的第一个阶段执行到指定指定的阶段.
每个阶段的具体操作由插件(plugin)来执行, 每个插件可以完成一个或多个目标(goal), 每个阶段可以依次绑定0个或若干个目标.
也就是说, maven通过目标(goal)将具体操作和抽象的阶段绑定. 如 maven-compiler-plugin
插件的两个目标: compiler:compile
和 compiler:test-compile
分别与 compile
和 test-compile
阶段绑定.
依赖管理
依赖管理是maven的重要功能, 它通过仓库管理依赖的jar包. maven仓库有三种类型:
-
本地仓库: 本地仓库是本地保存jar包的目录. 对于 linux 和os x系统, 本地仓库地址一般为
~/.m2/repository
- 远程仓库: 若本地仓库中没有包含某个依赖包, maven可以从远程仓库中下载依赖包到本地仓库.
- 中央仓库: 中央仓库是maven社区维护的远程仓库, 保存了大量依赖包, 不需要配置即可访问.
<project>
下的 <dependencies>
子节点用于配置当前module依赖的构件(jar包):
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> </dependencies>
同样用 <groupId>
, <artifactId>
和 <version>
来唯一指定依赖的构件.
DependencyManagement
在多模块(Module)项目中, 即使 <property>
也难以避免不同模块依赖同一构件不同版本的问题. 更优雅的解决方案是在SuperPOM中使用 <dependencyManagement>
.
<!-- super pom --> <dependencyManagement> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> </dependencyManagement>
在当前pom中不需要指定依赖的版本:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
当前pom会从本文件开始逐层向上搜索DependencyManagement, 以确定依赖版本号.
依赖分析
通常maven中每个依赖项都是一个maven构件, 它们也会依赖其它的构件. 因此在pom.xml中定义的依赖关系会形成树状结构.
maven-dependency-plugin
插件提供了一些便利的依赖分析与管理工具:
-
mvn dependency:tree
: 以显示依赖的树状结构 -
mvn dependency:analyze
: 分析声明的依赖是否被实际使用
exclude
不同的maven构件可能依赖同一个包的不同版本, 这种树状结构给依赖管理带来严峻挑战. <dependency>
节点下的 <exclude>
元素用于排除依赖配置.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
上述配置要求maven忽略SpringBoot默认的starter-tomcat换用starter-jetty, 在构建时将不会安装 spring-boot-starter-tomcat
而是在classpath中寻找合适的替代.
于是我们在自己的pom中定义了starter-jetty依赖, 在构建时将会搜索到starter-jetty作为starter-tomcat的替代.
构建管理
<project>
节点下的 <build>
节点用于配置构建过程中各种参数:
<build> <directory>target</directory> <outputDirectory>target/classes</outputDirectory> <testOutputDirectory>target/test-classes</testOutputDirectory> <finalName>${project.artifactId}-${project.version}</finalName> <sourceDirectory>src/main/java</sourceDirectory> <testSourceDirectory>src/test/java</testSourceDirectory> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>src/test/resources</directory> </testResource> </testResources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> </plugins> </build>
上述示例中配置了源码和资源目录的位置以及所需的插件. 和 <dependency>
一样, <plugin>
也可以通过Management来管理:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> </plugins> </pluginManagement> </build>
profile
我们经常会遇到在调试和生产环境中使用不同配置的情况, maven的profile功能可以满足需求:
<project> <profiles> <profile> <id>debug</id> <properties> <start-class>com.example.DebugMain</start-class> <final-name>debug-sample</final-name> </properties> </profile> <profile> <id>online</id> <properties> <start-class>com.example.AppMain</start-class> <final-name>sample</final-name> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles> </project>
只有被激活的profile中的配置才是有效的. activeByDefault可以设置profile是否默认激活, maven命令中的 -P <profile>,<profile>
选项可以设置在执行命令过程中激活的profile. 此外profile也可以根据环境决定是否激活.
本文永久更新链接地址 : http://www.linuxidc.com/Linux/2018-01/150353.htm
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
微信公众号深度解析
魏艳 / 化学工业出版社 / 2017-5 / 49.80元
本书是一本微信公众号营销的教科书,全方位揭秘了微信订阅号、微信服务号、微信企业号三大类型账号的运营管理策略和技巧,有助于企业构建一套全新的微信公众号营销体系,打造一个移动端的商业帝国,是企业和微商必读的微信公众号营销和运营宝典。 《微信公众号深度解析:订阅号+服务号+企业号三号运营全攻略》突出了“新”、“全”、“实战”三大特点,阐述了微信公众号在新形势下的现状、发展趋势和三大类型;微信公众号......一起来看看 《微信公众号深度解析》 这本书的介绍吧!