一、简介
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>标签表示何时使用该依赖,值可以是compile
, test
, 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