是什么
Maven是一个Java项目管理和构建工具,它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具。
重点词:
- Java
- 解决依赖问题
- 标准结构
- 构建(build)
安装配置
安装
前提:Java(JDK)已经安装。
官方下载地址:http://maven.apache.org/download.cgi
$ wget http://apache.mirrors.spacedump.net/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
$ tar -xvf apache-maven-3.6.3-bin.tar.gz
$ sudo mv -f apache-maven-3.6.3 /usr/local/
修改用户环境变量
vi ~/.bash_profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=${PATH}:${MAVEN_HOME}/bin
source ~/.bash_profile
mvn -v
设置MAVEN_OPTS环境变量
防止运行Java时内存溢出
export MAVEN_OPTS="-Xms128m -Xmx512m"
settings.xml
全局配置 ${MAVEN_HOME}/conf/settings.xml
或者用户配置 ~/.m2/settings.xml
比如从新定义本地仓库。(默认是~/.m2/repository/)
...
/localdisk/repository
...
还可以设置http代理。
...
my-proxy
true
http
218.14.227.137
3128
...
Maven项目结构
a-maven-project
├─ src
│ ├─ main 存放主程序
│ │ ├─ java 存放Java源文件
│ │ ├─ resources 存放框架或其他工具的配置文件
│ ├─ test 存放测试程序
│ │ ├─ java 存放Java测试的源文件
│ │ ├─ resources 存放测试的配置文件
├─pom.xml Maven工程的核心配置
Maven Hello World
Maven 使用原型 archetype 插件创建项目。要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件。
在下面的例子中,创建一个基于 maven 的 java 应用项目。
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
参数说明:
- -DgourpId: 组织名,公司网址的反写 + 项目名称
- -DartifactId: 项目名-模块名
- -DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart,创建一个简单的 Java 应用
- -DinteractiveMode: 是否使用交互模式
创建了之前命令行中给 artifactId 定义的新目录,结构如下:
.
└── my-app
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── mycompany
│ └── app
│ └── App.java
└── test
└── java
└── com
└── mycompany
└── app
└── AppTest.java
进入这个目录,直接compile
$ cd my-app
$ mvn compile
POM 文件
4.0.0
com.google
springBootDemo1
0.0.1-SNAPSHOT
springBootDemo1
根元素下的第一个子元素modelVersion指定了当前的POM模型的版本,对于Maven3来说,它只能是4.0.0.
groupId 定义了项目属于哪个组织。
artifactId 定义了当前Maven项目在组中唯一的ID,比如定义hello-world。
version 指定了项目当前的版本0.0.1-SNAPSHOT,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的。
name 申明了一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个POM声明name,以方便信息交流
依赖
一个Maven工程就是由groupId
,artifactId
和version
作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。例如,依赖commons-logging
:
commons-logging
commons-logging
1.2
system
${basedir}\src\lib\ldapjdk.jar
使用
声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。
Maven常用命令说明
- mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
- mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
- mvn clean test:运行清理和测试。
- mvn clean package:运行清理和打包。
- mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
- mvn clean deploy:运行清理和发布(发布到私服上面)。
上面的命令大部分都是连写的,大家也可以拆分分别执行,这是活的,看个人喜好以及使用需求。执行test之前是会先执行compile,执行package之前会先执行test,而类似的,install之前会执行package。
仓库的分类
中央仓库
其实我们使用的大多数第三方模块都是这个用法,例如,我们使用commons logging、log4j这些第三方模块,就是第三方模块的开发者自己把编译好的jar包发布到Maven的中央仓库中。
私有仓库
私有仓库是指公司内部如果不希望把源码和jar包放到公网上,那么可以搭建私有仓库。私有仓库总是在公司内部使用,它只需要在本地的~/.m2/settings.xml
中配置好,使用方式和中央仓位没有任何区别。
本地仓库
本地仓库是指把本地开发的项目“发布”在本地,这样其他项目可以通过本地仓库引用它。但是我们不推荐把自己的模块安装到Maven的本地仓库,因为每次修改某个模块的源码,都需要重新安装,非常容易出现版本不一致的情况。更好的方法是使用模块化编译,在编译的时候,告诉Maven几个模块之间存在依赖关系,需要一块编译,Maven就会自动按依赖顺序编译这些模块。
发布到私有仓库
使用Artifact的Token只需要read:packages
权限。
在发布端,把GitHub的用户名和发布Token写入~/.m2/settings.xml
配置中:
...
github-release
GITHUB-USERNAME
f052...c21f
然后,在需要发布的Artifact的pom.xml
中,添加一个
声明:
...
github-release
GitHub Release
https://maven.pkg.github.com/michaelliao/complex
注意到
和~/.m2/settings.xml
配置中的
要保持一致,因为发布时Maven根据id找到用于登录的用户名和Token,才能成功上传文件到GitHub。我们直接通过命令mvn clean package deploy
部署。
参考
https://maven.apache.org/pom.html#
http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
https://www.runoob.com/maven/maven-tutorial.html
https://www.liaoxuefeng.com/wiki/1252599548343744/1309301243117601