1 Maven概述
引入案例:idea创建javaWeb项目,如何打包并发布tomcat上去,以便于客户端访问?
方案一:DOS命令完成打包,操作性不方便,代码频繁修改,频繁使用命令打包一阶段可以打包,才可以提供给其他人使用,怎么打包?
eclipse集成打包命令
.jar -cvf tt.jar 方案二:使用专业的项目管理工具,完成项目生命周期的管理工作
maven
1 项目生命周期管理
2 管理资源(jar包)
传统方式:
2-1 拿到jar包
2-2 导入项目中
2-3 使用jar
1、什么是Maven
Maven的含义:Maven项目对象模型(Project Object Model),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行。因为大部分的工程配置操作都非常简单并且可复用,在创建报告、检查、构建和测试自动配置时,Maven 可以让开发者的工作变得更简单。
Maven的优势:自动构建,jar包依赖管理,契约编程
a、Maven的依赖管理
常规的JAVAWEB项目开发过程,导包确实是一个比较痛苦的过程。特别是我们导入一个功能jar包,而它又依赖于其它的jar包【天啊,我怎么知道有哪些依赖包】,靠死记硬背,即花时间又没有太大的意义,而Maven完美的解决了这个问题,我们只需要导入功能包,它会为我们自动把对应的依赖包导入。
不过使用maven导包需要我们进行相应的xml配置(pom.xml),好吧,对初学者来说这个xml配置看起来也确实是比较麻烦,不过大家不用担心。等你学了Maven的仓库,一切都会变得简单起来。
b、项目的一键构建
使用Maven可以为我们完成很多相应的功能:清理代码,自动编译,完成测试,生成站点报告,进行打包(jar,war),项目部署。
1. 清理代码:相当于我们运行clear的效果
2. 自动编译:可以为咱们自动完成编译(类似于执行javac生成class文件)
3. 完成测试:实现测试功能,帮咱们完成
4. 生成报告:可以较为方便的实现对项目的管理
5. 打包:普通项目打jar包,web项目打成war包
6. 项目部署:只需要一句命令mvn jetty:run即可实现项目的部署
注意:使用jetty:run命令必需有相应的配置与插件(Maven的命令很多,但不是你想用,想用就能用,有一些命令是需要有插件的)
2 安装maven
1、Maven的下载
到Maven官网去下载Maven的安装软件。网址:http://maven.apache.org/
点击Download进入下载页面,目前最新的版本为3.8.1,我们下载解压版Maven
2、Maven的安装
Maven下载后,将Maven解压到一个没有中文没有空格的路径下。解压后目录结构如下:
目录解释:bin:存放了maven的命令boot:存放了一些maven本身的引导程序,如类加载器等conf:存放了maven的一些配置文件,如setting.xml文件lib:存放了maven本身运行所需的一些jar包
3、配置Maven环境变量
Maven解压后还需要为Maven配置环境变量才能使用,配置方式如下:
环境变量名称:MAVEN_HOME
环境变量值:Maven安装包的解压路径
在环境变量Path中输入Maven环境变量名称:%MAVEN_HOME%\bin
4、测试Maven
通过上面的三步配置后Maven的安装就完成了,下面我们来测试Maven是否安装成功,在命令行中输入mvn -v查看Maven版本信息
3、Maven仓库配置
1、Maven仓库分类
maven的工作需要从仓库下载一些jar包,如下图所示,本地的项目A、项目B等都会通过maven软件从远程仓库(可以理解为互联网上的仓库)下载jar包并存在本地仓库,本地仓库 就是本地文件夹,当第二次需要此jar包时则不再从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载了。
下图描述了maven中仓库的类型:
本地仓库 :用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。默认本地仓库位置在 {user.dir}/.m2/repository,{user.dir}表示windows用户目录。远程仓库:如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。中央仓库 :在maven软件中内置一个远程仓库地址http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由Maven团队自己维护,里面存储了非常全的jar包,它包含了世界上大部分流行的开源项目构件。
2、本地仓库配置
我们在使用maven时需要将远程仓库中的jar下载到本地仓库才能在项目中使用。所以要先配置本地仓库。本地仓库就是一个文件夹。
配置步骤:
a、新建一个文件夹repository
b、修改maven配置文件
全局 setting 与用户 setting
maven 仓库地址、私服等配置信息需要在 setting.xml 文件中配置,分为全局配置和用户配置。在 maven 安装目录下的有 conf/setting.xml 文件,此 setting.xml 文件用于 maven 的所有 project项目,它作为 maven 的全局配置。如需要个性配置则需要在用户配置中设置,用户配置的 setting.xml 文件默认的位置在:{user.dir}/.m2/settings.xml 目录中,{user.dir} 指 windows 中的用户目录。maven 会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。
设置本地仓库位置
找到maven解压目录中的maven-3.8.1\conf\settings.xml配置文件
打开settings.xml文件修改如下配置:
设置默认远程仓库地址
Maven默认使用的是maven的中央仓库(在国外),也就是项目中需要jar包时,都要从国外的服务器上下载到本地仓库中,速度很慢。国内针对这种情况也做了maven仓库的镜像服务器
国内Maven镜像地址:
开源中国:
<mirror><id>nexus-osc</id><mirrorOf>*</mirrorOf><name>Nexus osc</name><url>http://maven.oschina.net/content/groups/public/</url>
</mirror>阿里:
<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
一般我们都使用阿里的maven镜像服务器
打开settings.xml文件修改如下配置:
4、Maven 工程的目录
1、maven工程的目录
普通java项目,控制台项目
maven的项目有着严格的结构,不可以乱写。 maven工程的目录结构如下
作为一个maven工程,它的src目录和pom.xml是必备的。进入src目录后,我们发现它里面的目录结构如下
src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
src/test/java —— 存放所有单元测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置,编译后的class文件会输出到此目录
pom.xml——maven项目核心配置文件
注意:如果是普通的java项目,那么就没有webapp目录。
5、IDEA创建Maven项目
1、idea配置maven
虽然目前在idea中都集成了Maven插件,但是idea集合的mavne版本和我们自己安装的版本不一样,需要为idea指定maven的版本。
解决创建新项目时,maven配置不起作用的问题
2、创建Maven控制台工程
3、导入jar坐标
maven项目和普通项目最大的不同点就在于jar包的管理上,普通项目的jar是由程序员手动将所需要的jar导入到项目中,而maven项目是在pom.xml中通过坐标的方式将所需的jar包从网络上下载到maven的本地仓库中存储,然后项目通过maven调用本地仓库中的jar包。那么问题来了,我们怎么知道jar包的坐标是多省,在实际开发中我们会访问maven的资源网站来查找,比如我们要查找mysql的驱动包
网址:http://mvnrepository.com/
在项目的pom文件中粘贴复制好的jar包坐标,保存后maven会自动将所需jar包下载到本地仓库中
4、idea创建javaWeb项目
-
选择项目模板:Java Enterprise
-
选择javaWeb版本
-
javaWeb项目结构:
6、Maven常用命令
1、compile 编译
compile 是 maven 工程的编译命令,
mvc:compile 会将 src/main/java 下的文件编译为 class 文件输出到 target目录下。
cmd 进入命令状态,执行 mvn compile,如下图提示成功:
查看 target 目录,class 文件已生成,编译完成
2、test
test 是 maven 工程的测试命令
mvn test,会执行 src/test/java 下的单元测试类。
cmd 执行 mvn test 执行 src/test/java 下单元测试类,下图为测试结果,运行 1 个测试用例,全部成功。
3、clean
clean 是 maven 工程的清理命令,执行 clean 会删除 target 目录及内容 删除上一次编译结果
可以看到 target 目录被删除了
4、package
package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包,生成的jar包或war包在项目的target目录中
5、install
install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。从运行结果中,可以看出:当后面的命令执行时,前面的操作过程也都会自动执行。
生命周期 【理解】
Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
- default(或 build):项目部署的处理
- site:项目站点文档创建的处理
clean -> 编译compile -> test -> 打包package -> install安装 -> 部署deploy
- package:会把打好的jar包放在target目录,不会把打好的jar包部署到本地maven仓和远程maven私仓。
- install:会把打好的jar包部署到本地maven仓,但不会部署到远程maven私仓。
- deploy:会把打好的jar包部署到本地maven仓和远程maven私仓。
maven工程版本问题
当我们创建一个maven工程后,发现pom文件的()节点中会带上一个SNAPSHOT。
maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本。
我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次。我们知道,maven的依赖管理是基于版本管理的,对于发布状态的artifact,如果版本号相同,即使我们内部的镜像服务器上的组件比本地新,maven也不会主动下载的。如果我们在开发阶段都是基于正式发布版本来做依赖管理,那么遇到这个问题,就需要升级组件的版本号,可这样就明显不符合要求和实际情况了。但是,如果是基于快照版本,那么问题就自热而然的解决了,而maven已经为我们准备好了这一切。
2、控制台程序打jar包,需要使用java -jar执行,需要配置插件
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.woniu.Person</mainClass></transformer></transformers></configuration></execution></executions>
</plugin>