• 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也可以根据环境决定是否激活.

  • 相关阅读:
    idea 的搭建 maven spark开发环境
    自己的简单数据分析流程
    自己对golang中各个文件的理解
    通用android studio gradle 文件(电商商家版,两个gradle不同)
    android与golang的http请求
    Leetcode 98 验证二叉搜索树
    leetcode 830较大分组的位置
    Leetcode 种花问题
    leetcode 86 分割链表
    Leetcode 509 斐波那契数
  • 原文地址:https://www.cnblogs.com/Finley/p/8039533.html
Copyright © 2020-2023  润新知