Maven教程

maven的安装

maven下载地址:maven官网

下载后解压到一个固定位置,比如我这里直接解压到:/Users/yiny/soft/apache-maven-3.8.1

然后更改.bash_profile (如果使用zsh的话需要修改.zshrc),将maven的环境变量添加进去:

1
2
export M2_HOME="/Users/yiny/soft/apache-maven-3.8.1"
export PATH="$M2_HOME/bin:$PATH"

然后在命令行执行mvn -v,如果命令成功返回显示了maven的版本号,就说明maven已经安装成功了。
如果不成功,比如提示找不到mvn命令等,一般是JDK或者maven安装的有问题。

修改maven的默认配置

修改本地仓库地址

安装成功后,需要到maven的安装目录下的conf/setting.xml文件中修改一下默认的repository存储位置和下载镜像。

1
2
3
4
5
6
7
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>/Users/yiny/soft/apache-maven-3.8.1/repo</localRepository>

修改localRepository节点的值,配置本地仓库存储地址。

修改镜像地址

还需要配置下载源为阿里源,提高下载速度,在mirrors节点下添加如下mirror配置:

1
2
3
4
5
6
7
8
9
10
<mirrors>
...
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>

创建maven工程

这里以java的jar格式工程说明mvn的工程目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
➜  mvntest1 tree
.
├── pom.xml # maven 配置文件
├── src # 源码文件根目录
│   ├── main # 源码
│   │   ├── java
│   │   │   └── cn
│   │   │   └── geekhall
│   │   │   └── main
│   │   │   └── Main.java
│   │   └── resourses
│   └── test # 测试代码
│   └── java
└── target # 生成的目标文件根目录
├── classes
│   └── cn
│   └── geekhall
│   └── main
│   └── Main.class
└── maven-status
└── maven-compiler-plugin
└── compile
└── default-compile
├── createdFiles.lst
└── inputFiles.lst

然后在pom.xml文件中添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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>cn.geekhall</groupId>
<artifactId>maventest1</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>

按照上面的目录格式常见好目录结构和源码文件后,在工程的根目录执行mvn compile 就会对工程进行编译,生成的文件存放在target目录下。第一次会下载全量依赖包,时间会比较长,第二次以后再次运行的时候就会比较快了。

然后执行: mvn -e exec:java -Dexec.mainClass="cn.geekhall.main.Main" 即可运行工程看到执行结果。

pom.xml文件格式

maven是使用pom.xml文件来找到各种依赖包、插件的地址,解决依赖问题的。
具体的pom.xml文件格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?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>

<!--在这里配置本工程的mvn地址信息。 -->
<groupId>cn.geekhall</groupId>
<artifactId>maventest02</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<name>maventest02 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>https://www.geekhall.cn</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>
<junit.version>4.11</junit.version>
<servlet-version>4.0.1</servlet-version>
<jsp-version>2.3.3</jsp-version>
<jstl-version>1.2</jstl-version>
<spring-version>5.1.11.RELEASE</spring-version>
<aspectjweaver-version>1.9.4</aspectjweaver-version>
<mybatis-version>3.5.2</mybatis-version>
<mybatis-spring-version>2.0.2</mybatis-spring-version>
<log4j-version>1.2.17</log4j-version>
<mysql-connector-java-version>5.1.48</mysql-connector-java-version>
<jackson-version>2.9.9</jackson-version>
<commons-fileupload-version>1.3.1</commons-fileupload-version>
</properties>

<!-- 这里配置各种依赖信息 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${jsp-version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
</dependencies>

<!-- 执行profile环境 -->
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<acctivation>
<activeByDefault>true</activeByDefault>
</acctivation>
</profile>
</profile>

<build>
<finalName>maventest02</finalName>
<!-- plugins配置各种插件 -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>6060</port>
<path>/my</path>
</configuration>
</plugin>
</plugins>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

maven常用命令

maven命令格式为:mvn [plugin-name]:[goal-name],表示执行plugin-name插件的goal-name目标,

常用命令有:

  • mvn -version / mvn -v : 显示版本信息。
  • mvn clean : 清理项目产生的临时文件,一般是模块下的target目录。
  • mvn compile : 编译源代码,一般编译模块下的src/main/java目录。
  • mvn package : 项目打包工具,会在模块下的target目录生成jar或者war等文件。
  • mvn test : 测试命令,会执行src/test/java目录下的测试用例。
  • mvn install : 将打包的jar或者war文件复制到你的本地仓库中,供其他模块使用。
  • mvn deploy : 将打包的jar或者war文件发布到远程仓库,提供其他人员进行下载依赖。
  • mvn site : 生成项目相关信息的网站。
  • mvn eclipse:eclipse : 将项目转化为Eclipse项目。
  • mvn dependency:tree : 打印出项目的整个依赖树。
  • mvn archetype:generate : 创建maven的普通java项目。
  • mvn tomcat7:run : 在tomcat容器中运行web应用。
  • mvn jetty:run: 调用jetty的run目标在Jetty Servlet容器中启动web应用。

需要注意的是:运行maven命令的时候,首先需要定位在maven项目所在的目录,也就是项目pom.xml文件所在的目录。否则需要使用参数执行项目的目录。

还可以使用-D指定属性参数,例如:mvn package -Dmaven.test.skip=true 可以指定打包的时候跳过单元测试。

IDEA集成maven环境

在工具的 preferences -> Build,Extension,Deployment -> Build Tools ->Maven 目录下配置maven。

在Maven home directory:目录下配置当前使用的maven,这里使用了IDEA自带的maven。

创建java项目

创建普通java项目

web项目要选择maven-archetype-webapp

编辑运行配置

compile

package

maven仓库

对于maven来说,仓库分为两类:本地仓库和远程仓库。maven根据坐标去寻找构件的时候,它会首先查看本地仓库,若存在则直接使用,不存在再去远程仓库下载。
远程仓库分为三种:中央仓库(国外,访问量大,速度慢),私服(一般公司内部搭建),其他公共库(阿里等)。

mavenrepository.com

maven的配置可以从
https://mvnrepository.com/上找到。