不安分的黑娃
踏踏实实,坚持学习,慢慢就懂了~

参考资料

1 什么是 maven ?

Maven 是一个构建和管理任何 Java 项目的工具。
在 Maven 出现之前基本上用的都是 Ant 构建项目。

Maven 的目标是:

  • 简化构建过程
  • 提供一个统一的构建系统
  • 提供优质的项目信息
  • 促进更好的开发体验

2 安装配置 Maven

2.1 环境要求

  • JDK : maven 3.3+ 要求 JDK 1.7(及以上); 3.2 要求 JDK1.6 ;3.1 要求 JDK 1.5
  • 内存:无
  • 磁盘:本身安装需要 10M,本次 Maven 仓库建议至少 500M+
  • 操作系统:无。

2.2 下载地址

下载页面:

https://maven.apache.org/download.cgi

下载地址:

历史下载页面:

https://maven.apache.org/docs/history.html

历史下载地址:

2.3 windows 系统

  1. 安装 JDK 并配置好环境变量(JAVA_HOME)。
# 打开 CMD 窗口,验证 JDK 安装情况
## 1. 查看 JAVA_HOME 变量 
echo %JAVA_HOME%
## 2. 查看 PATH 变量
echo %PATH%
## 3. 查看 Java 版本
java -version
  1. 下载 apache-maven-3.8.6-bin.zip
  2. 解压 apache-maven-3.8.6-bin.zip 到本地磁盘某文件夹下,这里我存放到 D:\software\ 下
  3. 将 D:\software\apache-maven-3.8.6\bin 配置到系统变量 PATH 中(注意:要使用“;”与前面的值分隔)。
  4. 验证 Maven 安装情况
# 打开 CMD 窗口,验证 Maven 安装情况
## 1. 查看 PATH 变量
echo %PATH%
## 2. 查看 Maven 版本
mvn -v

控制台输出:

Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: D:\software\apache-maven-3.8.6
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: G:\work\software\jdk1.8_64\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

至此 Maven 安装成功。

2.4 Linux、Mac 系统

  1. 安装 JDK
  2. 下载 apache-maven-3.8.6-bin.tar.gz 到服务器 /opt 下
  3. 解压 apache-maven-3.8.6-bin.tar.gz
tar -xvf apache-maven-3.8.6-bin.tar.gz
  1. 将 /opt/apache-maven-3.8.6/bin 添加到 PATH 下:
export PATH=$PATH:/opt/apache-maven-3.8.6/bin
  1. 查看 Maven 版本
mvn -v 

至此 Maven 安装成功。

2.5 配置 Maven

  1. Maven 的配置文件位置:{Maven 安装目录}/conf/settings.xml
    比如,本地安装目录为 D:\software\apache-maven-3.8.6 那么配置文件路径在 D:\software\apache-maven-3.8.6\conf\settings.xml

2.5.1 配置本地 Maven 仓库保存路径

打开 settings.xml 文件,在 <settings>标签下添加:

  <!-- 保存从中央仓库下载的 jar 包到 D:/software/repository -->
  <localRepository>D:/software/repository</localRepository>

2.5.2 配置国内镜像仓库

打开 settings.xml 文件,在 <settings><mirrors>标签下添加:

    <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>alibaba maven repository</name>
      <url>https://maven.aliyun.com/repository/central</url>
    </mirror>

3 Maven 插件

Maven 本质是一个插件驱动框架,所有的工作都是由插件来完成。

分为两种类型插件:

  • 构建插件:POM.xml 的 <build> 标签中配置。
  • 报告插件:生成站点时使用,在POM.xml 的<reporting/> 标签中配置。

3.1 核心插件

核心插件:对应默认的 clean package 等, 每个插件会有多个 goal

3.2 报告插件

Maven 构建生命周期

Maven 内置的构建生命周期

默认内置了 3 钟构建声明周期:

  • default 生命周期:处理项目部署
  • clean 生命周期:处理项目清理
  • site 生命周期:解决项目站点的生成

构建生命周期是由不同的阶段组成的。

更详细的生命周期介绍:https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference

default 生命周期

default 生命周期由以下阶段组成:

  • validate :验证项目的正确性和依赖信息的可用性
  • compile :编译源码
  • test : 使用合适的单元测试框架测试编译后的代码
  • package :将编译后的代码打包成 JAR或war等.
  • verify :运行结果校验保证质量
  • install :将package 打出来的包安装到本地 Maven 仓库
  • deploy :将 jar 包部署到远程仓库供其他人使用

使用命令行调用这些阶段,比如 mvn clean

每个阶段又对应1个或多个插件的任务。

mvn clean dependency:copy-dependencies package
# 可以执行多个阶段或插件任务,并且按先后顺序执行。

POM

POM(项目对象模型)是一个 xml 格式文件,包含了项目信息和 Maven 构建项目使用的详细配置。

Super POM

所有的模块都继承自一个 super-pom:

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
 
  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>
 
  <build>
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
 
  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>
 
  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>
 
      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>
 
      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
 
</project>

最小配置 pom

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

项目继承

pom.xml 中可以合并的元素:

  • dependencies
  • developers and contributors
  • plugin lists (including reports)
  • plugin executions with matching ids
  • plugin configuration
  • resources

pom.xml 中<parent>标签可配置父 pom 。

例子1
父工程与模块的目录结构:

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

pom 配置:

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
  </parent>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

例子2
父工程与模块的目录结构:

|-- my-module
|   `-- pom.xml
 `-- parent
     `-- pom.xml

pom 文件配置:

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
    <!-- 父 pom 的相对位置 -->
    <relativePath>../parent/pom.xml</relativePath>
  </parent>
 
  <artifactId>my-module</artifactId>
</project>

项目聚集

特点:

  1. 父 Pom 的打包格式必须是 pom
  2. 父 pom 添加 <module>标签配置子模块

例子1
目录结构:

.
 |-- my-module
 |   `-- pom.xml
 `-- pom.xml

pom 配置:

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>my-module</module>
  </modules>
</project>

例子2
目录结构:

.
 |-- my-module
 |   `-- pom.xml
 `-- parent
     `-- pom.xml

pom 配置:

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>../my-module</module>
  </modules>
</project>

项目继承 VS 项目聚集

一般来说,项目继承用于不同的 maven 项目使用了相同的配置;项目聚集适用于一组项目需要共同构建和处理。

当然也可以同时使用项目继承和项目聚集,例如:

.
 |-- my-module
 |   `-- pom.xml
 `-- parent
     `-- pom.xml
<project>
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>../my-module</module>
  </modules>
</project>

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
    <relativePath>../parent/pom.xml</relativePath>
  </parent>
 
  <artifactId>my-module</artifactId>
</project>

POM 中的变量

  1. 项目模型变量

pom 文件中只要是单个值的标签都可作为变量用于引用,例如 $

  1. 特殊的变量
  • project.basedir
  • project.baseUri
  • maven.build.timestamp
  1. properties
    在 POM 文件中,使用<properties>标签配置自定义属性,然后通过${}方式使用自定义属性,例如:

<project>
  ...
  <properties>
    <mavenVersion>3.0</mavenVersion>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-artifact</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-core</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
  </dependencies>
  ...
</project>

配置文件(Profile)

配置文件的类型

  • 项目配置:pom.xml 配置
  • 用户配置:(%USER_HOME%/.m2/settings.xml)
  • 全局配置:(${maven.home}/conf/settings.xml)
  • 配置文件描述符:profiles.xml (Maven 3.0 已经不支持)

配置的触发方式

  • 命令行
  • setting.xml
  • 环境变量
  • 操作系统设置
  • 现有或丢失的文件

激活配置

方式一: 通过命令行激活配置

使用命令行参数-P后面紧跟配置ID,如果有多个ID则用逗号拼接

# ? 表示 profile-3 是可选配置
mvn groupId:artifactId:goal -P profile-1,profile-2,?profile-3

方式二:通过 setting.xml 的 <activeProfiles>标签

<settings>
  ...
  <activeProfiles>
    <activeProfile>profile-1</activeProfile>
  </activeProfiles>
  ...
</settings>

使配置失效

在配置ID加 "!"或者"-"可让对应的配置失效

mvn groupId:artifactId:goal -P !profile-1,!profile-2,!?profile-3
或
mvn groupId:artifactId:goal -P -profile-1,-profile-2,-?profile-3

配置文件顺序

按声明顺序,越在后面声明的配置优先级越高。

<project>
  ...
  <repositories>
    <repository>
      <id>global-repo</id>
      ...
    </repository>
  </repositories>
  ...
  <profiles>
    <profile>
      <id>profile-1</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>profile-1-repo</id>
          ...
        </repository>
      </repositories>
    </profile>
    <profile>
      <id>profile-2</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>profile-2-repo</id>
          ...
        </repository>
      </repositories>
    </profile>
    ...
  </profiles>
  ...
</project>

顺序:profile-2-repo, profile-1-repo, global-repo

如何知道正在生效的配置

以下命令可以知道正在生效的配置是什么:

mvn help:active-profiles

仓库

Maven 仓库分为本地仓库和远程仓库,如果本地没有依赖的包,那么就会从远程仓库下载。

Maven 项目的目录层级

  • src/main/java Application/Library sources
  • src/main/resources Application/Library resources
  • src/main/filters Resource filter files
  • src/main/webapp Web application sources
  • src/test/java Test sources
  • src/test/resources Test resources
  • src/test/filters Test resource filter files
  • src/it Integration Tests (primarily for plugins)
  • src/assembly Assembly descriptors
  • src/site Site
  • LICENSE.txt Project's license
  • NOTICE.txt Notices and attributions required by libraries that the project depends on
  • README.txt

Maven 依赖层级

依赖范围

  • compile 默认依赖范围,编译依赖项可在项目的所有类路径中使用。
  • provided 很像 compile,但是你期望在运行时 JDK 或 容器提供这些依赖,比如 Servlet API 等。不传递。
  • runtime 表明编译时不要求此依赖,但是在执行时必须有。
  • test 表明依赖仅在测试编译和执行阶段使用。
  • system 期望必须明确提供 jar,框架总是可用,不需要从仓库查找。
  • import 仅支持依赖 <dependencyManagement>标签中的 pom。

依赖管理

依赖管理是集中依赖信息的机制

<dependencyManagement> 作用:

  1. 配置通用依赖
  2. 声明公共依赖的版本,子模块依赖时可继承父 POM的<dependencyManagement> 导入这个 BOM POM 即可。
    引用的依赖版本

导入依赖

<dependencyManagement> 引入的依赖类型是 pom 类型且范围是 import,那么依赖的 pom 所有的依赖管理会合并到当前 pom 的<dependencyManagement> 中,除了<dependencyManagement> 声明的具体版本的依赖。

如果依赖了多个 pom 且范围都是 import,这些 pom 存在重复依赖,那么谁声明在前谁的优先级就越高。

BOM(材料清单)

根是 BOM pom,它定义了库中所有将要创建的artifacts的版本。如果其他项目想使用此库,那么只要在其 pom 的 <dependencyManagement> 导入这个 BOM POM 即可。

BOM 项目使用:

BOM pom // 管理了多个项目的版本形成一个库
 |
 |---parent project pom // 继承 BOM
         |
         |----- subproject pom // 继承 parent project pom,版本号使用 BOM定义的项目版本号

当其他项目使用 BOM 下某个子项目时,可直接导入 BOM ,然后声明自己使用的依赖。

系统依赖

使用场景:当 maven 仓库没有维护的 jar 包时,可以使用 <systemPath> 指定jar包位置

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>javax.sql</groupId>
      <artifactId>jdbc-stdext</artifactId>
      <version>2.0</version>
      <scope>system</scope>
      <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>
  </dependencies>
  ...
</project>

可选依赖和排除依赖

可选依赖

  1. 什么是可选依赖?
    答:当一个项目无法拆分为子模块时,可以使用可选依赖;当某些依赖仅仅是实现特定的功能且暂时不需要使用这些功能时,可以将这些依赖设置为可选依赖;如果其他项目想使用这些功能,则必须声明依赖(非可选)。

  2. 为什么使用可选依赖?
    答:可以节省空间和内存,

<dependency>标签下使用 <optional>声明此依赖时可选依赖

<project>
  ...
  <dependencies>
    <!-- declare the dependency to be set as optional -->
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <optional>true</optional> <!-- value will be true or false only -->
    </dependency>
  </dependencies>
</project>

排除依赖

由于 Maven 是以传递方式解析依赖,所以你的项目中可能会依赖不必要的jar

<dependency>标签下使用 <exclusions>声明排除的依赖

其他

settings.xml 详细说明

官网:https://maven.apache.org/ref/3.8.6/maven-settings/settings.html

pom.xml 详细说明

https://maven.apache.org/ref/3.8.6/maven-model/maven.html

posted on 2022-12-10 13:17  不安分的黑娃  阅读(73)  评论(0编辑  收藏  举报