1 Maven简介
Maven是Apache旗下的一个开源项目,是纯Java开发的一个项目管理工具,并且只是用来管理Java项目的。
1.1 Maven的好处
1)Maven项目占用容量小
同样的一个项目,如果是用Maven构建的话,项目的大小要小得多。(这是由于Maven项目没有Jar包,或者说它将Jar包统一托管了)
本地仓库一般起码有好几百M,随着你写的项目越来越多,本地仓库会越来越大。但是把Jar放在项目里面不就挺好的吗,为何还要多此一举来构建一个本地仓库呢,原因就是假设你当前的项目有上百个,如果有本地仓库的话,上百个项目只需要复用同一个Spring的核心包,而如果单独把Jar包放在某个项目里面,则重复的Jar包会有很多份。
2)依赖管理
顾名思义,Maven项目通过配置文件来指定本项目需要依赖于哪些包,然后编译运行项目的时候,去本地仓库相应的位置去拿过来用即可。
3)一键构建
进入Maven项目pom文件的所在目录,只需要执行一句mvn tomcat:run即可运行当前web项目。
构建过程完成了编译、测试(junit)、运行、打包、部署
4)可以跨平台(由于是Java开发的)
5)应用于大型项目,提高开发效率
假设现在以一个购物商城作为例子,里面涉及的模块很多,分别有用户管理、订单管理、支付管理... ... ... ...
订单管理、支付管理肯定都需要用到用户管理的信息,一般情况下,大型的项目都是由多个团队完成的,用户管理团队、订单管理团队、支付管理团队各做各的,用户管理编译好的Jar包,直接扔到公司的私库里面直接给其他团队使用即可,提高了分模块开发的效率。互联网项目按业务分模块,而传统项目按层(Dao、Service、Web)开发。
2 Maven安装、配置、仓库
2.1 下载安装Maven
下载网址:http://maven.apache.org/download.cgi
安装过程直接解压即可。
解压后的结构:
最主要是关注conf/settings.xml(Maven软件的核心配置)
2.2 maven的配置
1) 配置Maven环境变量
Maven环境变量配置,Maven 3.3.x 以上的版本Jdk都需要用到Jdk 1.7以上的版本。
将Maven的bin目录写到“我的电脑-右键属性-高级-环境变量-Path”里面:
添加Maven的Home目录(MVN_HOME)到系统变量,再添加$MVN_HOME/bin到Path
2) 配置Maven本地仓库目录
打开$MVN_HOME/conf/settings.xml
修改Maven本地仓库路径,改为以下路径。
2.3 Maven仓库
首先项目所依赖的Jar包会先去本地仓库找,如果在项目中配置有公司的远程仓库,会优先从公司的私服将Jar包放到本地仓库,如果公司的私服也没有的话,公司的私服会去中央仓库获取,然后这个Jar再给本地仓库。若公司没有私服,或者说项目没有配置私服,则会直接去中央仓库获取Jar包,放到本地仓库。
3 Maven项目结构与指令
3.1 Maven项目的目录结构
这里以一个hello-world的Maven项目为例
观察一下eclipse-hello-world项目-properties-java build path
3.2 Maven的常用命令
mvn clean —— “清理”,即清理target文件夹,编译好的文件,都会放在target里面
mvn compile —— "编译",执行编译命令,不会编译test目录下的Java文件,只会编译main目录下的Java文件
mvn test —— “编译测试”执行编译命令,编译test目录下的Java文件,并且会运行里面Junit的代码。
mvn package —— “打包” 会将对应的项目打包,Java项目打成Jar包、Web项目打包成war包,打包之后的包放在target目录下。
mvn install —— “发布项目到本地仓库” 就是将项目打包了之后再将对应的war包、jar包放入本地仓库,但是web项目打包成的war包放入本地仓库没什么用的,主要是将一些功能性的jar包放入本地仓库,方便其他程序后续调用。(执行install的时候,会执行compile、test、package)
tomcat:run —— “一键启动”
3.3 Maven生命周期与命令的关系
Clean生命周期 :clean
Default生命周期:compile test package install deploy(发布到私服)
Site 生命周期 :site 生成项目的描述(web类型)
实际上,生命周期里面的命令还有很多,常用的就上面这些(除了site)。而且不同的生命周期的命令可以同时执行。
例如:mvn clean package ,像这样也是正常执行的。
4 构建Maven项目
目前Maven项目应用广泛,eclipse、sts、IntellliJ IDEA均集成了Maven插件,所以几乎都不需要自己安装Maven插件。
1)添加自己的Maven
由于开发工具绑定的Maven可能不是最新的,下载最新的Maven,指定开发工具的Maven版本。
2)修改Maven配置
如果有自己的配置文件的话,可以自行指定。
3)创建Maven项目
这里本人使用的是STS(这是Spring提供的基于eclipse改造的开发工具),所以以STS为例来创建工程。
点击工具左上角File-New-Maven Project,创建Maven项目
点击Next >
打开工程的pom文件
这里会显示缺少了web.xml文件。web.xml文件需要自己手动创建,创建在webapp-WEB-INF目录下。
处理编译版本,在pom文件中添加以下代码,指定编译时候使用的jdk等。
<build>
<!-- 配置了很多插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
右键项目-maven update,然后发现项目的jdk版本变成了1.7。
接下来,创建Servelet程序
Finish之后,会发现一大堆错误,一个是因为没有Jar包,另一个错误是因为web.xml报错,它添加多了一个xmlns(删除重复
的即可)。接下来就是解决依赖的问题,到Maven的仓库中搜索Servlet,找到以下内容。
点击进去之后,能找到以下内容,复制dependency的代码到helloworld项目的pom文件中。
注意此处还需要添加<dependencies>标签,此时发现错误不见了,而且项目下多了一个Maven Dependencies。
然后点击项目-Run As-Maven build 输入tomcat:run,即可运行项目。
在STS命令行中,观察到以下情况,说明项目已经启动起来了。
最后在浏览器中输入http://localhost:8080/hello-world(若无法显示以下效果,可以看下web.xml中是否进行了servlet的
相关配置),效果如下:
5创建父/子工程
5.1创建Maven父工程
一个大型的项目常常会有很多个模块,而每个模块又是单独的一个工程,例如一个大型的商城,很有可能就会分为用户管理模块、商品管理模块、订单管理模块等等,一个团队就负责一个模块,最后这些模块汇总起来就是一个大型的应用了,而这些模块之间可能都需要一些共同的配置,例如使用一些公用的框架,工具类等等,这些通用的框架或者说工具类就可以定义在父工程中供所有子工程使用,又或者说某个子工程中定义了一些实体类,这些实体类可能在其他的子工程中也会用到,这时候用父工程将这些子工程囊括起来,架构就变得十分清晰了。
下面说明如何建立一个Maven的父工程
1)指定working set
2)输入坐标等信息,指定Packaging为pom(父工程需要将Packaging设为pom)
3)父工程创建完毕,在pom文件中添加公用的Jar等信息
假设子工程全都是Spring Boot的工程,则添加以下依赖。
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>szu.vander</groupId>
<artifactId>shopping-center-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>shopping-center-parent</name>
<description>The parent project on shopping center</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<modules>
<module>users-admin</module>
<module>products-admin</module>
<module>order-admin</module>
</modules>
</project>
5.2创建Maven子工程
5.1中已经完成了父工程的创建,接下来是子工程的创建。
1)添加子工程
在父工程中的pom文件的OverView中找到Modules,选择Create…
2)新建Maven Module
点击“Next>”之后输入Name和description,然后点击Finish,完成模块的添加,实际上这里添加的模块也相当于
是一个工程。
create module完了之后,STS会自动将刚刚添加的模块以Project的形式导入到相应的working set底下,
如下所示:
最后各个团队就可以使用共同的库完成各自的开发工作了。
最后关于本节所用到的源码,有需要的小伙伴可以到https://download.csdn.net/download/vander1991/10274700下载。