^ _ ^
简介
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理
核心:约定大于配置
配置
1. 在Apache官网下下载Maven并解压
下载地址:https://maven.apache.org/download.cgi
解压到一个目录下
2. 配置环境变量
在控制台验证maven是否安装配置成功
3. 配置镜像加速
在 D:\java\apache-maven-3.6.3\conf 路径下的 settings.xml 中添加镜像地址
1 2 3 4 5 6 7 8 9
| <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>
|
4. 建立本地仓库
(1) 在 D:\java\apache-maven-3.6.3 路径下添加本地仓库文件夹 maven-repo
(2) 在 D:\java\apache-maven-3.6.3\conf 路径下的 settings.xml 中添加本地仓库地址
1
| <localRepository>D:\java\apache-maven-3.6.3\maven-repo</localRepository>
|
在IDEA中使用
然后,IDEA会自动下载依赖包
为项目添加文件夹
这些文件夹在普通Maven项目中会自动创建
初始文件结构
为文件夹添加类型(可以按照下图所示方式,也可以在文件夹处右键,在弹出菜单中’Mark Directory As’中选择该文件夹的类型)
注意事项
在IDEA中,项目创建完成后,MavenHome可能会使用IDEA默认,如果发现了这个问题,建议手动修改
勾选Sources
,可以在下载jar包时同时下载它的源码,希望学习源码时可以勾选此项。
建议不要使用Maven-Web模板创建Web项目,直接使用普通Maven创建项目更好
pom标签
project
maven project声明,其他标签均包含在此标签下
1 2 3 4
| <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"> </project>
|
parent
父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version
1 2 3 4 5 6 7 8 9 10 11
| <parent> <artifactId /> <groupId /> <version />
<relativePath /> </parent>
|
modelVersion
声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。
1
| <modelVersion>4.0.0</modelVersion>
|
groupId
项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app
1
| <groupId>asia.banseon</groupId>
|
artifactId
构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等
1
| <artifactId>banseon-maven2</artifactId>
|
packaging
项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型
1
| <packaging>jar</packaging>
|
version
项目当前版本,格式为:主版本.次版本.增量版本-限定版本号
1
| <version>1.0-SNAPSHOT</version>
|
name
项目的名称, Maven产生的文档用
1
| <name>banseon-maven</name>
|
url
项目主页的URL, Maven产生的文档用
1
| http://www.baidu.com/banseon
|
description
项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标签),不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。
1
| <description>A maven project to study maven.</description>
|
prerequisites
描述了这个项目构建环境中的前提条件
1 2 3 4
| <prerequisites> <maven /> </prerequisites>
|
issueManagement
项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira
1 2 3 4 5 6
| <issueManagement> <system>jira</system> <url>http://jira.baidu.com/banseon</url> </issueManagement>
|
ciManagement
项目持续集成信息
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
| <ciManagement> <system /> <url /> <notifiers> <notifier> <type /> <sendOnError /> <sendOnFailure /> <sendOnSuccess /> <sendOnWarning /> <address /> <configuration /> </notifier> </notifiers> </ciManagement>
|
inceptionYear
项目创建年份,4位数字。当产生版权信息时需要使用这个值。
mailingLists
项目相关邮件列表信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <mailingLists> <mailingList> <name>Demo</name> <post>banseon@126.com</post> <subscribe>banseon@126.com</subscribe> <unsubscribe>banseon@126.com</unsubscribe> <archive>http:/hi.baidu.com/banseon/demo/dev/</archive> </mailingList> </mailingLists>
|
developers
项目开发者列表
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
| <developers> <developer> <id>HELLO WORLD</id> <name>banseon</name> <email>banseon@126.com</email> <url /> <roles> <role>Project Manager</role> <role>Architect</role> </roles> <organization>demo</organization> <organizationUrl>http://hi.baidu.com/banseon</organizationUrl> <properties> <dept>No</dept> </properties> <timezone>-5</timezone> </developer> </developers>
|
contributors
项目的其他贡献者列表
1 2 3 4 5 6 7 8 9 10 11 12 13
| <contributors> <contributor> <name /> <email /> <url /> <organization /> <organizationUrl /> <roles /> <timezone /> <properties /> </contributor> </contributors>
|
licenses
该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license
1 2 3 4 5 6 7 8 9 10 11 12 13
| <licenses> <license> <name>Apache 2</name> <url>http://www.baidu.com/banseon/LICENSE-2.0.txt</url> <distribution>repo</distribution> <comments>A business-friendly OSS license</comments> </license> </licenses>
|
scm
SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <scm> <connection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) </connection> <developerConnection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk </developerConnection> <tag /> <url>http://svn.baidu.com/banseon</url> </scm>
|
organization
描述项目所属组织的各种属性。Maven产生的文档用
1 2 3 4 5 6
| <organization> <name>demo</name> <url>http://www.baidu.com/banseon</url> </organization>
|
build
构建项目需要的信息
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
| <build> <sourceDirectory /> <scriptSourceDirectory /> <testSourceDirectory /> <outputDirectory /> <testOutputDirectory /> <extensions> <extension> <groupId /> <artifactId /> <version /> </extension> </extensions> <defaultGoal /> <resources> <resource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </resource> </resources> <testResources> <testResource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </testResource> </testResources> <directory /> <finalName /> <filters /> <pluginManagement> <plugins> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <dependency> ...... </dependency> </dependencies> <inherited /> <configuration /> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <dependency> ...... </dependency> </dependencies> <goals /> <inherited /> <configuration /> </plugin> </plugins> </build>
|
profiles
在列的项目构建profile,如果被激活,会修改构建处理
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
| <profiles> <profile> <id /> <activation> <activeByDefault /> <jdk /> <os> <name>Windows XP</name> <family>Windows</family> <arch>x86</arch> <version>5.1.2600</version> </os> <property> <name>mavenVersion</name> <value>2.0.3</value> </property> <file> <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </exists> <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </missing> </file> </activation> <build> <defaultGoal /> <resources> <resource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </resource> </resources> <testResources> <testResource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </testResource> </testResources> <directory /> <finalName /> <filters /> <pluginManagement> <plugins> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <dependency> ...... </dependency> </dependencies> <goals /> <inherited /> <configuration /> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <dependency> ...... </dependency> </dependencies> <goals /> <inherited /> <configuration /> </plugin> </plugins> </build> <modules /> <repositories> <repository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id /> <name /> <url /> <layout /> </repository> </repositories> <pluginRepositories> <pluginRepository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id /> <name /> <url /> <layout /> </pluginRepository> </pluginRepositories> <dependencies> <dependency> ...... </dependency> </dependencies> <reports /> <reporting> ...... </reporting> <dependencyManagement> <dependencies> <dependency> ...... </dependency> </dependencies> </dependencyManagement> <distributionManagement> ...... </distributionManagement> <properties /> </profile> </profiles>
|
modules
模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
repositories
发现依赖和扩展的远程仓库列表
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
| <repositories> <repository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases>
<snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id>banseon-repository-proxy</id> <name>banseon-repository-proxy</name> <url>http://192.168.1.169:9999/repository/</url>
<layout>default</layout> </repository> </repositories>
|
pluginRepositories
发现插件的远程仓库列表,这些插件用于构建和报表
1 2 3 4 5 6
| <pluginRepositories> <pluginRepository> ...... </pluginRepository> </pluginRepositories>
|
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
| <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact</artifactId> <version>3.8.1</version>
<type>jar</type>
<classifier></classifier>
<scope>test</scope> <systemPath></systemPath> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> <optional>true</optional> </dependency> </dependencies>
|
reporting
该元素描述使用报表插件产生报表的规范。当用户执行”mvn site”,这些报表就会运行。 在页面导航栏能看到所有报表的链接。
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
| <reporting> <excludeDefaults /> <outputDirectory /> <plugins> <plugin> <groupId /> <artifactId /> <version /> <inherited /> <configuration /> <reportSets> <reportSet> <id /> <configuration /> <inherited /> <reports /> </reportSet> </reportSets> </plugin> </plugins> </reporting>
|
dependencyManagement
继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。
1 2 3 4 5 6 7 8
| <dependencyManagement> <dependencies> <dependency> ...... </dependency> </dependencies> </dependencyManagement>
|
distributionManagement
项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。
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
| <distributionManagement> <repository> <uniqueVersion /> <id>banseon-maven2</id> <name>banseon maven2</name> <url>file://${basedir}/target/deploy</url> <layout /> </repository> <snapshotRepository> <uniqueVersion /> <id>banseon-maven2</id> <name>Banseon-maven2 Snapshot Repository</name> <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url> <layout /> </snapshotRepository> <site> <id>banseon-site</id> <name>business api website</name> <url> scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url> </site> <downloadUrl /> <relocation> <groupId /> <artifactId /> <version /> <message /> </relocation>
<status /> </distributionManagement>
|
properties
以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。格式是<name>value</name>
生命周期
Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
- default(或 build):项目部署的处理
- site:项目站点文档创建的处理
在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行
clean
Maven 调用 clean 生命周期,它包含以下阶段:
pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
build
生命周期阶段 |
描述 |
validate(校验) |
校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize(初始化) |
初始化构建状态,比如设置属性值。 |
generate-sources(生成源代码) |
生成包含在编译阶段中的任何源代码。 |
process-sources(处理源代码) |
处理源代码,比如说,过滤任意值。 |
generate-resources(生成资源文件) |
生成将会包含在项目包中的资源文件。 |
process-resources (处理资源文件) |
复制和处理资源到目标目录,为打包阶段最好准备。 |
compile(编译) |
编译项目的源代码。 |
process-classes(处理类文件) |
处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources(生成测试源代码) |
生成包含在编译阶段中的任何测试源代码。 |
process-test-sources(处理测试源代码) |
处理测试源代码,比如说,过滤任意值。 |
generate-test-resources(生成测试资源文件) |
为测试创建资源文件。 |
process-test-resources(处理测试资源文件) |
复制和处理测试资源到目标目录。 |
test-compile(编译测试源码) |
编译测试源代码到测试目标目录. |
process-test-classes(处理测试类文件) |
处理测试源码编译生成的文件。 |
test(测试) |
使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package(准备打包) |
在实际打包之前,执行任何的必要的操作为打包做准备。 |
package(打包) |
将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test(集成测试前) |
在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test(集成测试) |
处理和部署项目到可以运行集成测试环境中。 |
post-integration-test(集成测试后) |
在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify (验证) |
运行任意的检查来验证项目包有效且达到质量标准。 |
install(安装) |
安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy(部署) |
将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
site
Maven Site 插件一般用来创建新的报告文档、部署站点等。
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
仓库
Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。Maven 仓库有三种类型:
- 本地(local)
- 中央(central)
- 远程(remote)
本地仓库
- Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
- 默认情况下,maven 本地仓库被创建在 %USER_HOME% 目录下,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录
- 要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径,标签为
localRepository
中央仓库
- Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
- 中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。
- 这个仓库由 Maven 社区管理,不需要配置,但需要通过网络才能访问
远程仓库
它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文
示例
1 2 3 4 5 6 7 8 9 10
| <repositories> <repository> <id>companyname.lib1</id> <url>http://download.companyname.org/maven2/lib1</url> </repository> <repository> <id>companyname.lib2</id> <url>http://download.companyname.org/maven2/lib2</url> </repository> </repositories>
|
Maven 依赖搜索顺序
- 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
- 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
- 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
- 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
引入外部依赖
如果我们需要引入第三库文件到项目,该怎么操作呢?
– pom.xml 的 dependencies 列表列出了我们的项目需要构建的所有外部依赖项
1. 要添加依赖项,我们一般是先在 src 文件夹下添加 lib 文件夹,然后将你工程需要的 jar 文件复制到 lib 文件夹下
2. 然后添加以下依赖到 pom.xml 文件中
1 2 3 4 5 6 7 8 9 10
| <dependencies> <dependency> <groupId>ldapjdk</groupId> <artifactId>ldapjdk</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath> </dependency> </dependencies>
|
快照(SNAPSHOT)
- 对于版本,如果 Maven 以前下载过指定的版本文件,Maven 将不会再从仓库下载新的可用的 1.0 文件。若要下载更新的代码,除非版本升级到1.1。
- 快照的情况下,每次构建项目时,Maven 将自动获取最新的快照。
资料
菜鸟教程:https://www.runoob.com/maven/maven-tutorial.html