一、简介

maven是什么?

Maven本质上是一种项目管理、部署工具,提供了如下功能:

  • 项目构建
  • 文档
  • 报告
  • 依赖处理
  • SCMs
  • 发布版本
  • 包分发

创建mvn工程

mvn -B archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

maven工具生命周期

  • 验证:验证工程是否正确
  • 编译: 将源码编译为可执行工程
  • 单元测试: 运行单元测试内容
  • 打包: 将编译后的代码打包
  • 集成测试: 如果需要,将打好的包部署在环境上
  • 检查包: 检查包
  • 包安装到本地: 将包安装到本地仓库,用于其他工程引用
  • 包部署到远程仓库: 将最终的包上传到远程仓库,共其他开发者使用
mvn clean dependency:copy-dependencies package
此命令将清理项目、复制依赖项并打包项目(当然,执行打包之前的所有阶段)。

maven pom文件标签含义

<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.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <name>my-app</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
 
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
 
  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
       ... lots of helpful plugins
    </pluginManagement>
  </build>
</project>
  • project pom文件顶级元素
  • modelVersion POM使用的对象模型的版本
  • groupId 工程唯一组织标识符
  • artifactId 项目生成的组件唯一名
  • version 工程版本号
  • name 工程名字,可用于文档
  • url 工程url,可用于访问文档
  • properties 属性占位符
  • dependencies 依赖项
  • build 插件相关

二、使用指南

 maven基本命令

编译和测试

mvn compile #编译应用源代码
mvn test   #编译测试源码,运行单元测试用例
mvn test-compile  #仅编译测试源码

打包安装

mvn package   #打jar包
mvn install   #将jar包安装到本地仓库,在user/.m2/repository目录下
mvn site    #自定义mvn站点
mvn clean    #清理target目录下的工程包

maven其他操作

如何理解version中的SNAPSHOT?

可理解为开发分支最新代码,并不保证代码的稳定性,一般是发布版本之前的版本。例如:version 1.0-SNAPSHORT对应的发布版本就是version 1.0。

如何使用mvn插件?

类似依赖操作,需要添加到对应插件配置中,下面配置的是jdk1.5对应的编译器。

如何将资源文件打包到jar包中?

在固定目录${basedir}/src/main/resources下添加即可,测试用例中如果需要使用资源文件,只需要将资源文件放在固定目录${basedir}/src/test/resources中即可。

资源文件在jar包中的位置:/BOOT-INF/classes/

在build时,如何从外部文件获取值填充到资源文件application.properties中

使用resource标签,并设置filtering标签属性为true,在资源文件中通过${name}获取。如果不开启filtering标签true,则资源文件中无法获取到pom.xml文件中配置的值。

pom.xml中配置filetering:

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
<!--        默认false-->
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>

1)资源文件从pom.xml文件中获取值

  <version>1.0-SNAPSHOT</version>
  <name>my-app</name>

...
  <properties>
<!--    从pom.xml文件属性中筛选值。比外部文件优先级高-->
    <my.filter.value>hello in</my.filter.value>
  </properties>
  • 资源文件application.properties从pom文件读取值
application.name=${project.name}
application.version=${project.version}
message=${my.filter.value}
  • 执行mvn process-resources 命令后的输出:
application.name=my-app
application.version=1.0-SNAPSHOT
message=hello in

2)资源文件从外部文件中读取值

  • 创建外部文件filter.properties(src/main.filters/fiter.properties)
my.filter.value=hello out
  • pom.xml中配置需要读取的外部文件
  <build>
    <filters>
      <filter>src/main/filters/filter.properties</filter>
    </filters>
  </build>
  • application.properties资源文件读取外部文件值
message=${my.filter.value}
  • 执行mvn process-resources 命令后的输出:
message=hello out

3)资源文件从系统配置、命令行获取值

  • application.properties资源文件获取配置值、命令行值
java.version=${java.version}
command.line.prop=${command.line.prop}
user.home=${user.home}
  • 执行mvn process-resources "-Dcommand.line.prop=hello again" 命令后的输出:
java.version=1.8.0_211
command.line.prop=hello again
user.home=/Users/jains

Noting

1.资源文件可读取到pom.xml文件,用户settings.xml文件,外部属性文件以及系统配置文件中的值。

2.resource标签下的includes和excludes标签可以于filtering标签配置使用,用于排除、包含外部文件。

如何引入外部依赖?

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

<scope>标签表示何时使用该依赖,值可以是compiletest, and runtime

从哪里引入依赖包?

首先从本地仓库引入,本地仓库路径:${user.home}/.m2/repository。如果本地仓库不存在需要引入的依赖包,会从远程仓库下载包到本地仓库,远程仓库默认url:

https://repo.maven.apache.org/maven2/

如何将自己的jar包部署到远程仓库?

  • 在pom.xml文件中配置远程仓库url
<distributionManagement>
    <repository>
      <id>mycompany-repository</id>
      <name>MyCompany Repository</name>
      <url>scp://repository.mycompany.com/repository/maven2</url>
    </repository>
  </distributionManagement>
  • 在settings.xml文件中配置远程仓库登陆认证信息
...
  <servers>
    <server>
      <id>mycompany-repository</id>
      <username>jvanzyl</username>
      <!-- Default value is ~/.ssh/id_dsa -->
      <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
      <passphrase>my_key_passphrase</passphrase>
    </server>
  </servers>
  ...

Noting

setting.xml文件中密码加密,public-key见Maven – Password Encryption

如何创建父子工程?

  • 父级pom.xml文件添加子模块、添加子包依赖

注意:需要将父级pom.xml打包方式修改为pom,如果不指定类型,默认是jar类型。

<?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.mycompany.app</groupId>
  <artifactId>app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>app</name>

  <packaging>pom</packaging>

  <modules>
    <module>my-app</module>
  </modules>

</project>
  • 子模块pom.xml文件添加父级依赖
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>app</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <groupId>com.mycompany.app.my-app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

注意:子模块需要修改groupId和artifactId