当前位置:   article > 正文

SSM框架自学(四)——Maven项目管理工具快速入门_ssmao.tv

ssmao.tv

前言:最初Java SSM搭建Web项目时,采用的是比较繁琐的手动导入jar包的形式,我们得去对应官网上到处找各种jar包,然后下载好导入自己项目的lib目录中。下面就是一个最简单的SSM项目所需的jar包就有27个:

难到每次我们搭建SSM项目都得这样麻烦到处找jar包导入?简直不能忍!!!

于是,一个神奇的项目管理工具Maven就诞生了,Maven不仅可以帮我们构建项目,而且可以帮我们自动下载jar依赖包并引用。

一、Maven简介

1、Maven的概念

Maven是跨平台的项目管理工具,是 Apache 下的一个纯 Java 开发的开源项目,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。基于项目对象模型(POM)概念,Maven通过一小段描述信息来对项目进行构建和依赖jar包管理。

Maven的核心功能便是合理叙述项目的依赖关系,就是通过pom.xml文件的配置就能获取jar包,而不用开发者手动去添加jar包。通俗点讲就是,想用什么jar包,直接填写在pom.xml配置文件中,Maven就会自动帮我们下载jar包到工程中,我们还能通过配置让jar包时刻保持最新版本。

IDEA自带有Maven插件,下面是新建的一个Maven项目,我们可以发现在项目的根目录下有一个Pom.xml文件:

pom.xml文件的作用

POM(Project Object Model)作为项目对象模型,用于描述工程信息和依赖信息,并且定义构建过程中的操作。该文件为maven构建项目流程中最重要的文件,虽然默认情况下文件内容很少,只描述了工程的坐标信息,那是因为一切构建操作都是按照约定进行执行的,即约定优于配置(Convention Over Configuration)。

简而言之,通过在pom.xml中配置jar坐标,Maven项目就会自动下载jar包并引用。

我们可以在pom.xml中配置所需的jar坐标,然后maven就会优先从本地仓库中查找,如果工程依赖的jar包本地仓库没有,就会从远程仓库下载。我们没有指定私服或者第三方仓库的话,会默认从maven官方提供的服务器(中央仓库)下载jar包。

2、Maven的作用

2.1项目构建
      项目构建过程包括清理项目、编译项目、测试项目、生成测试报告、打包项目、部署项目,这六个步骤就是 一个项目的完整构建过程。理想的项目构建是高度自动化、跨平台、可重用的组件,是标准化的,使用maven就可以帮我们自动化(一键操作或Maven命令行)完成上述所说的项目构建过程。

2.2高效的依赖管理
依赖指的是项目对jar包的依赖,包括jar包之间的相互依赖。比如我们搭建一个Spring MVC的开发框架时,光有myapp-1.0-SNAPSHOT.jar这个jar包是不行的,myapp-1.0-SNAPSHOT.jar还依赖其他的jar包。依赖管理指的是使用maven来管理项目中使用的jar包,maven管理的方式就是自动下载项目所需要的jar包,统一管理jar包之间的依赖关系。

a、首先帮我们下载jar包 
maven项目的根目录下会有一个 pom.xml文件, 在这个文件里面只要添加相应配置,他就会自动帮我们从互联网上的仓库中下载相应jar包,不用我们铺天盖地的到处搜索需要的jar包了 。下面是示范的项目对象模型配置文件pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.hs</groupId>
  6. <artifactId>SSMTest</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9. <dependencies>
  10. <dependency>
  11. <groupId>junit</groupId>
  12. <artifactId>junit</artifactId>
  13. <version>4.12</version>
  14. <!-- 指定范围,在测试时才会加载 -->
  15. <scope>test</scope>
  16. </dependency>
  17. <!-- java ee -->
  18. <dependency>
  19. <groupId>javax</groupId>
  20. <artifactId>javaee-api</artifactId>
  21. <version>7.0</version>
  22. </dependency>
  23. <!-- mybatis/spring整合包 -->
  24. <dependency>
  25. <groupId>org.mybatis</groupId>
  26. <artifactId>mybatis-spring</artifactId>
  27. <version>1.3.1</version>
  28. </dependency>
  29. </project>

以上主要看的<dependencies>结点里面的内容,里面每配置一个<dependency>

  <groupId>org.mybatis</groupId>// 表示公司或组织,一般是域名的反写
  <artifactId>mybatis-spring</artifactId> //项目名
  <version>1.3.1</version> //所需jar的版本

这三个字段就组成了jar的坐标。在maven的世界中,对所有依赖jar包的引用都是通过坐标完成的,也就是使用GAV(GroupId,ArtifactId,Version)来进行定位。

简而言之,maven是通过惟一的jar坐标从互联网上的代码仓库中下载相应jar包。

b、 自动寻找jar包的依赖并下载
寻找jar包是第一基本功能,寻找依赖在这个是在这个基础上的功能。 
在maven中,每一个jar包也有自己的 pom.xml文件,而这个文件里面也会有<dependency>配置,什么依赖范围我就不细说了,我想表达的就是,只要你配置的jar包所依赖的其他jar包都会被maven自动下载下来。 
例如: 你配置了

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-core</artifactId>
  4. <version>2.6</version>
  5. </dependency>

你要maven帮你下载spring-core-2.6.jar包 ,而这个jar包里面需要用到commons-logging.jar这个包, 这叫就依赖。spring-core-2.6.jar依赖于commons-logging.jar。

2.3相同的项目结构和jar包版本

  •  有一个pom.xml 用于维护当前项目都用了哪些jar包

  •  所有的java代码都放在 src/main/java 下面

  •  所有的测试代码都放在src/test/java 下面

Maven 提供了一种标准的项目目录结构并且只要公司里面的每个成员的项目根目录下的pom.xml一致,那么大家都是用的相同的jar版本,有利于团队开发和维护。

3、Maven仓库的概念

前面已经提到,通过pom.xml中的配置,就能够获取到想要的jar包(还没讲解如何配置先需要了解一下仓库的概念),但是这些jar是在哪里呢,也就是我们从哪里获取到的这些jar包?答案就是仓库。

所谓的仓库就是用于存放项目需要的jar包的,maven项目可以从仓库中获取所需jar包

仓库分为两种,本地仓库和远程仓库,远程仓库又包括中央仓库、私服和第三方公共库如阿里云公共仓库。

本地仓库 :位于自己计算机中的仓库,用来存储从远程仓库下载的jar 包。项目使用的 jar 包会优先从本地仓库查找,每次写项目,我们就可以直接通过Maven项目的pom.xml文件直接从本地仓库里拿就行了。

远程仓库:需要联网才可以使用的仓库。如果项目需要插件或者 jar 包,本地仓库没有,就会去远程仓库下载。 远程仓库可以在互联网内也可以在局域网内。私服一般在内网中便可以使用,但是第三方公共库和中央仓库则需要外网的支持。

4、Maven远程仓库的分类

中央仓库 :由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置,在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。工程依赖的jar包如果本地仓库没有,默认从中央仓库下载。

中央仓库包含了这个世界上绝大多数流行的开源Java构件,以及源码、作者信息、SCM,信息、许可证信息等,每个月这里都会接受全世界Java程序员大概1亿次的访问,它对全世界Java开发者的贡献由此可见一斑。

第三方公共仓库:maven 会默认从maven官方提供的服务器下载jar包。而官方服务器在国外,因为大家都知道的原因,网速很慢,而且容易卡断。 为了便于快速下载相关jar包,可以使用国内maven 阿里云的下载地址:

打开Maven安装位置目录下conf\settings.xml,然后在<mirrors>节点下下新加一个阿里云的镜像地址:

  1. <!--阿里云的镜像地址,因为公共仓库在国外下载贼慢-->
  2. <mirror>
  3. <id>alimaven</id>
  4. <mirrorOf>central</mirrorOf>
  5. <name>aliyun maven</name>
  6. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  7. </mirror>

私服: 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。因此,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。

私服的好处:

     a.节省自己的外网速度

     b.加速Maven构建

     c.部署第三方构建

     d.提高稳定性,增强控制

     e.降低中央仓库的负荷

一般是由公司自己设立的,公司统一将需要的jar包从远程仓库下载到私服上,只为本公司内部共享使用。既可作为公用类库镜像缓存,减少在外部访问和下载的频率;也可以作为公司内部构件协作和存档,这样能保证项目开发时所需要用到的jar都从该局域网仓库中拿,每个人的版本就都一样。私服可以使用的是局域网,中央仓库必须使用外网。

注意:连接私服,需要单独配置。如果没有配置私服,默认不使用。    

二、idea下创建Maven项目

Intellij IDEA是自带有Maven插件的(不需要按照网上那些博客说的需要先下载maven),我们只需要配置一下就可以。

1、修改Maven本地仓库地址和使用阿里云公共仓库

默认本地仓库位置为C:\Users\用户名\.m2\repository,如果不更改仓库就会占用C盘空间,而且重装系统就都没有了,所以

一般我们会修改本地仓库位置。

首先自己创建一个文件夹 :   D:\Maven\repository

然后把Maven的coifig目录下的setting.xml也复制过来,因为它里面的大都是注释着的,我们可以直接改成下面这样:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
  5. http://maven.apache.org/xsd/settings-1.0.0.xsd">
  6. <!--指定本地仓库目录-->
  7. <localRepository>D:/maven/repository</localRepository>
  8. <mirrors>
  9. <mirror>
  10. <!--该镜像的id-->
  11. <id>nexus-aliyun</id>
  12. <!--该镜像用来取代的远程仓库,central是中央仓库的id-->
  13. <mirrorOf>central</mirrorOf>
  14. <name>aliyun maven</name>
  15. <!--该镜像的仓库地址,这里是用的阿里的仓库-->
  16. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  17. </mirror>
  18. </mirrors>
  19. </settings>

通过上面配置,我们更改了本地仓库位置用来存储从远程仓库下载的jar包,还添加了<mirror>镜像,使用阿里云下载路径代替中央仓库,下载速度会快很多,这样我们的maven项目会从阿里云公共仓库中下载一个拥有相对完整的所有jar包的结合到本地仓库中。每次我们写项目的时候,我们的maven项目就可以优先从本地仓库中获取jar包,特别方便。如果本地仓库还缺一些jar包,只要我们已经在pom.xml中添加了jar坐标的<dependency>配置,maven就会自动从阿里云远程仓库下载到本地,就很棒!!!

最后一步,修改Maven设置:

注意:idea中的File-->Settings...和File-->Other Settings--> Settings for New Project...分别是对当前项目的配置(只对当前项目有效)和全局配置(对IDEA打开的以及后面新建的项目的全局配置),对Settings for New Project的设置可以避免每次新建或者打开一个项目需要重新配置的情况,比如对Maven的配置。

我们希望所有项目maven位置都改变为如上设置所以,我们选择Other Settings--> Settings for New Project...,可以避免每次创建Maven项目都要在创建时重新配置一次。

2、创建Maven项目举例

a、New——>project

b、选择Maven——>org.apachecocoon-22-archetype-webapp,别选错啦!

c、此处填写的为项目的坐标,完成对此工程的表述。也就是说我们的项目也可以打包部署到maven仓库中让别人引用,这在Android Stduio中开发安卓APP比较常见,只要在设置文件build.gradle中写好Maven仓库的URL地址,就可以添加各种compile依赖,比如 compile 'com.android.support:recyclerview-v7:25.4.0',你看他里面拆开看就是一个项目坐标。

d、下面已经不用配置了,因为我们已经在全局配置进行了Maven相关设置,直接finish就开始创建了

不过要注意的是,第一次创建maven骨架比较慢,请耐心一点点。。。因为首使用时,会需要下载archetype webapp的插件

e、最后创建成功,看看默认的Maven webapp目录结构

默认目录结构:webapp 是默认没有 java 源文件也没有 test 目录的,还缺少resource资源目录,如果要开发SSM项目需要我们手动创建。

注意右下角有个Maven导入jar包的设置:每次修改 pom.xml文件,这个提示弹框都会出现提示我们添加依赖

Import Changes Enable Auto-Import:每次手动点击导入我们新添加的依赖包

Enable Auto-Import:以后更改 pom.xml 文件会自动导入依赖包

我们可以自动导入,省掉麻烦。如果想要取消自动导入依赖也可以设置一下。

3、Maven Archetype

archetype的意思就是原型的意思,准确说是一个Maven项目模板,我们可以根据该模板来创建项目。

maven提供的41个骨架原型分别是:

1: appfuse-basic-jsf (创建一个基于Hibernate,Spring和JSF的Web应用程序的原型)
2: appfuse-basic-spring(创建一个基于Hibernate,Spring和Spring MVC的Web应用程序的原型)
3: appfuse-basic-struts(创建一个基于Hibernate,Spring和Struts 2的Web应用程序的原型)
4: appfuse-basic-tapestry(创建一个基于Hibernate,Spring 和 Tapestry 4的Web应用程序的原型)
5: appfuse-core(创建一个基于Hibernate,Spring 和 XFire的jar应用程序的原型)
6: appfuse-modular-jsf(创建一个基于Hibernate,Spring和JSF的模块化应用原型)
7: appfuse-modular-spring(创建一个基于Hibernate, Spring 和 Spring MVC 的模块化应用原型)
8: appfuse-modular-struts(创建一个基于Hibernate, Spring 和 Struts 2 的模块化应用原型)
9: appfuse-modular-tapestry (创建一个基于 Hibernate, Spring 和 Tapestry 4 的模块化应用原型)
10: maven-archetype-j2ee-simple(一个简单的J2EE的Java应用程序)
11: maven-archetype-marmalade-mojo(一个Maven的 插件开发项目 using marmalade)
12: maven-archetype-mojo(一个Maven的Java插件开发项目)
13: maven-archetype-portlet(一个简单的portlet应用程序)
14: maven-archetype-profiles()
15:maven-archetype-quickstart()
16: maven-archetype-site-simple(简单的网站生成项目)
17: maven-archetype-site(更复杂的网站项目)
18:maven-archetype-webapp(一个简单的Java Web应用程序)
19: jini-service-archetype(Archetype for Jini service project creation)
20: softeu-archetype-seam(JSF+Facelets+Seam Archetype)
21: softeu-archetype-seam-simple(JSF+Facelets+Seam (无残留) 原型)
22: softeu-archetype-jsf(JSF+Facelets 原型)
23: jpa-maven-archetype(JPA 应用程序)
24: spring-osgi-bundle-archetype(Spring-OSGi 原型)
25: confluence-plugin-archetype(Atlassian 聚合插件原型)
26: jira-plugin-archetype(Atlassian JIRA 插件原型)
27: maven-archetype-har(Hibernate 存档)
28: maven-archetype-sar(JBoss 服务存档)
29: wicket-archetype-quickstart(一个简单的Apache Wicket的项目)
30: scala-archetype-simple(一个简单的scala的项目)
31: lift-archetype-blank(一个 blank/empty liftweb 项目)
32: lift-archetype-basic(基本(liftweb)项目)
33: cocoon-22-archetype-block-plain([http://cocoapacorg2/maven-plugins/])
34: cocoon-22-archetype-block([http://cocoapacorg2/maven-plugins/])
35:cocoon-22-archetype-webapp([http://cocoapacorg2/maven-plugins/])
36: myfaces-archetype-helloworld(使用MyFaces的一个简单的原型)
37: myfaces-archetype-helloworld-facelets(一个使用MyFaces和Facelets的简单原型)
38: myfaces-archetype-trinidad(一个使用MyFaces和Trinidad的简单原型)
39: myfaces-archetype-jsfcomponents(一种使用MyFaces创建定制JSF组件的简单的原型)
40: gmaven-archetype-basic(Groovy的基本原型)
41: gmaven-archetype-mojo(Groovy mojo 原型)

常用Archetype:

1,maven-archetype-quickstart

默认的Archetype(也就是和创建maven项目时不勾选的archetype直接创建一样的目录结构),基本内容包括:

  •  一个包含junit依赖声明的pom.xml

  •  src/main/java主代码目录及一个名为App的类

  •  src/test/java测试代码目录及一个名为AppTest的测试用例

2,maven-archetype-webapp 

一个最简单的Maven war项目模板,当需要快速创建一个Web应用的时候可以使用它。生成的项目内容包括:

  •     一个packaging为war且带有junit依赖声明的pom.xml

  •  src/main/webapp/目录

  •  src/main/webapp/index.jsp文件

  •  src/main/webapp/WEB-INF/web.xml文件

三、Maven主要的生命周期(lifecycle)

1、Maven主要具有以下生命周期阶段(phase),注意:goals 由生命周期阶段组成。

validate- 验证项目的正确性以及所有必要的信息是否可用

compile- 编译项目源代码

test- 测试编译的测试代码

package- 对编译的代码进行打包并发布

verify- 对集成测试进行检查以保证满足质量标准

install- 安装包到本地仓库,用于本地其他项目的依赖

deploy- 在构建环境中,将最终打包的文件复制到远程仓库当中用于和其他开发者和项目进行分享。

最好看看这篇博客,很短:maven 中的 goal 是什么

IDEA自带有Maven,并且只要点击就可以下载好执行各大生命周期的插件,完全可以代替传统的Maven命令行。

2、maven命令package、install和deploy的联系与区别

我们在用maven构建java项目时,最常用的打包命令有mvn package、mvn install、mvn deploy,这三个命令都可完成打jar包或war的功能,但这三个命令还是有区别的:

  • mvn package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

  • mvn install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库

  • mvn deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

四、主流的构建工具

Ant:提供编译,测试,打包

Maven:在Ant的基础上提供了依赖管理和发布的功能

Gradle:在Maven的基础上使用Groovy管理构建脚本,不再使用XML来管理,目前主要是Android Studio的御用构建工具。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/153682
推荐阅读
相关标签
  

闽ICP备14008679号