Maven项目管理工具

Maven项目管理工具

Maven概念

Maven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System)和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。Maven是基于项目对象模型,可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具;Maven软件的核心文件为settings.xml;Maven项目的核心文件为pom.xml。Maven是Apache下的一个开源项目,是纯Java开发,并且只是用来管理项目的。

Maven优势

Maven可以把你从繁琐工作中解放出来,能帮你构建工程,管理jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成Web站点。

优势例举:
1)节省空间:对jar包做了统一管理、依赖管理,项目里无需存放jar包。
2)一键构建:自带tomcat,可以单独运行。
3)可跨平台:纯java开发。
4)应用在大型项目可提高开发效率:分模块开发。

Maven作用

依赖管理示例图:

image-20201102160124706

一键构建示例图:

image-20201102160417946

作用说明:

依赖管理:Maven工程中不直接将jar包导入到工程中,而是通过在pom.xml文件中添加所需jar包的坐标,这样就很好的避免了jar直接引入进来,在需要用到jar包的时候,只要查找pom.xml文件,再通过pom.xml文件中的坐标,到一个专门用于存放jar包的仓库(Maven仓库)中根据坐标从而找到这些jar包,再把这些jar包拿去运行。 

一键构建:构建指的是项目从编译、测试、运行、打包、安装,部署整个过程都交给Maven进行管理,这个过程称为构建。一键构建指的是整个构建过程,使用Maven一个命令可以轻松完成整个工作。

Maven仓库

img

仓库说明:

本地仓库:用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找,默认本地仓库位置在${user.dir}/.m2/repository,${user.dir}表示windows用户目录。

远程仓库:如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。

中央仓库:在Maven软件中内置一个远程仓库地址http://repo1.maven.org/maven2,它是中央仓库,服务于整个互联网,它是由Maven团队自己维护,里面存储了非常全的jar包,它包含了世界上大部分流行的开源项目构件。

Maven配置

image-20201102161541132

配置说明:

Maven仓库地址、私服等配置信息需要在setting.xml文件中配置,分为全局配置和用户配置。在Maven安装目录下的有conf/setting.xml文件,此setting.xml文件用于Maven的所有project项目,它作为Maven的全局配置。如需要个性配置,则需要在用户配置中设置,用户配置的setting.xml文件默认的位置在${user.dir}/.m2/settings.xml目录中,${user.dir}指windows中的用户目录。Maven会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。

Maven项目结构

image-20201102162043137

作为一个Maven工程,它的src目录和pom.xml是必备的。进入src目录后,我们发现它里面的目录结构如下:

image-20201102162130575

Maven常用命令

compile:是Maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出到target目录下。
test:是Maven工程的测试命令,mvn test,会执行src/test/java下的单元测试类。
clean:是Maven工程的清理命令,执行clean会删除target目录及内容。 
package:是Maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war包。
install:是Maven工程的安装命令,执行install将Maven打成jar包或war包发布到本地仓库。 

注意:当后面的命令执行时,前面的命令也都会自动执行。

Maven生命周期

Maven构建生命周期定义了一个项目构建到发布的过程。

1)三个内置的生命周期
Clean(清洁):在进行真正的构建之前进行一些清理工作。
Default(默认):构建的核心部分、编译、测试、打包、部署等等。
Site(网站):生成项目报告、站点、发布站点。

2)清洁生命周期:执行实际项目清理之前所需的流程
清洁(clean):删除以前构建生成的所有文件
后清洁(post-clean):执行完成项目清理所需的流程

3)默认生命周期
验证(validate):验证项目是否正确,所有必要的信息可用
编译(compile):编译项目的源代码
测试(test):使用合适的单元测试框架测试编译的源代码,这些测试不应该要求代码被打包或部署 打包(package):采用编译的代码,并以其可分配格式(如JAR)进行打包
验证(verify):对集成测试的结果执行任何检查,以确保满足质量标准
安装(install):将软件包安装到本地存储库中,用作本地其他项目的依赖项
部署(deploy):在构建环境中完成,将最终的包复制到远程存储库以与其他开发人员和项目共享

4)站点生命周期
预网站(pre-site):在实际的项目现场生成之前执行所需的进程
网站(site):生成项目的站点文档
后网站(post-site):执行完成站点生成所需的进程,并准备站点部署
网站部署(site-deploy):将生成的站点文档部署到指定的Web服务器

Maven依赖范围

在maven中使用scope元素设置依赖范围,依赖范围由强到弱的顺序是:compile、provided、runtime、test。

1)compile:编译范围,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
2)provided:provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用,provided依赖在编译和测试时需要,在运行时不需要,比如:servlet api被tomcat容器提供。
3)runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。
4)test:test范围依赖,在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以test范围依赖不会被打包。
5)system:system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中jar文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。

Maven依赖冲突

1)第一声明优先原则
<dependencies>
    <!-- spring-beans-4.2.4 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.2.4.RELEASE</version>
    </dependency>

    <!-- spring-beans-3.0.5 -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-spring-plugin</artifactId>
        <version>2.3.24</version>
    </dependency>
</dependencies>

2)路径近者优先原则

3)排除原则
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.3.24</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4)版本锁定原则
<properties>
    <spring.version>4.2.4.RELEASE</spring.version>
    <hibernate.version>5.0.7.Final</hibernate.version>
    <struts.version>2.3.24</struts.version>
</properties>

<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>
posted @ 2019-03-07 11:31  肖德子裕  阅读(629)  评论(0编辑  收藏  举报