内容简介: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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Development Recipes
Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / Pragmatic Bookshelf / 2012-1-22 / USD 35.00
You'll see a full spectrum of cutting-edge web development techniques, from UI and eye candy recipes to solutions for data analysis, testing, and web hosting. Make buttons and content stand out with s......一起来看看 《Web Development Recipes》 这本书的介绍吧!