Maven
Maven概述
maven是apache下的开源项目,纯Java开发的用来管理Java项目的开源软件。核心功能依赖、继承、聚合
.
Maven 是一个 项目管理和整合工具。Maven 为开发者提供了一套 完整的构建生命周期框架 。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
Maven作用
- maven项目的对jar的依赖管理这也是maven的核心特性,当项目涉及到许多的依赖Jar时,版本管理变得尤为重要,maven很好的解决的众多jar之间的版本冲突,并且在在pom中指定依赖后,maven会将对应的jar和该jar对应依赖导入项目。
- maven项目区别普通项目的一步构建,我们的项目,往往需要经历编译、测试、运行、打包、安装、部署、等一系列过程。而在maven中:
- 约定优于配置开发者不需要再关心每一个配置细节。Maven 为工程提供了合理的默认行为。当创建 Maven 工程时,Maven 会创建默认的工程结构。开发者只需要合理的放置文件,而在 pom.xml 中不再需要定义任何配置。举例说明,下面的表格展示了工程源码文件、资源文件的默认配置,和其他一些配置。假定 ${basedir} 表示工程目录:
able
配置项 | 默认值 |
---|---|
source code | ${basedir}/src/main/java |
resources | ${basedir}/src/main/resources |
Tests | ${basedir}/src/test |
Complied byte code | ${basedir}/target |
distributable JAR | ${basedir}/target/classes |
maven安装
下载直接解压,解压后目录
- bin:存放了 maven 的命令,比如我们前面用到的 mvn tomcat:run
- boot:存放了一些 maven 本身的引导程序,如类加载器等
- conf:存放了 maven 的一些配置文件,如 setting.xml 文件( Maven 软件的核心配置文件)
- lib:存放了 maven 本身运行所需的一些 jar 包
##maven仓库介绍
仓库类型 | 简介 | 配置方式 |
---|---|---|
本地仓库 | 存放在本地的从远程或者中央仓库下载的依赖jar包,添加依赖后也是优先从本地开始寻找,默认路径是C:/${user.dir}/.m2/repository下 | 全局配置:在maven/conf/settings.xml里配置,用户配置:在默路径下的settings.xml配置,标签 |
远程仓库-中央仓库 | 由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行maven命令的时候下载需要的构件。中央仓库就是这样一个默认的远程仓库,由apache维护,几乎包含所有流行软件及版本 | 中央仓库的信息在超级Pom中配置,所有的maven项目都会继承超级POM。 |
远程仓库(私服) | 私服是一种特殊的远程仓库,他是假设在局域网的仓库服务,它代理广域网上的远程仓库,供局域网使用 | 远程仓库的配置是在标签里配置多个 |
maven项目的pom.xml文件介绍
注意说明:
- POM:全称是Project Object Model,工程对象模型,对构建的项目进行建模。POM包含了关于工程和各种配置细节的信息,Maven使用这些信息构建工程。
- 所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 也被称作 Super POM,它包含了一些可以被继承的默认设置。
- 所有的POM文件需要project根元素和其几个个必须的字段:groupId,artifactId,version等、modelVersion。
- 仓库中工程标识为groupId,artifactId,version。
maven的命令
命令 | 含义 |
---|---|
compile | 编译项目 |
test | 变异并运行test目录的代码 |
clean | 清理编译的文件,也就是target木录 |
package | 打包的jar或者war默认路径在target下,值得注意的是打包过程会先执行complile和Test步骤的 |
install | 项目安装(包括项目编译、测试、打包)项目打包 并上传到本地仓库 |
deploy | 项目发布(发布是指将打包的包发布到指定服务器的私服仓库) |
CMD运行实例

下四行为参数,使用骨架quickstart城建一个groupld为com.companyname.bank,项目名为consumerBanking的工程。
如上所说,有些命令包含text过程,如需跳过test过程只需在后加上参数-DskipTests即可
maven工程的依赖使用范围
依赖中使用属性控制依赖的使用范围
- compile:编译范围;默认的范围,在没有scope标签.编译,打包,安装,发布全部生命周期都存在的依赖资源.
- test:测试范围,运行测试代码时,才加载的依赖资源,打包,安装,发布都不参加.
- runtime:运行时范围,和compile的唯一区别,就是不参加编译;例如JDBC可以不写代码编译,但是必须在运行,打包安装其他阶段参加.
- provided:提供范围,官方给了一个案例:servlet-api,编辑servlet,web应用等代码使用的内容,必须使用provided;在编译阶段使用,但是运行,打包安装都不参加(web应用,在tomcat中运行),如果将servlet-api依赖资源打包到war包,扔到tomcat执行会出现冲突;编写任何web应用时,使用到servlet-api的资源,必须添加provided的范围;
- system:系统范围,在当前项目的环境中存在需要使用的jar包资源,maven没有提供groupId artifactId version,可以使用system指定本地路径
<dependency>
<groupId>maven.spring</groupId>
<artifactId>spring-beans</artifactId>
<version>1.1.0</version>
<scope>system</scope>
<systemPath>D:\\xiao-software\\workspace\\maven-test01\\spring-beans-4.3.7.RELEASE.jar</systemPath>
</dependency>
aven父子工程搭建
创建父子进程意义当项目进行横向拆分,纵向拆分,搭建的项目越来越多,由于很可能多个项目是为同一个系统提供服务的,他们之间的资源管理就成了问题;

父工程:通常没有实际的代码的工程,是其他子工程的公共资源的工程,为了更好的管理有同样需求或属性的工程。pom文件packaging必须声明为pom。在会有多个标识出子工程
子工程:不需要groupId和artifactId,只需要将父工程声明,声明方式:
<parent>
<groupId>com.tedu.spring</groupId>
<artifactId>testspring_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
子工程从父工程继承的内容:
- property:父工程定义的属性值property
- dependencies:将父工程定义的所以依赖直接继承给子工程使用
- dependencyManagement:声明式依赖继承,可以定义子工程中无版本的依赖资源(version),SPRINGBOOT使用了这种继承;
- build(plugins):source生成,maven编译插件,常用公用插件在parent配置即可
- distributionManagement:与发布有关的,定义RELESE版本SNAPSHOT版本发布的远程连接地址,并且要使用settings中配置的server连接;
- orgnization:定义组织者,也可以继承
- GroupId和ArtifactId可独立可继承
maven插件
maven在使用过程中,需要各种插件的支持,作为资源,也会存储在库中,例如我们调用的各种生命周期的命令clean,comiple都算作maven的插件使用,除了生命周期运行命令的插件,maven还专门提供了项目的一些辅助功能的插件,很多的技术,例如springboot,tomcat,都会专门为maven编写这样一些插件来使用。这里我们来看一些常用的。
编译插件
可以指定当前maven项目使用的jdk版本和项目代码的编译字符集UTF-8等。在pom.xml配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
main入口插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.companyname.bank.App</mainClass> <!-- 此处为主入口-->
</manifest>
</archive>
</configuration>
</plugin>
源码打包插件
有时候我们为了方便起见,会将javaDoc和源码同时打包安装,到库中给其他人查看使用
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
maven私服创建(nexus)
maven对于项目版本的管理
- 发行版RELEASE:命名中有RELEASE的版本叫发行版或者稳定版是对开发版本的多次测试结果正确后确定的最终发布版本,在maven中只维护一份数据
- 快照版SNAPSHOT:开发测试过程不断的修改的版本是快照,命名后缀是SNAPSHOT,maven对同一个版本的快照维护是有一个时间戳的,以此来确定最终最新的快照版本,这使得开发中可以不修改大版本的情况下不断更新,测试bug;
- 任何一个maven的库中,version 策略有三个,release(表示维护发行版数据),snapshot(表示维护快照版本数据),mix(表示混合维护)一般公司都会至少有2个hosted类型的私服,一个维护发行版,一个维护快照版本
nexus维护的库的类型及使用方式(默认8081端口)

- proxy就是代理库,nexus只负责连接,这里maven-center就是代理库,连接的就是maven社区的中央库
- hosted就是本地库,nexus负责维护资源,按照版本的不同进行管理
- group就是仓库资源组,他可以表示其他所有的库的集合:
1.链接私服镜像,就像修改为阿里云镜像做法一致,值得注意的是yrl元素写maven-public的比较好,因为其是组包括其他成员。例如:
<mirror>
<!--This sends everything else to /public -->
<id>nexus-releases</id>
<mirrorOf>*</mirrorOf>
<url>http://127.0.0.1:8081/repository/maven-public/</url>
</mirror>
2.配置server,在settings中配置不同版本的库需要连接的私服登录地址和用户名如下。这里的id是每一个server的唯一标识,在pom文件书写后maven会在这里通过id寻找url,不能重复,配置文件中所有的id都是这样
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshot</id>
<username>admin</username>
<password>admin123</password>
</server>
3.对应工程的pom文件也需要修改
对于一个项目来讲,使用RELEASE和snapshot不同,需要单独制定快照库和发行库,这样依赖我们可以将当前工程执行mvn deploy命令,就是将工程资源发布到对应库
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus ReleaseRepository</name>
<url>http://127.0.0.1:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshot</id>
<url>http://127.0.0.1:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>