修改 Maven 配置(可选),主要是修改资源下载地址,因为默认下载地址是 Google,下载速度会很慢,可以修改国内的例如阿里云的。其次是修改下载资源的存放位置,如果不修改,默认是 c 盘用户目录下的 .m2
路径中。
Maven 配置文件在解压后的 conf 目录下,settings.xml
文件。修改资源下载地址为阿里云,以及修改资源库存放位置。
D:\MavenRepository
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
4.1 IDEA 配置 Maven
IDEA 配置 Maven,有两种方式,一种是针对本项目,只对此项目有效;一种是全局配置,针对所有新项目生效,一般我们会配置全局性的。
针对单项目配置
路径:File | Settings | Build, Execution, Deployment | Build Tools | Maven。
全局配置
路径:File | Other Settings | Settings for New Projects | Build, Execution, Deployment | Build Tools | Maven。
4.2 Eclipse 配置 Maven
路径:Window | Preferences | Maven | User Settings
Maven 其中一个核心特性就是依赖管理。我们开发的项目基本会使用外部依赖,或者我们需要处理多模块项目的模块之间的依赖,这些依赖关系非常复杂,管理起来比较困难。使用 Maven 管理依赖能大大降低难度。
Maven 对于依赖管理一个特点是可传递性依赖发现
,比如我们项目依赖于 A,A 又依赖于 B,如果我们手动添加的话,需要将 A 和 B 两个依赖都下载引入项目。而使用 Maven 来构建项目的话,我们只需要显示引入依赖 A,Maven 会通过读取项目文件(pom.xml),找出它们项目之间的依赖关系,将 A 和 B 都引入进来。
Maven 使用坐标管理依赖,坐标包含三个标识信息,通过坐标可以唯一标识一个依赖。任何基于 Maven 构建的项目都必须定义这三个信息,包括我们自己开发的项目。可以在 https://mvnrepository.com/ 查找依赖。
-
group:定义当前项目所属组织或公司的唯一标识,一般为组织或者公司名称域名倒写(也可以是域名倒写+项目名),例如 com.alibaba
-
artifactId:项目的唯一 ID,一般是实际项目名称或者实际项目的一个模块名称(如果项目比较大,会划分多模块,例如 spring-core,spring-bean),例如 fastjson
-
version:项目的版本号,例如 1.2.76
com.alibaba
fastjson
1.2.76
Maven 对于依赖管理有以下基本原则:
-
依赖管理:可传递性依赖发现,Maven 会通过读取项目文件(pom.xml),找出项目之间的依赖关系,然后将需要的所有依赖引入进来。
-
依赖调节:当一个依赖的不同版本在依赖树里的深度是一样时,第一个被声明的依赖将会被使用。
-
依赖范围:可以指定依赖的使用范围,即项目在构建过程每个阶段所包含的依赖。
-
依赖排除:任何可传递的依赖都可以通过 “exclusion” 元素被排除在外。例如,A 依赖 B, B 依赖 C,A 可以标记 C 为 “被排除的”。
-
依赖可选:任何可传递的依赖可以通过 “optional” 元素 标记为可选的。例如,A 依赖 B, B 依赖 C。B 可以标记 C 为可选的, 这样 A 就可以不再使用 C。
依赖的范围可选项如下:
-
compile:编译范围,也是默认的依赖范围。使用此范围的依赖,在编译,测试,运行时三种 classpath 都有效。
-
provided:已提供范围。使用此范围的依赖,在编译,测试 classpath 中有效,在运行时 classpath 无效。例如 servlet-api 依赖,编译和测试需要此依赖,但是在运行时不需要,因为容器已经提供了。
-
test:测试范围。该范围表明相关依赖只在测试编译阶段和执行阶段。
-
runtime:运行时范围。在测试和运行时有效,编译期无效。例如 JDBC 驱动实现,在项目编译时只需要 JDK 提供的 JDBC 接口,只有在测试和运行时才真正需要 JDBC 接口的实现类,即 具体的 JDBC 驱动。
-
system:系统范围。此依赖范围和 provided 一样,但是它必须显示通过 systemPath 指定依赖文件的路径。这种依赖不是由 Maven 中央仓库解析的,一般是本地的某个路径下的依赖。
-
optional:表明依赖是可选的。
-
exclusions:用来排除传递性依赖。
这里讲下依赖范围为 system
的情况,项目如何引入外部依赖。首先将下载好的外部依赖,放入到项目已经创建好的文件夹里(例如 libs)。
在项目的 pom.xml 文件中添加依赖
com.alibaba
fastjson
1.2.75
system
${basedir}\libs\fastjson-1.2.75.jar
基于 Maven 构建的项目,项目需要的依赖首先会在本地仓库中查找,如果没有找到则会从远程仓库下载到本地仓库。如果这两者都没有找到,Maven 就会报错。
远程仓库可以分为中央仓库
,其他公共库
以及私服
。
-
中央仓库是 Maven 默认的远程仓库。地址:https://repo.maven.apache.org
-
其他公共库一般是中央仓库的镜像加速库,因为中央仓库在国外,在国内下载会比较慢,所以有些组织或者公司会创建其他公共库供大家使用,例如阿里云仓库。
-
私服一般是在局域网内设立的一个私有的仓库服务,供内部开发人员使用。它代理了外部远程仓库,内部用户下载依赖的时候会先到私服上查找,如果没有才从外部远程仓库下载,并缓存在私服。能节省带宽和加快下载速度,并且公司内部的依赖也能放在私服上供公司其他人下载使用。
每个用户在自己电脑上会有个本地仓库,存放所有下载过的依赖包,Windows 环境下,位置一般在用户目录的 .m2/repository
目录下。
基于约定大于配置的原则,Maven 制定了一套标准的项目目录结构,规定了哪些文件需要放在哪些目录下,解决了在不同 IDE 开发工具中带来的项目目录结构不一致的问题。
-
${basedir}:根目录,pom.xml 文件以及项目所有的子目录
-
${basedir}/src/main/java:项目的 java 源代码
-
${basedir}/src/main/resources:项目的资源文件,例如 application.yml,xml 文件等
-
${basedir}/src/test/java:存放项目的 java 测试源代码
-
${basedir}/src/test/resources:存放项目测试要用的资源文件
-
${basedir}/target:编译打包输出目录
-
${basedir}/target/classes:编译输出目录
-
${basedir}/target/test-classes:测试编译输出目录
Maven 可以添加插件,插件其实就是一些 jar 文件,执行 Maven 命令时,真正完成功能的就是插件。例如项目使用 Tomcat 服务器,我们可以引入一些 Tomcat 相关的插件。使用 springboot 框架,可以用引入 spring-boot 相关的 maven 插件。
org.springframework.boot
spring-boot-maven-plugin
比较常用的插件是 Maven 编译插件,可以设置项目使用的 JDK 版本时通过编译插件指定。
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
1.81.8
Maven 提供了许多命令,来帮助构建,管理项目。不过现在许多 IDE 开发工具提供了将这些命令图形化的功能,只要点击相应的按钮也可执行相应的命令。
Maven 的命令格式:mvn [plugin-name]:[goal-name]
,即执行 plugin-name 插件的 goal-name 目标。
-
mvn -version:显示 Maven 版本信息
-
mvn clean:清理项目编译产生的临时文件,一般是模块下的 target 目录
-
mvn compile:编译源代码
-
mvn package:打包项目,一般会在模块下的 target 目录下生成 jar 或者 war 文件
-
mvn test:执行测试用例
-
mvn install:打包项目的 jar 或者 war 到本地仓库,供其他模块使用
-
mvn deploy:打包项目的 jar 或者 war 到远程仓库,供其他人员下载使用
-
mvn site:生成项目相关信息的网站
-
mvn eclipse:eclipse:将项目转化为 eclipse 项目
-
mvn dependency:tree:打印项目的整个依赖树
-
mvn archetype:generate:创建普通 maven 项目
-
mvn tomcat7:run:在 tomcat 容器中运行 web 项目
-
mvn jetty:run:在 jetty 容器中运行 web 项目
Maven 命令可以带参数,例如 mvn package -Dmaven.test.skip=true
会在打包的时候跳过单元测试。
Maven 有以下三个标准的生命周期
-
clean:清理项目产生的临时文件
-
default(也叫 build):关于项目构建,打包,部署等的处理
-
site:项目站点文档创建的处理
执行某个 maven 命令时,会先执行这个命令前的所有命令,例如执行 mvn package 生成可执行 jar,会依次执行 pre-clean,clean,…,test,package等命令。
首先通过 IDEA 工具创建一个 Maven 项目,选择 JDK,选择 Maven 模板。
按上述步骤一般没有 resources 目录,所以我们手动创建源文件资源目录和测试资源目录。
最终项目的目录结构如下:
项目根目录下有个 pom.xml 文件,一些常用标签介绍如下:
-
modelVersion:指定当前 pom 模型的版本,对于 maven2 和 maven3 来说,只能填写 4.0.0
-
groupId:定义项目的所属组或者公司,一般是公司域名的倒写
-
artifactId:项目在所属组的唯一ID
-
version:项目版本号
-
name:项目名称,可选
-
description:对项目的描述,可选
-
properties:定义一些属性变量
-
dependencies:定义项目使用到的依赖
-
packaging:项目打包的类型,默认是 jar,可选值有 jar,war,rar,ear,ejb,pom等等
-
build:与构建相关的配置,例如设置编译插件的 JDK 版本
<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”>
4.0.0
com.chenpi
maven-demo
1.0-SNAPSHOT
jar
maven-demo
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
junit
junit
4.11
test
在剪辑器的右边,有个 Maven 菜单栏,这里有 Maven 相关命令可以直接双击执行,还有插件列表,项目依赖列表。
如果一个项目比较大时,会拆分成多个模块进行开发,例如一个项目的 dao,service,controller 层被拆分到不同模块中;Spring 框架中的 spring-core,spring-bean,spring-webmvc 等模块。
基于Maven 构建的项目,一般会定义一个 parent POM 作为一组子 module 的聚合 POM。在 parent POM 中使用 标签来定义它的一组子模块。虽然在 parent POM 中不会有什么实际构建产出,但是我们可以在 parent POM 中定义一些共同构建配置,依赖等,并且可以被子模块继承。
首先创建父模块,创建一个不使用模板的 maven 项目。
然后在父模块的基础上创建子模块,直接在父模块项目右键创建子模块 maven-dao,maven-service,maven-controller。
最终的项目目录结构如下所示:
子模块间依赖处理,因为 maven-controller 模块依赖 maven-service 模块,maven-service 模块依赖 maven-dao 模块。
我们需要在 maven-controller 模块的 pom.xml 文件中依赖 maven-service 模块;
com.chenpi
maven-service
1.0-SNAPSHOT
我们需要在 maven-service 模块的 pom.xml 文件中依赖 maven-dao 模块;
com.chenpi
maven-dao
1.0-SNAPSHOT
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.0http://maven.apache.org/maven-v4_0_0.xsd”>
4.0.0
asia.banseon
banseon-maven2
jar
1.0-SNAPSHOT
banseon-maven
http://www.baidu.com/banseon
A maven project to study maven.
jira
http://jira.baidu.com/banseon
Demo
http:/hi.baidu.com/banseon/demo/dev/
HELLO WORLD
banseon
Project Manager
Architect
demo
http://hi.baidu.com/banseon
No
-5
Apache 2
http://www.baidu.com/banseon/LICENSE-2.0.txt
repo
A business-friendly OSS license
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
http://svn.baidu.com/banseon
demo
http://www.baidu.com/banseon
…
…
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
…
…
…
…
…
…
banseon-repository-proxy
banseon-repository-proxy
http://192.168.1.169:9999/repository/
default
…