1.Maven 简介
Maven是Apache软件基金会组织维护的一款自动化构建工具专注服务于Java平台的项目构建和依赖管理 。
2. 构建过程的主要几个环节
①清理 :删除以前的编译结果,为重新编译做好准备。
②编译 :将Java源程序编译为字节码文件。
③测试 :针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告 :在每一次测试后以标准的格式记录和展示测试结果。
⑤打包 :将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
⑥安装 :在 Maven 环境下特指将打包的结果jar包或war包安装到本地仓库中。
⑦部署 :将打包的结果部署到远程仓库或将war包部署到服务器上运行。
3.maven程序安装
-
- Binary:编译之后的二进制文件
- Source:表示可以查看源代码的,比Binary大一点
- tar.gz archive:Linux、macOS系统使用
- zip archive:windows系统使用
解压到本地,注意解压的目录下不要有中文
配置环境变量
mac
打开terminel输入以下命令:vim ~/.bash_profile
打开.bash_profile文件,在次文件中添加设置环境变量的命令1
2
3export M2_HOME= ***这里换成自己解压maven的地址***
//示例:export M2_HOME=/Users/XXX/Maven/apache-maven-3.6.3
export PATH=$PATH:$M2_HOME/bin添加之后保存并推出,执行以下命令使配置生效:
source ~/.bash_profile
mac中解决source ~/.bash_profile
关闭终端后在打开不生效的问题,需要在~/.zshrc文件最后,增加一行:source ~/.bash_profile
。如果没有此文件可以使用vim ~/.zshr
新建一个文件,在添加对应的命令win
参考WIN10下安装配置mave文章进行配置
4.配置maven本地仓库
4.1 仓库的分类
- 本地仓库:为当前本机电脑上的所有Maven工程服务。
- 远程仓库
- 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
- 中央仓库:架设在 Internet 上,为全世界所有Maven工程服务。
- 中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
- 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
4.2 本地仓库的配置
在 conf/setting.xml的文件中更改默认的仓库位置,也就是我们jar包下载后存放的位置
1 | <!--需要添加的配置--> |
5.maven的标准目录结构
6.maven的常用命令
6.1 clean命令
清除编译产生的target文件夹内容,可以配合相应命令一起使用,如mvn clean package, mvn clean test
6.2 complie命令
该命令可以对src/main/java目录的下的代码进行编译
6.3 test命令
测试命令,或执行src/test/java/下junit的测试用例
6.4 package命令
mvn package,打包项目
6.5 install命令
mvn install,打包后将其安装在本地仓库
7. maven的生命周期
7.1 Maven 有三套相互独立的生命周期
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
它们是相互独立的,你可以仅仅调用
clean 来清理工作目录,仅仅调用 site 来生 成站点。 当然你也可以
直接运行 mvn clean install site 运行所有这三套生命周期。
8. maven的概念模型图
8.1 POM
Project Object Model:项目对象模型。将 Java 工程 的相关信息封装为 对象 作为便于操作和管理的 模型 。Maven 工程的核心配置。可以说学习Maven 就是学习 pom.xml 文件中的配置。
8.2 Maven 的坐标
使用如下三个向量在Maven的仓库中唯一的确定一个Maven工程。
groupid:公司或组织的域名倒序当前项目名称
artifactId:当前项目的模块名称
version:当前模块的版本
1
2
3<groupId>org.example</groupId>
<artifactId>wugujiawebmaven</artifactId>
<version>1.0-SNAPSHOT</version>
8.3 如何通过坐标到仓库中查找 jar包
- 将 gav 三个向量连起来
org.example+wugujiawebmaven+1.0-SNAPSHOT
- 以连起来的字符串作为目录结构到仓库中查找
org/example/wugujiawebmaven/1.0-SNAPSHOT
※注意:我们自己的Maven工程必须执行安装操作才会进入仓库 。安装的命令是: mvn install
9. idea集成maven插件
配置创建java工程-DarchetypeCatalog=local
是为了防止在无网络的情况下可是使用本地已经下载好的maven的骨架
配置路径如下:
10. 使用骨架创建maven的java工程
11. 不实用骨架创建maven的java工程
12. 使用骨架创建maven的web工程
- 创建web工程
- 创建好的javaweb工程(图1),所以我们需要手动添加一个java的目录用于编写java代码(图2),还要将java目录添加为Source Root(图3)
13. 创建自定义的JavaWeb工程
创建web工程信息
创建好的javaweb工程目录如图所示
14.idea中执行maven的命令
- clean、test、complie、package、install的命令输入方法相同
15. Maven插件
Maven是一个核心引擎,提供了基本的项目处理能力和建设过程的管理,以及一系列的插件是用来执行实际建设任务。maven插件可以完成一些特定的功能。例如,集成jdk插件可以方便的修改项目的编译环境;集成tomcat插件后,无需安装tomcat服务器就可以运行tomcat进行项目的发布与测试。在pom.xml中通过plugin标签引入maven的功能插件。
15.1 JDK编译版本的插件
1 | <!-- jdk版本插件 --> |
15.2 Tomcat7服务端的插件
1 | <!-- tomcat7插件 --> |
tomcat插件注意问题
Maven的中央仓库中只有Tomcat7.X版本的插件,而之前我们使用的是8.X的版本,如果想使用Tomcat8.X的插件可以去其他第三方仓库进行寻找,或者使用IDEA集成外部Tomcat8极其以上版本,进行项目的发布
16. 依赖范围
- compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖
strus-core、spring-beans。打到war包或jar包 - provided 编译、和测试有效,A在编译和测试时需要B
servlet-api就是编译和测试有用,在运行时不用(tomcat容器已提供)
不会打到war - runtime:测试、运行有效
在运行和测试时需要通过jdbc驱动包(mysql驱动)连接数据库,需要的会打到war - test:只是测试有效,只在单元测试类中用
例如:junit 不会打到war - 按照依赖强度,由强到弱来排序:(理解)
compile> provided> runtime> test
17. maven倒入jar包冲突解决
- 路径最短者优先
- 路径相同时先声明者优先。这里声明的先后顺序指的是dependency标签配置的先后顺序。
- 使用
<exclusions>
标签排除
1 | <dependency> |
18. 统一管理所依赖的版本
对同一个框架的一组jar包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来
统一声明版本号
1
2
3
4
5//其中
atguigu.spring.version 部分 是自定义标签
<properties>
<atguigu.spring.version>4.1.1.RELEASE</atguigu.s pring.version>
</properties>引用前面声明的版本号
1
2
3
4
5
6
7
8<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springcore</artifactId>
<version>${atguigu.spring. version}</version>
</dependency>
……
</dependencies>完整示例
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203<?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.itheima</groupId>
<artifactId>ssm_parent_331</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>ssm_dao_331</module>
<module>ssm_service_331</module>
<module>ssm_web_331</module>
<module>ssm_domain_331</module>
<module>ssm_utils_331</module>
</modules>
<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>
<spring.version>5.0.2.RELEASE</spring.version>
<spring.security.version>5.0.2.RELEASE</spring.security.version>
</properties>
<dependencies>
<!-- spring相关的jar包 -->
<!-- 容器 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- springMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mybatis与Spring整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- AOP切面 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- servletAPI -->
<!-- JSP应用 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- servlet应用 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- 日志记录工具 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.9.1</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--oracle的jar包-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.2.0</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
</dependencies>
</project>
19. maven工程的拆分与聚合
19.1 创建父工程(只需要有pom.xnl文件)
父工程中可以将src
的文件夹删除掉,只留下pom.xml
文件
19.2 子模块的创建
19.3 工程和模块的区别
区别:
- 工程不等于完整的项目,模块也不等于一个完整的项目。代码完整,就可以说这是一个完整的项目和此项目和模块没有关系
- 工程只能使用自己的内部资源,工程天生时独立的。后天可以和其他工程和模块建立关联关系
- 模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用
关系:
- 父子工程中,子模块天生集成父工程,可以使用父工程所有的资源
- 子模块之间是没有关联的
- 子模块之间可以使用
denpendency
之间来互相引用,建立关联 - 平级之间引用叫做依赖,依赖不是先天的,是后天建立的
- 父子工程之间不用建立关系,继承关系是先天的,不需要手动建立
19.4 maven父子工程三种启动方式
- 可以在父工程中使用 mvn run
- 使用web模块中启动时,需要先将其依赖的jar发布到本地仓库或者远程仓库中
- 添加本地的tomcat,不在使用maven中自带的tomcat
19.5 搭建maven的私服环境
下载nexus
Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。Centos7上搭建私服
上传到Centos7服务器
使用命令
tar -avxf nexus-3.23.0-03-unix.tar.gz
解压完成后会出现一下两个文件(一个是nexus服务,一个是私有仓库)修改默认的端口
启动nexus
启动 Nexus(默认端口是8081),Nexus 常用的一些命令包括:/nexus-3.23.0-03/bin/nexus {start|stop|run|run-redirect|status|restart|force-reload},下面我们启动Nexus:1
2
3
4WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus上面在启动过程中出现警告:“不推荐使用root用户启动”。这个警告不影响Nexus的正常访问和使用。 如果上面的环境变量配置了,试着修改
1
/bin/nexus.rc文件中的run_as_user= “root”
19.6 私服的应用
19.6.1 账号和密码是固定的 admin/admin123
19.6.2 登陆私服的配置(server.xml)
1
2
3
4
5
6
7
8
9
10<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
19.6.3 配置项目pom.xml
配置私服仓库的地址,本公司的自己的jar包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为release则上传到私服的release仓库,如果版本为snapshot则上传到私服的snapshot仓库
1 | <distributionManagement> |
注意:pom.xml这里
19.6.4 相关jar包的下载
1 | <!-- 下载jar包配置 --> |
1 | <activeProfiles> |
19.6.5 安装第三方jar包到本地仓库和私服
- 安装第三方jar包到本地仓库
1 | ----进入jar包所在目录运行 |
- 安装第三方jar包到私服
1 | --在settings配置文件中添加登录私服第三方登录信息 |
20. 配置全局的jdk
1 | <!--配置全局的jdk为1.8--> |