Maven快速入门指南

栏目: Java · 发布时间: 6年前

内容简介: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 , 不能是 jarwar .

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:compilecompiler:test-compile 分别与 compiletest-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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Big C++中文版

Big C++中文版

霍斯特曼 / 姚爱红 / 电子工业 / 2007-3 / 85.00元

本书是一本关于C++的优秀教材,南圣何塞州立大学知名教授Horstmann编写。全书深入探讨了C++的知识,并着重强调了安全的标准模板库;本书较厚,但它可用做程序设计专业学生的教材(两学期)。全书在介绍基础知识后,作者论及了一些高级主题。书中面向对象的设计一章探讨了软件开发生命周期问题,给出了实现类关联的实用提示。其他高级主题包括模板,C++标准模板库,设计模式,GUI,关系数据库以及XML等。本......一起来看看 《Big C++中文版》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具